Arkadaşlar merhaba 18f2431 ile blcd kontrolü yapmak istiyorum kodum aşağıdaki gibi fakat 3 faz arası açıyı nasıl ayarlayabılırım hangi register bunu ayarlamamı sağlıyor ?
#include <18F2431.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device adc=10;
//#define OSC_8MHZ
//#use delay(clock=20000000)
#fuses H4,NOWDT,NOMCLR //Frequency = Fosc / (4 * (period+1) *prescale)
#use delay(clock=40000000)
/*
unsigned int16 sin_tabletbir[26]={10, 28, 45, 62, 78, 94, 107, 120, 131, 140, 147, 153, 156, 157, 156, 153, 147, 140, 131, 120, 107, 94, 78, 62, 45, 28};
unsigned int16 sin_tabletiki[26]={10, 28, 45, 62, 78, 94, 107, 120, 131, 140, 147, 153, 156, 157, 156, 153, 147, 140, 131, 120, 107, 94, 78, 62, 45, 28};
unsigned int16 sin_tabletuc[26]={10, 28, 45, 62, 78, 94, 107, 120, 131, 140, 147, 153, 156, 157, 156, 153, 147, 140, 131, 120, 107, 94, 78, 62, 45, 28};
*/
int8 bir = 0;
int8 iki = 0;
int8 uc = 0;
int16 zaman = 0;
void main ()
{
//setup_power_pwm_pins(PWM_FREE_RUN ,PWM_OFF,PWM_OFF,PWM_OFF);
//setup_power_pwm(PWM_CLOCK_DIV_128|PWM_FREE_RUN,1,0,200,0,1,0);
//setup_power_pwm_pins(PWM_OFF,PWM_OFF,PWM_COMPLEMENTARY,PWM_OFF);
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEMENTARY,PWM_COMPLEMENTARY);
setup_power_pwm(PWM_CLOCK_DIV_128|PWM_FREE_RUN| PWM_DEAD_CLOCK_DIV_16,1,0,40,0,1,60);
//set_power_pwm0_duty(159); //8 başla 159 cihazda 26 tablo var
//setup_timer_0(T0_INTERNAL |T0_DIV_1);
//enable_interrupts(INT_TIMER0); // int_timer0 kesmesini aktif yaparl
setup_timer_1(T1_INTERNAL |T1_DIV_BY_1);
enable_interrupts(INT_TIMER1); // int_timer0 kesmesini aktif yaparl
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
set_tris_a(0b00000000); // RA0 ucu giriş olarak ayarlandı.
set_tris_b(0b00000000); // RB0 portu tümüyle çıkış olarak ayarlandı.
set_tris_c(0b00000000); // RB0 portu tümüyle çıkış olarak ayarlandı.
output_b(0x00);
output_c(0x00);
delay_ms(100);
basla:
goto basla;
}
#INT_TIMER1
void timer0_kesme () // Kesme fonksiyonu ismi
{
set_timer1(60000);//64820
set_power_pwm0_duty(85); //3100
set_power_pwm2_duty(85); //3100
set_power_pwm4_duty(85); //3100
/*
set_power_pwm0_duty(sin_tabletbir[bir]); //3100
set_power_pwm2_duty(sin_tabletiki[iki]); //3100
set_power_pwm4_duty(sin_tabletuc[uc]); //3100
bir++;
if(bir>25)
{
bir=0;
}
iki++;
if(iki>25)
{
iki=0;
}
uc++;
if(uc>25)
{
uc=0;
}
*/
}
Motorun sensörlü mü? sensörsüz mü?
Yazılımla kafana göre açı ayarlayamazsın. Datasheet 197.sayfaya bakarsan sensörlerden ya da BEMF'den gelen sinyalleri nasıl okuyup çıkışları nasıl yönlendireceğini tablolarla göstermiş.
OVDCOND ve OVDCONS ile halledilebilir.
18F2431 için bunların kullanılmadığını yazıyor ama ben sanki kullandığımı haztırlıyorum. Eve geçince bir daha bakarım.
Motorumda sensör yok dırek bır adc okutarak frekansı ayarlamak ıstıyorum
Sensor yoksa sensorless kontrol yapısını bakman lazım(BEMF). BEMF ile aldığın komutasyonlara göre bahsettiğim register ile çıkış komutasyonlarını ayarlayabilisin. Yani kafadan açı ayarlamazsın
Sensörsüz kontrol için linke bak güzelce anlatmış adam.
http://www.avislab.com/blog/brushless04/ (http://www.avislab.com/blog/brushless04/)
Açıkcası sunu anlayamadım register le ayarlamadan dırek olarak faz farkını nasıl yapıyorlar
setup_power_pwm(PWM_CLOCK_DIV_64|PWM_FREE_RUN| PWM_DEAD_CLOCK_DIV_2,1,10000,40,10000,1,50);
buradaki 10000 değeri mi bu farkı yapıyor acaba ?
linkte arduino ile yapılmış sensörsüz bldc motor sürücü devresi var. size fikir verebilir.
https://simple-circuit.com/arduino-sensorless-bldc-motor-controller-esc
ovdcons registerine hangi fonksiyonun erişiyorsa onunla yapılıyor. Ben CCS C bilmiyorum. Sadece genel mantığından bahsettim sana. O fonksiyonun argüman tanımlarını yazabilirsen belki yardımcı olabilirim.