Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: Franisto - 18 Aralık 2017, 23:02:09

Başlık: Timer kesmesi ve pulse uretme
Gönderen: Franisto - 18 Aralık 2017, 23:02:09
Merhaba arkadaslar,

Arduino ide ile arduino mega programliyorum. Hazirladigim programda step motor surmek icin pulse kullaniyorum ve bunu  ana program akisini etkilememesi icin timer kesmesi icerisinde olusturuyorum. Ayrica motorun hizini degistirmek icin timer registerleri ile oynayarakn
istedigim degerleri elde ediyorum.

Fakat takildigim nokta soyle her timer dongusu icerisinde bir pulse uretmek istiyorum. Cikisi 1 yaptiktan sonra hemen 0 yaparsam uretilen pulse nin 1 ve 0 sureleri esit olmuyor.

Eger her timer dongusunde cikisin tersini alirsam;

Out =!Out;
digitalWrite(out_pin,Out);

Gibi 180 derece yada baska bir deyisle %50 duty cucle pulse uretebiliyorum. Fakat bu seferde bir pulse uretmek timer dongusunun iki defa donmesi gerekiyor.

Her timer dongusunde %50 duty ile pulse uretmenin yolu varmidir.

Her timer tik i icin ;

digitalWrite(out_pin,HIGH);
delay(xsure);
digitalWrite(out_pin,LOW);
delay(xsure);

gibi bir kod yazsam sureleri oyanayarak istedigimi yakalasamda timer frekansini degistirince sureler sabit oldugu icin yine duzgun dagilimli pulse uretmemis oluyorum.

Bir kaynakta Bu sorunu asmak icin 2 adet timer kullanilmasi gerektigini yazmislar fakat daha fazla aciklama yapilmamis. Konu hakkinda yardiminizi rica ediyorum.

Başlık: Ynt: Timer kesmesi ve pulse uretme
Gönderen: Kabil ATICI - 18 Aralık 2017, 23:15:03
Bir timer kesme süresinde tam dalga üretmeye çalışmak yerine,
frekansı tam iki katına çıkart. bir timer kesmesinde 1 veya 0 yap.  Bir tane global değişken kullanıyorsun.
uint8_t darbe=0;

...
...
kesme();
{
if  (darbe==0)
{
darbe=0;
digitalWrite(out_pin,LOW);
}
else{
darbe=1;
digitalWrite(out_pin,HIGH);
}
}


--------
diğer yöntemin veri kağıtlarında incelersen CTC seçeneğidir. Özellikle timer bacaklarına bağlı çıkış bacakları üzerinden istediğin %50 darbe genişlikli sinyaller elde edebilirsin.
Başlık: Ynt: Timer kesmesi ve pulse uretme
Gönderen: fide - 18 Aralık 2017, 23:38:54
Merhaba.
Donanımsal pwm kullan. frekansı ayarla. frekansı tutturursan %50 duty ver. işlemciyi yormazsın.
Başlık: Ynt: Timer kesmesi ve pulse uretme
Gönderen: Franisto - 18 Aralık 2017, 23:40:05
Yanitiniz icin tesekkur ederim. Frekansi yukseltmek istoyrum ama yukselmiyor. :) 40 khz uzerine bu yontemle cikamadim. Timer i daha hizli calistirsamda osilaskop ile 40khz civarinda kaldigini goruyorum ana program dongusude yavaslamaya basliyor.

Fakat her timer kesmesinde bir pulse uretirsem sorum olmuyor ama bu sefer tam kare dalgayi yakalayamiyorum.

Bu ctc konusunu biraz arastirmam gerek sanirim
Başlık: Ynt: Timer kesmesi ve pulse uretme
Gönderen: Franisto - 18 Aralık 2017, 23:41:40
Donanimsal pwm denemedim. Ama deneyecegim fikir icin tesekkurler.