PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega32 PWM



DEADBEEF
12.10.2014, 21:24
Hallo
Ich hoffe ich bin hier richtig! Ich habe versucht ein variables PWM Signal auf dem Atmega328pu zu erzeugen ( und es hat geklappt). Da ich nun aber ein LCD und weitere Sensoren anschließen wollte, habe ich dem µC gewechselt(Atmega32). Leider geht da jetzt Garnichts mehr...
Ich hoffe mir kann jemand helfen und wünsche eine schöne Wochen !

MfG
DEADBEEF

Anbei noch mein Code:

#define F_CPU 8000000


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

double dutyCycle = 0;

int main(void)
{
DDRB = 0xFF;
TCCR0 |= (1<< WGM00) | (1<<WGM01) | (1<<COM01);
OCR0 = (dutyCycle/100.0)*255.0;
TCNT0 = 0xFF;
TIMSK |= (1<< TOIE0);
TIFR = (1<< TOV0);
sei();
TCCR0 |= (1<< CS00);

while(1)
{
//TODO:: Please write your application code
_delay_ms(100);

dutyCycle += 10;

if(dutyCycle > 50)
{
dutyCycle = 0;
}
}
}

ISR(TIMER0_OVF_vect)
{
OCR0 = (dutyCycle/100.0)*255.0;
}

Besserwessi
12.10.2014, 21:41
Die Rechnung mit Fließkomma sollte man sich in der ISR verkneifen, das braucht ggf zu lange um damit in 256 Zyklen fertig zu werden. Es macht auch wenig Sinn den OCR0 wert immer wieder neu zu berechnen. Ein Puffer für den PWM Wert gibt es sowieso schon in Hardware. Man darf also zu jeder Zeit OCR0 verändern - aktiv wird der Wert erst mit dem nächsten Zyklus.

Formal sollte zumindest die Variable dutyCycle volatile sein - aber der Code kann sowieso entfallen.