pwm register sıfırlamak

Başlatan bulut_01, 23 Kasım 2013, 21:20:05

bulut_01

iyi aksamlar picproje ailesi sorunum register atadıgım değer çalısmaması örnekde verdiğim kodu kısa halini register ile halledemedim yardımlarınız için simdiden saolun.

çalıştıramadıgım kod burda önce pwm kanallarını sıfırlamak sonra istenilen kanalı aktif etmek burdaki PWMCON0 register çalışmıyor
case 0b00000101:
OUTPUT_B(0x00);
#byte PWMCON0=0b00000111;

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);
break;


buda uzun hali istemediğim durum.

case 0b00000101:
OUTPUT_B(0x00);
set_power_pwm0_duty(duty1=0);
set_power_pwm2_duty(duty2=0);
set_power_pwm4_duty(duty3=0);


set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);
break;
YENİLMEZ..

pwm.c

programın en başında PWMCON0 registerinin bellekteki adresini tanımlaman gerekiyor. daha sonra değer ataması yapabilin.
ilgili adresleri kullandığın pic'in  .inc dosyasından bakıp bulabilirsin.
örneğin böyle:
#byte PWMCON0 = 0x0F86
#byte PWMCON1 = 0x0F85
///
///
///
PWMCON0=0b00000111;

registere vereceğin değerleride datasheete bakarak öğrenebilirsin.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

bulut_01

18f1330 katalog baktım pwm register hepsine baktım pwm sıfırlayıp case döngüsüne göre herhangi pwm portuna çıkış veriyorum ama register atadıgım değer ile pwm DURDURAMADIM bir türlü nasıl yaparım ? sorunum OVDCONS registerdeki atadıgım değer ile pwm sıfırlayamıyorum.

switch (hall)
{
case 0b00000101:
OUTPUT_B(0x00);
#byte OVDCONS=0x0f82
OVDCONS=0b00111111;

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);
break;

case 0b00000100:
OUTPUT_B(0x00);
#byte OVDCONS=0x0f82
OVDCONS=0b00111111;

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b6); 
break;
YENİLMEZ..

pwm.c

Arkadaşım, #byte  tanımlamalarını heryere yazmana gerek yok. programın başına 1 kere ekle yeterli.
pwm çıkışlarını OVDCONS registeri kapatmıyor. #byte PWMCON0 = 0x0F86 tanımlamasını yapıp PWMCON0=0b00000111; değerini yükleyince oluyor, yoksa programında mantık hatası vardır.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

bulut_01

PWMCON0=0b00000111;         değerin yazıyorum kapatıyor burda sorun yok 

set_power_pwm0_duty(duty1=P*64); buradan set edip pwm açmıyor benım sorunum  yukardakı satır varken çalışmaması.
YENİLMEZ..

bulut_01

Alıntı yapılan: bulut_01 - 24 Kasım 2013, 19:53:51
PWMCON0=0b00000111;         burda kapanan pwm aşagıdaki satırla neden pwm açılmıyor arkadaslar ?

set_power_pwm0_duty(duty1=P*64);
YENİLMEZ..

pwm.c

OVDCOND registeri pwm çıkışlarını kapatabiliyor. OVDCONS ise kapattığın kanalları set ediyor.
set_power_pwm0_duty(); fonksiyonu malesef kapalı kanalı aktif etmiyor. CCS içindeki tüm fonksiyonları denedim ama olmadı. OVDCOND=0x00; ile kapattığın kanalları tekrar OVDCOND=0xFF; ile açman gerekiyor.
eğer bu kanalları tek tek kontrol etmek istersen set_power_pwm_override(1, false, 0); fonksiyonunuda kullanabilirsin. OVDCOND ile aynı işi yapıyor fakat bütün kanalları aynı anda kontrol etmiyor.

18F1330 çok cins bir entegre. datesheetini ezberlemeden hakim olmak zor.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

bulut_01

Peki bu duty değerini hangi register kayıt ediliyor duty oranını hangi register ile sıfırlarım ? katalog baktım ama bulamadım.
YENİLMEZ..

pwm.c

PDC** registerleri olması lazım.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

iyildirim

Alıntı yapılan: bulut_01 - 25 Kasım 2013, 13:58:58
Peki bu duty değerini hangi register kayıt ediliyor duty oranını hangi register ile sıfırlarım ? katalog baktım ama bulamadım.
Duty için PDCxH PDCxL registerleri kullanılıyor. x yerine  kanal numarası gelecek.

Alıntı yapılan: bulut_01 - 24 Kasım 2013, 19:53:51
PWMCON0=0b00000111;         değerin yazıyorum kapatıyor burda sorun yok 

set_power_pwm0_duty(duty1=P*64); buradan set edip pwm açmıyor benım sorunum  yukardakı satır varken çalışmaması.

OVDCOND, OVDCONS  registerleri duty den bağımsız çalışır.
OVDCOND registerinin ilgili biti resetlendiğinde pinde OVDCONS registerine yazılan değer görünür. Pinde tekrar PWM görmek için OVDCOND registerinde ilgili biti set etmek gerekir.
OVDCOND registerinin içeriği değiştiğinde pinde sonucu hemen veya bir sonraki pwm periodu başında görmeniz PWMCON1 registerindeki OSYNC bitine bağlı. Bu bit set edilirse override işlemi hemen gerçekleşmez bir sonraki periodu bekler..


Alıntı yapılan: bulut_01 - 24 Kasım 2013, 18:23:59
18f1330 katalog baktım pwm register hepsine baktım pwm sıfırlayıp case döngüsüne göre herhangi pwm portuna çıkış veriyorum ama register atadıgım değer ile pwm DURDURAMADIM bir türlü nasıl yaparım ? sorunum OVDCONS registerdeki atadıgım değer ile pwm sıfırlayamıyorum.

switch (hall)
{
case 0b00000101:
OUTPUT_B(0x00);
#byte OVDCONS=0x0f82
OVDCONS=0b00111111;

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);
break;

case 0b00000100:
OUTPUT_B(0x00);
#byte OVDCONS=0x0f82
OVDCONS=0b00111111;

set_power_pwm0_duty(duty1=P*64);
output_high(pin_b6); 
break;


Kod da hall sensör den gelen bilgiye göre PWM pinleri anahtarlanacaksa öncelikle hall sensör konumlarına göre hangi pinlerde PWM olacağını belirleyin ve buna göre olması gereken OVDCOND registeri içeriklerini 3 bitlik hall konumlarına göre bir diziye atın. Sonrasında hall kesmesinde (ext int, CN vs. ) sadece
OVDCONS = dizi[hall];

demek yeterli olur. Eğer bu BLDC içinse ardışık olarak alt ve üst mos lar anahtarlanmayacağından dolayı deadtime vs de duty ile oynamak da gerekmez. Switch, if-else ile de uğraşmamış olursunuz.


 


bulut_01

burdan yardımcı olan arkadaslara tesekkür ediyorum dediğim gibi oldu.
OUTPUT_B(0x00);
PDC0H = 0x00;
PDC1H = 0x00;
PDC2H = 0x00;
set_power_pwm0_duty(duty1=P*64);
output_high(pin_b4);
YENİLMEZ..