Das erste Beispiel war ein Schnellschuß. Ich habe den Wandler immer
wieder aktiviert/deaktiviert. Jetzt mache ich es so, dass ich den
ADC-Interrupt erst bei der steigender Flanke freischalte, kurz warte und
dann den Wert hole. Der Wandler läuft dauernd.
1 | ISR(TIMER1_OVF_vect) //steigende Flanke
|
2 | {
|
3 | TCNT2 = 200; //Timer2 vorladen (Overflow bei 255)
|
4 | TIFR |= (1<<TOV2); //alte Overflows löschen
|
5 | TIMSK |= (1<<TOIE2); //Timer2 Interrupt aktvieren
|
6 | }
|
7 |
|
8 | ISR(TIMER2_OVF_vect) //Overflow kommt ca. 5µs nach steigender PWM-Flanke
|
9 | {
|
10 | PORTC |= (1<<PC0); //Zeit messen am Oszi
|
11 | ADCSRA|= (1<<ADIE); //AD-Wandler Interrupt aktivieren
|
12 | TIMSK &= ~(1<<TOIE2); //Timer2 Interrupt löschen, nicht mehr benötigt
|
13 | }
|
14 |
|
15 | ISR(ADC_vect)
|
16 | {
|
17 | UIST = ADCW;
|
18 | ADCSRA &= ~(1<<ADIE); //AD-Overflow löschen, nicht mehr benötigt
|
19 | PORTC &= ~(1<<PC0); //Messung Ende
|
20 |
|
21 | berechnen = TRUE;
|
22 | }
|
23 |
|
24 | main()
|
25 | {
|
26 | ....
|
27 | //Timer1-PWM 20 kHz = 50µs Periodendauer
|
28 |
|
29 | TCCR2 |= (1<<CS20); //Timer2 (8bit) mit CPU-Takt
|
30 |
|
31 | ADMUX = 4; // Kanal waehlen
|
32 | ADMUX |= (1<<REFS0); // interne Referenzspannung nutzen
|
33 | // ADC aktivieren, Teiler 64 -> 250 kHz, Free-Running
|
34 | ADCSRA |= (1<<ADEN)|(1<<ADATE)|(1<<ADSC)|(1<<ADPS2)|(0<<ADPS1);
|
35 |
|
36 | ....
|
37 | //berechnen etc.
|
38 | }
|
Ich bin jetzt bei gemessenen 12µs inkl. setzen der Flags. Das sieht
schonmal besser aus, damit kann ich leben und das ist auch das was im
Datenblatt steht (13µs). Allerdings sehe ich beim Debuggen, dass die
AD-Werte noch wesentlich öfter kommen. Alle paar CPU-Takte steht ein
neuer AD-Wert im ADC. Dann bezieht sich die Angabe im Datenblatt also
auf die gesamte Zeit, bis man einen AD-Wert geholt hat und ihn in einer
Variable speichert zur weiteren Verarbeitung? Die eigentlich
Sample&Hold-Wandlung geht wohl wesentlich schneller als das Abholen der
Werte aus dem Register? Eigentlich müsste es bei 250 kHz mindestens 4µs
dauern? Das wäre ja ein AD-Wert pro 64 CPU-Takte.
@ Was erwartest Du eigentlich, wenn Dir 30µs schon zuviel sind?
Der Atmega ersetzt einen 9 Jahre alten HC12, bei dem die single
conversion laut Oszi-Messung auch nicht mehr als 10µ dauert. Da habe ich
vom Mega32 schon etwas mehr erwartet. Es muss hier sehr schnell gehen,
da die PWM eine große Leistung schaltet und ich das Messen während den
Schaltvorgängen vermeiden will.