Guten Tag zusammen Für einen LIDAR(motorsteuerung) brauche ich einen 20khz PWM bei dem ich den duty cycle ändern kann. Nun da hat sich für mich Fast PWM angeboten doch die Konfigurierung will nicht wie ich will. Ich habe meiner Meinung nach den Controller richtig eingerichtet aber lasse mich gerne belehren(kein signal an Ausgang): void initBoard(void) { OCR3A = 250; //TIMER Konfigurieren TCCR3A = 0x41; TCCR3B = 0x0D; TIFR3 = TIFR3 | 0x02; DDRE = 0xFF; }//Wird nur einmal am Start ausgeführt Denkensweg: WGM33=0 WGM32=1 WGM31=0 WGM30=1(für einen 8bit fast pwm) CS32=1 CS31=0 CS30=1 1024 prescaler(bei 16mhz also 15.63khz) COM3A1,COm3B1,COM3C1,COM3C0=0 COM3A1 = 1 für Toggle betrieb.
Hi >TIFR3 = TIFR3 | 0x02; Was willst du damit bezwecken? >COM3A1 = 1 für Toggle betrieb. Wozu Togglen? Entweder Clear oder Set on Compare Match. MfG Spess
Das Timerflag Löschen um sicherzustellen das er die Konfiguration übernommen hat. Kann man auch weglassen aber auch ohne funktioniert es nicht. Aber ist es nichtso das bei Set/clear das nur einmal passiert und dan nicht mehr wenn man nicht das flag löscht?
Warum schreibst du es nicht gleich richtig? Kein Mensch kann mit den Zahlen was anfangen ohne mühsam im Datenblatt zu suchen. TCCR3A = (1<<COM3A1).... Dann weiss man, dass du COM3A1 setzen willst, und es landet automatisch an der richtigen Bitstelle Und da COM3A Bit 7 ist, ist deine 0x41 auf jeden Fall schon mal falsch. Rest habe ich nicht geschaut, ist echt mühsam.
void initBoard(void) { DDRE = 0xFF; OCR3A = 250; //TIMER TCCR3A = (1<<COM3A0)|(1<<WGM30); TCCR3B = (1<<CS32)|(1<<CS30)|(1<<WGM32); TIFR3 = TIFR3 | 0x02; } Scheint doch etwas nicht zu stimmen
An welchem Ausgang soll deine PWM denn erscheinen? Bis jetzt sieht es für mich nach fast-pwm mit top OCR3A aus. OCR3A kann aber nicht gleichzeitig top und PWM sein. Also nimm OCR3B oder C für die PWM oder ICR3 als top, dann kannst du auch OCR3A als PWM-Register nutzen. Und mit der Frequenz hast du dich auch komlett vertan: 16MHz/1024/250 - das sind gerade mal 62Hz PWM-Frequenz.
Ich brauche den PWM an Pin5/PE3/PC3A und ich möchte den duty cycle ändern können. Und dachte an Mode 5 also Fastpwm 8bit Top:0xFF upd.ofOCRat: Bottom TOVnFlag set on:Top dachte ich sollte dazu passen.
@Dominic K. (domi1997) >void initBoard(void) >{ > OCR3A = 250; //TIMER Konfigurieren > TCCR3A = 0x41; > TCCR3B = 0x0D; Keine magischen Zahlen, nimm die Bitnamen, siehe Bitmanipulation > TIFR3 = TIFR3 | 0x02; Ist erstens so nicht sinnvoll und 2. nicht nötig. Das Interrupt Flag Register löscht man, indem man eine 1 an die jeweilige Stelle schreibt. Direkt! Keine ODER-Verknüpfung. Und auch hier sind Bitnamen besser. Die anderen Bits werden dabei NICHT mit 0 überschrieben, weil sich dieses Register anders verhält! TIFR3 = (1<<OCF3A); >Denkensweg: Was für ein merkwürdiges Wort? Selber erfunden? >WGM33=0 WGM32=1 WGM31=0 WGM30=1(für einen 8bit fast pwm) >CS32=1 CS31=0 CS30=1 1024 prescaler(bei 16mhz also 15.63khz) >COM3A1,COm3B1,COM3C1,COM3C0=0 >COM3A1 = 1 für Toggle betrieb. Eben darum nimmt man gleich Bitnamen! Eher so.
1 | {
|
2 | //TIMER 3 konfigurieren
|
3 | TCCR3A = (1<<COM3A1) | (1<<WGM30); // timer mode 5, 8 bit fast PWM |
4 | TCCR3B = (1<<WGM32) | (1<<CS30); // prescaler 1 |
5 | OCR3A = 250; |
6 | DDRE = 0xFF; |
7 | }
|
Damit erhält man eine PWM-Frequenz von 16 MHz / 256 = 62,5kHz. Wenn das zu viel ist, sollte man auf 9 oder 10 Bit gehen oder ein Phase correct PWM-Mode wählen, da kommt dann automatisch der Teilerfaktor 2 rein. Die Phase und Frequency corret Modi haben auch den Voteil, daß man sowohl 0% als auch 100% ausgeben kann, was bei Fast-PWM nicht geht! Für deine anvisierten 20 kHz würde ich 9 Bit mit Phase correct PWM nehmen, macht dann
1 | 16 MHz / 2 / 512 = 15,625 kHz |
1 | {
|
2 | //TIMER 3 konfigurieren
|
3 | TCCR3A = (1<<COM3A1) | (1<<WGM31); // timer mode 2, 9 bit phase correct PWM |
4 | TCCR3B = (1<<CS30); // prescaler 1 |
5 | OCR3A = 250; |
6 | DDRE = 0xFF; |
7 | }
|
>>Denkensweg: > > Was für ein merkwürdiges Wort? Selber erfunden? Mein Deutsch ist nicht misserabel,dass ist mir bewusst. Ein weiterer Grund warum ich mich in Richtung Technik bilde da ist fast alles Englisch XD > Für deine anvisierten 20 kHz würde ich 9 Bit mit Phase correct PWM > nehmen, macht dann > >
1 | > 16 MHz / 2 / 512 = 15,625 kHz |
2 | > |
> > >
1 | > { |
2 | > //TIMER 3 konfigurieren |
3 | > TCCR3A = (1<<COM3A1) | (1<<WGM31); // timer mode 2, 9 bit phase |
4 | > correct PWM |
5 | > TCCR3B = (1<<CS30); // prescaler 1 |
6 | > OCR3A = 250; |
7 | > DDRE = 0xFF; |
8 | > } |
9 | >
|
Danke viel mals funktioniert perfekt :D
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.