Guten Abend, ich habe mich vor längerer Zeit einmal mit dem internen Hardware PWM (counter) des Atmega32 beschäftigt. Danach habe ich keine Zeit mehr dafür gehabt und nun habe ich es heute noch einmal versucht. Soweit alles geschafft, OCR1B bzw OCR1A funktionieren, nur dass der jeweils andere PWM-Port (der nicht genutzt wird) auch (ungewollt) ein PWM Signal erzeugt. Warum? Hier der Code: #include <avr/io.h> void init_pwm(); void init_pwm() { TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (0<<WGM10); TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10); ICR1=249; // top of counter / 2ms pwm return; } int main(void) { DDRD = 0b11111111; init_pwm(); OCR1B=10; // PD4 of AVR atmega32 return(0); } MfG
Kannst du deine Bitauswahl näher erklären? Besonders: (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) Um nur Ausgabe an OC1B zu machen, würde ich verwenden: (0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0)
Ja kann ich: laut Datenblatt: Mode: Fast PWM, Clear OC1A/OC1B on compare match, set OC1A/OC1B at BOTTOM,(non-inverting mode) Deine Konfiguration ist im Datenblatt leider nicht zu finden, hab sie getestet und siehe da: nur OCR1B macht PWM. Es funktioniert also. Egal, Problem hat sich schon gelöst, weil der Zustand, in dem einer (von insgesamt 4 PWM Ausgängen / allerdings anderer AVR) der PWM Ausgänge undefiniert bleibt nicht auftritt. Danke für den Denkanstoß
Ach so. Atmel hat in den Tabellen Platz gespart und und einfach die Kombinationen für A/B in eine Tabelle gepackt, statt eine Tabelle für A und eine Tabelle für B zu machen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.