Ynt: pwm kontrol yardım

Başlatan sayangku, 30 Aralık 2015, 21:55:23

sayangku

sa arkadaşlar ben basit bir program yazılıyorum buton kontrollü pwm konusunda biraz sıkıntım var donanımsal pwm yapabiliyorum ama yazılımsal yapamiyorum pic16f628a yanlızca bir bacak donanım pwm oldugu için bana yetmiyor  banada 2 bacak pwm lazım ,software tam çözemedim dac  diyebiliriz sanırım 
ben rb0 ve rb1 portuna rgb animasyosundaki gibi yavaş bir dönme animasyonu yapmak istiyorum bunu nasıl yapabilirim yardımcı olursanız sevinirim  a3 butonun içine yazıcam kodu ve bir kere basınca sarı ve mavi led pwm olarak dönücek sürekli maksat güzel bir görüntü olsun istiyorum normalde arduino ile ben yaptim ccs c ile yapmak istiyorum yani pic ile yardımlarınıızı bekliyorum şimdiden teşekkür ederim :)

while (true)
if(input(pin_a0)==0) // buton1 bastıgım zaman lojik1 sıfıra çekerim sıfırıda ra0 portuna atarım
{
delay_ms(20); // Buton arkı önleme gecikmesi
output_high(pin_b0); // sarı led yandı
output_low(pin_b1); // mavi led söndü


if(input(pin_a3)==0)

{



}

}

mesaj birleştirme:: 30 Aralık 2015, 21:58:39

Alıntı yapılan: sayangku - 30 Aralık 2015, 21:55:23
sa arkadaşlar ben basit bir program yazılıyorum buton kontrollü pwm konusunda biraz sıkıntım var donanımsal pwm yapabiliyorum ama yazılımsal yapamiyorum pic16f628a yanlızca bir bacak donanım pwm oldugu için bana yetmiyor  banada 2 bacak pwm lazım ,software tam çözemedim dac  diyebiliriz sanırım 
ben rb0 ve rb1 portuna rgb animasyosundaki gibi yavaş bir dönme animasyonu yapmak istiyorum bunu nasıl yapabilirim yardımcı olursanız sevinirim  a3 butonun içine yazıcam kodu ve bir kere basınca sarı ve mavi led pwm olarak dönücek sürekli maksat güzel bir görüntü olsun istiyorum normalde arduino ile ben yaptim ccs c ile yapmak istiyorum yani pic ile yardımlarınıızı bekliyorum şimdiden teşekkür ederim :)

while (true)
if(input(pin_a0)==0) // buton1 bastıgım zaman lojik1 sıfıra çekerim sıfırıda ra0 portuna atarım
{
delay_ms(20); // Buton arkı önleme gecikmesi
output_high(pin_b0); // sarı led yandı
output_low(pin_b1); // mavi led söndü


if(input(pin_a3)==0)

{

// 0 dan 255 kadar dimmerli dönme animasyonuda diyebiliriz

}

}

ziyaretci

Telefondan yazdığım için derleyemedim.  Fikir vermesi açısından inceleyebilirsiniz.


// v1.0
int8 softPwm(int8 dP, int16 Hz, int8 port, int8 pin){
// dP = dutyPercent: xx% logic 1 max. value 99, min. value 1
// Hz = period: the time of the cycle, min. value 500, max. value 3000
/* 
port:
0 --- PortA
1 --- PortB
2 --- PortC
3 --- PortD
*/
//pin: Integer only 0-7
Static int16 calcDuty1, calcDuty0, x;

Static int8 xdP=0, xport=0, xpin=0;
Static int16 xHz=0;
int1 smart=0; // if the parameters be same, this function works faster.

if(xdP!=dP){ xdP = dP; smart = 1;}else
if(xHz!=Hz){ xHz = Hz; smart = 1;}else
if(xport!=port){xport = port; smart = 1;}else
if(xpin!=pin){xpin = pin; smart = 1;}

if( smart == 1) {
if(dP>0 && dP<100 && Hz>499 && Hz<3001 && port<4 && pin<8){
calcDuty1 = dP*Hz*0.01;
calcDuty0 = Hz-calcDuty1;

Switch(pin){
case 0: x = 0x01; break;
case 1: x = 0x02; break;
case 2: x = 0x04; break;
case 3: x = 0x08; break;
case 4: x = 0x10; break;
case 5: x = 0x20; break;
case 6: x = 0x40; break;
case 7: x = 0x80; break;
}
Switch(port){
case 0: output_a(x); delay_us(calcDuty1); output_a(x); delay_us(calcDuty0); break;
case 1: output_b(x); delay_us(calcDuty1); output_b(x); delay_us(calcDuty0); break;
case 2: output_c(x); delay_us(calcDuty1); output_c(x); delay_us(calcDuty0); break;
case 3: output_d(x); delay_us(calcDuty1); output_d(x); delay_us(calcDuty0); break;
}
 return 1; // SoftPwm Producted
 }else return 0; // Parameters error
 }else{
 Switch(port){
case 0: output_a(x); delay_us(calcDuty1); output_a(x); delay_us(calcDuty0); break;
case 1: output_b(x); delay_us(calcDuty1); output_b(x); delay_us(calcDuty0); break;
case 2: output_c(x); delay_us(calcDuty1); output_c(x); delay_us(calcDuty0); break;
case 3: output_d(x); delay_us(calcDuty1); output_d(x); delay_us(calcDuty0); break;
}
return 2; // smart mode enable
 }
}

°°°°°°°°°°
For this function using, example:
softPwm(a, b, c, d);
a: 'b' parametresindeki değerin, 'a' parametresindeki değer kadar yüzdesi lojik 1 süresi.
b: Yapay pwm sinyalinin 1 saykıl süresi.
c: Yapay pwm çıkış portu
d: 'c' parametresindeki portun ilgili pini.
°°°°°°°°°°
int status;
Main{

Status = softPwm(25, 2016, 1, 6);
/*
Output:
PortB, pin 6
Logic 1: 504uS
Logic 0: 1512uS
*/
}