Kod bu şekilde. frekans 16 kHz'de sabit. duty cycle'ı istediğim gibi değiştirebiliyorum. Sorunum şu frekans devre için yetersiz kalıyor. Frekansı 32kHz yada 64 kHz'e arttırmam gerekiyor. nasıl yapabilirim ?
quote:
//MK
const int pot_pin = A0; const int feedback = A1; int pot = 0; int cikti = 0; int vout = 0; int vpot = 0; int duty = 1; int bosluk = 510; int i=0;
void setup() { cli(); // stop interrupts TCCR1A = 0xF2 ; // phase correct (mode 1010, ICR1 controls period) TCCR1B = 0x01 ; // prescale by 1, change to 0x12 for prescale by 8 TIMSK1 = 0x01 ; // overflow interrupt ICR1 = 500 ; // 31.25us cycle time, 32kHz PWM but 64kHz drive pulses (differential) OCR1A = 125-100 ; // example U drive OCR1B = 125 ; GTCCR = 0x83 ; // clear and halt prescalers TCNT1 = 0xFFFF ; // synchronize counters exactly. GTCCR = 0x00 ; // allow prescalers to fly sei(); // allow interrupts pinMode(pot_pin, INPUT); pinMode(feedback, INPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); Serial.begin(9600);
}
ISR(TIMER1_OVF_vect){
OCR1A=bosluk; //dutyi buradan ayarla OCR1B=511-bosluk; }
void loop(){
oku(); //potansiyometreden istenen gerilim ve cikistan alinan gerilimi okutuyoruz
ICR1 = 500; Bu değeri değiştirerek yapabilirsin. Formül şu: 16000000 / (2 * ICR1)
Kod amatörce yazılmış. O kesme fonksiyonuna hiç gerek yok, duty cycle değerleri loop() içinde güncellense daha iyi olur.
quote:
Orijinalden alıntı: elektro_gadget_
ICR1 = 500; Bu değeri değiştirerek yapabilirsin. Formül şu: 16000000 / (2 * ICR1)
Kod amatörce yazılmış. O kesme fonksiyonuna hiç gerek yok, duty cycle değerleri loop() içinde güncellense daha iyi olur.
ICR1=500 değerini değiştiriyorum fakat frekans değişmiyor
Kod hatalı olduğu için kafamı karıştırdı. Oradaki register tanımlamalarını komple silip şöyle yapalım.
ICR1 = 249; TCCR1A = 0xA2; TCCR1B = 0x19;
Başka bişey lazım değil. Bu değerler ile 64 khz pwm alırsın. OCR1A ve OCR1B duty cycle'ı ayarlar. loop() içinde güncelle, kesmeyi sil gitsin. Maksimum duty cycle ICR1 kadar olabilir, ondan fazlası sürekli %100 doluluk demektir. Diğer bir deyişle frekansın artması pwm çözünürlüğünün düşmesi demek. Son olarak senin kodda çıkışlar invert edilmişti. Ben normal olarak ayarladım. 0xA2 -> Normal 0xF2 -> Terslenmiş
quote:
Orijinalden alıntı: elektro_gadget_
Kod hatalı olduğu için kafamı karıştırdı. Oradaki register tanımlamalarını komple silip şöyle yapalım.
ICR1 = 249; TCCR1A = 0xA2; TCCR1B = 0x19;
Başka bişey lazım değil. Bu değerler ile 64 khz pwm alırsın. OCR1A ve OCR1B duty cycle'ı ayarlar. loop() içinde güncelle, kesmeyi sil gitsin. Maksimum duty cycle ICR1 kadar olabilir, ondan fazlası sürekli %100 doluluk demektir. Diğer bir deyişle frekansın artması pwm çözünürlüğünün düşmesi demek. Son olarak senin kodda çıkışlar invert edilmişti. Ben normal olarak ayarladım. 0xA2 -> Normal 0xF2 -> Terslenmiş
Çok teşekkür ederim hocam. Benim Register kontrolü hakkında bilgim yoktu. O yüzden bu şekilde sordum. Ben duty de çok çözünürlük istemiyorum aslında baktığınızda. 100 bile olsa yeterli
yeni mesaja git
Yeni mesajları sizin için sürekli kontrol ediyoruz, bir mesaj yazılırsa otomatik yükleyeceğiz.Bir Daha Gösterme