Forum: Mikrocontroller und Digitale Elektronik ATMega 2560 ADC auf PWM triggern


von Joe F. (jfbmtd)


Lesenswert?

Hallo,

ich erzeuge zur Zeit mit dem ATMega2560 ein PWM Signal mit einer 
Frequenz von 7812.5 Hz, das einen Motortreiber ansteuert.
Kann ich nun den ADC eines Analogeinganges mit Interrupts so triggern, 
dass dieser bei jeder steigenden PWM Flanke eine anliegende Spannung 
einliest?
Die Sampling Rate meines ADC ist derzeit etwa 8928 Hz.

von S. Landolt (Gast)


Lesenswert?

Wird die PWM mit Timer0 oder Timer1 erzeugt, geht es direkt per 
'Auto-Trigger', siehe unter ADCSRB die ADTSn-bits. Ansonsten muss man 
den ADC wohl in einem Timer-Interrupt starten.
  Eventuell ginge noch der Start per Analog-Comparator.

von Achim S. (Gast)


Lesenswert?

S. Landolt hat ja schon mehrere Realisierungsvorschläge genannt. Von mir 
nur der ergänzende Hinweis: denke daran, dass "exakt" bei der 
Schaltflanke die Spannungen in deinem System ab schlechtesten definiert 
sind/am stärksen herumwackeln. Unter Umständen misst du in dem Moment 
mehr Übersprechen von der Schaltflanke als das Signal, das dich 
eigentlich interessiert. Oft wird das Signal nicht exakt bei der 
Schaltflanke aussagekräftig sein, sondern das Messignal kurz nach dem 
Einschalten oder kurz vor dem Ausschalten der PWM.

Ih hab mir bei einer ähnlichen Fragestellung mal den "Luxus" geleistet, 
zwei Timer synchron laufen zu lassen. Der eine erzeugt die PWM für den 
Leistungsteil. Der andere triggert die ADC-Abtastung jeweils genau x µs 
vor dem Abschalten der PWM (wenn der Laststrom über den Shunt nahe am 
Maximalwert ist). Funktioniert auf diese Art natürlich nur, wenn der 
PWM-Puls mehr als x µs lang ist und wenn man noch einen unbenutzten 
Timer dafür "übrig" hat.

von Joe F. (jfbmtd)


Lesenswert?

Danke schonmal für die Antworten.

es würde auch gehen dass etwa 2 us nach der PWM Flanke am A0 EIngang 
gemessen wird.

Habe jetzt im Datasheet gelesen dass ich den Auto-Trigger so aktivieren 
kann:
1
  ADCSRA |= (1<<ADEN); // ADC Enable
2
  ADCSRA |= (1<<ADATE); //Auto-Trigger Enable
3
  ADCSRB |= (0<<ADTS2)|(1<<ADTS1)|(1<<ADTS0); //Trigger Timer 0

reicht das schon aus um A0 auf die PWM des Timers0 zu triggern?

von Ingo L. (corrtexx)


Lesenswert?

Um den ADC sauber auf die PWM zu synchronisieren, nimmt man den 
Center-Aligned-Mode und triggert den ADC im "Center" d.h. wenn der 
Zähler seine Zählrichtung ändert.

Konkret musst du auf den TimerOverflow triggern

von S. Landolt (Gast)


Lesenswert?

> reicht das schon aus um A0 auf die PWM des Timers0 zu triggern?

Ja, falls es sich um den 'Fast PWM Mode' handelt und die COM0xn-bits auf 
11 stehen.
  Die ursprüngliche Forderung nach der "steigenden PWM Flanke" gilt doch 
noch, oder?

von Ingo L. (corrtexx)


Lesenswert?

S. Landolt schrieb:
> Die ursprüngliche Forderung nach der "steigenden PWM Flanke" gilt doch
> noch, oder?
Wenn er den Motorstrom erfassen geht das nur zuverlässig im 
Center-Aligned-Mode, alles Andere is, wie schon erwähnt stark 
(schalt-)störungsbehaftet

von S. Landolt (Gast)


Lesenswert?

> Wenn er den Motorstrom erfassen geht ...

Da halte ich mich raus, da stelle ich mich ganz dumm: keine Ahnung, was 
er machen will.

von Joe F. (jfbmtd)


Lesenswert?

ja es soll immernoch die steigende PWM Flanke als Trigger Signal genutzt 
werden.

Es soll kein Motorstrom sondern eine Motorspulenspannung unmittelbar 
nach der PWM Flanke gemessen werden.

von Joe F. (jfbmtd)


Lesenswert?

S. Landolt schrieb:
>> reicht das schon aus um A0 auf die PWM des Timers0 zu triggern?
>
> Ja, falls es sich um den 'Fast PWM Mode' handelt und die COM0xn-bits auf
> 11 stehen.
>   Die ursprüngliche Forderung nach der "steigenden PWM Flanke" gilt doch
> noch, oder?

warum muss es der PWM Fast Mode sein und wozu müssen die COM0xn Bits auf 
11?

von S. Landolt (Gast)


Lesenswert?

Ersteres: ich war zu faul, den Phase-correct-mode nachzulesen; Letzteres 
steht bei den ADTSn-bits des ADC: '011': 'Trigger Source: Timer/Counter0 
Compare Match A'.
  Gegenfrage: wie sieht der Programmteil für die PWM aus?

von Ingo L. (corrtexx)


Lesenswert?

Joe F. schrieb:
> Es soll kein Motorstrom sondern eine Motorspulenspannung unmittelbar
> nach der PWM Flanke gemessen werden.
Ok, dann bietet sich tatsächlich an, im Schaltpunkt zu messen. Dann 
kannst du auf den Compare-Match Interrupt den ADC triggern, das geht 
auch ohne Probleme. Sei dir nur im Klaren, dass du evtl. Störung auf dem 
Signal hast. Wichtig is außerdem, dass du bei Timer0 nur auf den 
CompareMatchA und bei Timer1 nur auf CompareMatchB triggern kannst.

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.