PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega pwm phasen und frewquenzgnau



slaud
20.09.2006, 13:07
hab ein kleines timer problem

eigentlich solte man beim timer1 ein pwm signal generieren können, bei dem man die frequenz und das on of verhältnis andern kann

nur klappt das bei mir leider nicht so richtig
wäre coll wen mir wer helfen kann
#include <avr/io.h>
#include <avr/interrupt.h>

typedef unsigned char byte;

static void pwm_init(void); // pwm ==> phase correct, 8 bit

int main(void)
{
pwm_init();

for(;;)
{

}
}


static void pwm_init(void)
{

TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(1<<WGM10); // PWM Phasen und Frequenzgenau, Ausgang wählen
TCCR1B = (1<<WGM13)|(0<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10); // set clock/prescaler 1 -> enable counter


OCR1AL= 4;
}

SprinterSB
20.09.2006, 13:25
Schaltest du den Port als OUT?

Zudem ist besser: OCRIA = 4;

slaud
20.09.2006, 13:44
ja es wird ein port als ausgang geschalten
das fuktzt zumindestens schon mal bei der simulation
hab das mit diesem frequenzgenau phasengenau noch nicht so wirklich verstanden aber mit der formenl komm ich eben genau auf meine gewünschten frequenzen

10Khz= 10Mhz>/(2*top)

hab das aber noch nicht ganz mit den registern kappeirt in die ich schreiben muss

hmm topp wäre dann auf 500 zu stellen geht das müsste ja gehen ist ja ein 16 bit timer oder
wo schreibe ich top hin
thx

SprinterSB
20.09.2006, 16:09
Musst im Handbuch shauen, weiß ich jetzt auch net Auswendig.. TOP ist fest oder OCR1A oder OCR1B oder ICR1, je nach Timer1-Mode.

slaud
20.09.2006, 16:18
habs grad gemerkt
OCRIA = 4;
aber wenn ichs im simulator teste funktiniert das nicht
ist mir gerade aufgefallen mit jatag gehts ohne probleme komisch?
dann geht nur OCRIAL/H aber ist ja nicht weiter tragisch
der ausgang musste sich eigentlich durch die deffoiniton von

(0<<COM1A1)|(1<<COM1A0)

schalten lassen oder bin ich falsch

top ist OCR1A oder ICR1 je nach phasen frequenz modus gibt zwei

slaud
20.09.2006, 16:54
void pwm_init(void)
{
DDRD |= (1<<PIND4);
OCR1A=32;
OCR1B=16;
TCCR1A = (0<<COM1B1)|(1<<COM1B0)|(1<<WGM10); // PWM, phase correct, 16 bit.
TCCR1B = (1<<WGM13) |(1<<CS10); // set clock/prescaler 1 -> enable counter
sei();
}



funktioniert jetzt wnigstens schon mit dem auf abwertszählen nur mit dem ausgang hab ich noch ein problemchen