ATMega 2560 ADC auf PWM triggern

OP #5476638
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.
Gast #5476646
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.
Gast #5476721
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.
OP #5476872
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?
Gast #5476939
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?
Gast #5477015
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?
#5477187
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren