Forum: Mikrocontroller und Digitale Elektronik PWM konfigurations Probleme Atm.2560


von Dominic K. (domi1997)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Dominic K. (domi1997)


Lesenswert?

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?

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

von Dominic K. (domi1997)


Lesenswert?

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

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

von Dominic K. (domi1997)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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
}

von Dominic K. (domi1997)


Lesenswert?

>>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
Noch kein Account? Hier anmelden.