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.
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.
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.
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?
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
> 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?
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
> Wenn er den Motorstrom erfassen geht ...
Da halte ich mich raus, da stelle ich mich ganz dumm: keine Ahnung, was
er machen will.
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.
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?
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.