Forum: Mikrocontroller und Digitale Elektronik adc auf PWM synchronisieren


von Cyril F. (lea)


Lesenswert?

Hallo,

ich verwende ein Atmega 32, mein ADC hat ein Fraquenz von 16MhZ/128= 125 
Khz und PWM Frequenz ist 156250 Hz ich muss das ADC auf PWM 
synchronisieren

Das Sample und Hold soll bei dem Steigenden Flanke der PWM

kann jemanden mir Helfen ? ich habe keine idee wie man das programmieren 
kann

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Cyril F. schrieb:
> ich habe keine idee wie man das programmieren kann
Lass dir einen Interrupt geben, wenn du dort eine steigende Flanke hast. 
Und starte im Interrupt den ADC.

So wie ich die Zahlen ansehe, könnte es allerdings sein, dass der ADC zu 
langsam ist...

: Bearbeitet durch Moderator
von Dr.PillePalle (Gast)


Lesenswert?

PWM auf Interupt Eingang - Int. auf steigende Flanke
Interupt löst ADC messung aus
soweit die Theorie

Die Messung dauert min. 13µSec.
Deine Frequenzen stimmen auch irgendwie nicht
lese dir das Datenblatt - Abschnitt ADC nochmals durch

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn deine PWM dabei ist, kannst du den ADC auch auf Autotrigger stellen 
- zur Auswahl stehen dabei z.b. OVF von Timer 0 und Timer 1 oder auch 2 
Typen Compare Matches.
2 Zyklen nach dem gewählten Autotrigger findet S&H statt.(Fig. 103 im 
Datenblatt)

: Bearbeitet durch User
von Dr.PillePalle (Gast)


Lesenswert?

Die Messung dauert min. 13µSec.  <----- µSec. ist falsch -sollte cycle 
heissen

von Falk B. (falk)


Lesenswert?

@Dr.PillePalle (Gast)

>Die Messung dauert min. 13µSec.  <----- µSec. ist falsch -sollte cycle
>heissen

Das ist nebansächlich. Entscheidend ist die Abtastphase, die dauert nur 
1,5 Takte. Danach hat man "alle Zeit der Welt" für die eigentliche 
AD-Wandlung.

Auf die steigende PWM-Flanke kann man sich mittles Timer Overflow 
Interrupt synchronisieren. Dort muss man dann schnell den ADC starten.

von Michael U. (amiga)


Lesenswert?

Hallo,

der ADC kann mit mehreren Sourcen automatisch getriggert werden, u.a. 
Analog Comparator, INT0 und mehreren Timerevents.

Datenblatt des Mega32 befragen, speziell das SFIOR.

Wie schon angemerkt ist der ADC aber mit 125kHz nicht schnell genug 
getaktet um eine Wandlung vor der nächsten PWM-Flanke zu beenden.

Gruß aus Berlin
Michael

von Oldie (Gast)


Lesenswert?

Erst mal ist das alles VIEL zu schnell für einen AVR-ADC.

Und zweitens wird mir nicht klar, warum du auf die PWM
synchronisieren willst/musst. Üblicherweise liegt da der
Max-, oder Min-Pegel an - und den kannst du durch Messung
von VCC, oder GND einfacher erfassen...

von Ingo L. (corrtexx)


Lesenswert?

Oldie schrieb:
> Und zweitens wird mir nicht klar, warum du auf die PWM
> synchronisieren willst/musst. Üblicherweise liegt da der
> Max-, oder Min-Pegel an - und den kannst du durch Messung
> von VCC, oder GND einfacher erfassen...
Wenn man z.B. den Strom eines SNT erfassen möchte, sollte das immer an 
der selben Stelle im PWM Zyklus erfolgen, daher verwendet man gern den 
Center-Aligned Mode um in der Pulsmitte den ADC zu triggern.

von Michael U. (amiga)


Lesenswert?

Hallo,

Oldie schrieb:
> Erst mal ist das alles VIEL zu schnell für einen AVR-ADC.

stimmt, ich hatte 15kHz gelesen, es sind ja 156250 Hz.

Gruß aus Berlin
Michael

von Peter D. (peda)


Lesenswert?

Also da stellen wir uns mal ganz dumm und schauen ins Datenblatt:
"Up to 15 kSPS at Maximum Resolution"

Ist also meilenweit entfernt von 156kHz PWM.

von Peter D. (peda)


Lesenswert?

Eine Gemeinheit ist bei Auto-Trigger zu beachten:
"A conversion will be triggered by the rising edge of the selected 
Interrupt Flag."
D.h. der Trigger-Interrupt muß auch aufgerufen werden oder dessen Flag 
händisch gesetzt werden.

von Ingo L. (corrtexx)


Lesenswert?

Hallo Cyril,
ich habe keinen fertigen Code den ich dir "schicken kann".
Weiter wurde bereits alles gesagt, du kannst mit dem ADC des AVRs nicht 
jeden PWM-Zyklus abtasten, dafür is der zu langsam, siehe hier:
> > Erst mal ist das alles VIEL zu schnell für einen AVR-ADC.

Weiter wundert es mich, dass du in deiner Masterarbeit nicht selbst in 
der Lage bist, das selbst zu erkennen. Du willst mal ne Führungskraft 
werden!!!.

von Falk B. (falk)


Lesenswert?

@  Michael U. (amiga)


>> Erst mal ist das alles VIEL zu schnell für einen AVR-ADC.

>stimmt, ich hatte 15kHz gelesen, es sind ja 156250 Hz.

Wollen wir wetten, das das ein Schreibfehler ist und in Wirklichkeit 
eher 15,625 kHz?

16 MHz  4  256 = 15,625 kHz

von Falk B. (falk)


Lesenswert?

@  Peter Dannegger (peda)

>Eine Gemeinheit ist bei Auto-Trigger zu beachten:
>"A conversion will be triggered by the rising edge of the selected
>Interrupt Flag."

Das Flag eines Interrupts wird IMMER gesetzt, egal ob der freigeschaltet 
ist oder nicht. Das Maskenbit entscheidet nur, ob die ISR aufgerufen 
wird oder nicht.

>D.h. der Trigger-Interrupt muß auch aufgerufen werden

Wirklich? Live getestet? Ich würde das Gegenteil vermuten. Die ISR muss 
NICHT aufgerufen werden.

> oder dessen Flag händisch gesetzt werden.

Das ist was anderes.

von Peter D. (peda)


Lesenswert?

Falk B. schrieb:
> Wirklich? Live getestet? Ich würde das Gegenteil vermuten. Die ISR muss
> NICHT aufgerufen werden.
>
>> oder dessen Flag händisch gesetzt werden.
>
> Das ist was anderes.

Das Flag muß gelöscht werden, sonst wird der ADC nicht nochmal 
getriggert.
Ob automatisch (Interrupt) oder händisch (Setzen), ist egal.

von Falk B. (falk)


Lesenswert?

@  Peter Dannegger (peda)


>>> oder dessen Flag händisch gesetzt werden.

>Das Flag muß gelöscht werden, sonst wird der ADC nicht nochmal
>getriggert.

Verständlich.

>Ob automatisch (Interrupt) oder händisch (Setzen), ist egal.

Das hast du aber vorher missverständlich formuliert. Jetzt ist es klar 
;-)
Eigentlich kann man Interrupt-Flags gar nicht per CPU setzen! Man kann 
nur eine 1 reinschreiben, wodurch sie GELÖSCHT werden. Eine der wenigen 
Ausnahmen sind die FORCE Bits der Output Compare Funktionen.

von Peter D. (peda)


Lesenswert?

Falk B. schrieb:
> Das hast du aber vorher missverständlich formuliert.

Ich fand das "... oder ..." doch recht eindeutig.

von Falk B. (falk)


Lesenswert?

@ Peter Dannegger (peda)

>> Das hast du aber vorher missverständlich formuliert.

>Ich fand das "... oder ..." doch recht eindeutig.

The receiver makes the messeage. Mich hat das "oder dessen Flag
händisch gesetzt werden." irritiert. Egal, jetzt sind wir alle schlauer! 
Danke.

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Also da stellen wir uns mal ganz dumm und schauen ins Datenblatt:
> "Up to 15 kSPS at Maximum Resolution"

Die entscheidende Wortgruppe ist hier aber "at maximum resolution". D.h. 
nämlich nichts anderes als: man kann (natürlich auf Kosten der real 
nutzbaren Auflösung) die durchaus die Samplerate erhöhen.

> Ist also meilenweit entfernt von 156kHz PWM.

Ja. Als grobe Faustformel für überschlägige Abschätzungen kann man 
sagen: Jede Verdoppelung der Samplerate kostet etwa ein Bit nutzbare 
Auflösung für die Einzelmessung. In der Praxis ist es aber nicht ganz so 
schlimm. Bei 156kHz etwa wären 7Bit effektiv nutzbare Auflösung unter 
entsprechenden Randbedingungen durchaus noch realistisch (siehe dazu 
insbesondere den letzten Absatz).

Und, wie schon angemerkt, gilt das nur für eine Einzelmessung. Die 
erstmal "unbenutzbaren" Bits am unteren Ende wackeln dann natürlich 
recht stark, aber sie wackeln statistisch nicht zufällig, sondern in 
ziemlich starker Korrelation zur zu messenden Größe. D.h. mit der 
entsprechenden Auswertung kann man dann über mehrere Samples hinweg doch 
wieder zur (fast) vollen Genauigkeit gelangen, das aber natürlich dann 
auch wieder nur entsprechend langsamer. Insgesamt also eine sinnlose 
Spielerei?

Nein, ist es nicht, jedenfalls nicht immer. Z.B. nicht für 
Regler-Anwendungen. So ein Konstrukt ermöglicht es nämlich z.B., einen 
vergleichsweise extrem schnellen PD-Regler für's "Grobe" mit einem 
deutlich langsameren, aber dafür "vollgenauen" I-Regler zu kombinieren, 
was in der Praxis z.B. zu erstaunlich guten Schaltreglern führen kann, 
mit Regeleigenschaften, die bei sklavisch-uninspirierter Anwendung der 
Vorgaben von Atmel völlig unmöglich zu realisieren wären. Man muß 
einfach auch zwischen den Zeilen der "data sheets" und "application 
notes" lesen können und in der Lage sein, mehrere solcher Dokumente 
logisch konsistent zusammenzuführen, um weiter gehende Schlüsse daraus 
ziehen zu können...

Worauf allerdings bei solchen Extremanwendungen des AVR8-ADC noch viel 
mehr Wert zu legen ist, als normalerweise sowieso schon, ist der analoge 
Teil der Sache. Inbesondere ist hier dafür zu sorgen, dass die wirksame 
Quellimpedanz der Messgrösse ausreichend gering ist. Die von Atmel für 
die Normalanwendung vorgegebenen 10kOhm sind dann zu viel. Je höher sie 
Samplerate ist, die man zu nutzen gedenkt, desto kleiner muss die 
Quellimpedanz sein. Der Zusammenhang ist (näherungsweise) umgekehrt 
proportional. D.h. für das Beispiel mit 156kHz wären etwa 1 kOhm als 
Quellimpedanz angemessen. Nur unter dieser Voraussetzung ist wirklich 
das zu erreichen, was ich oben beschrieben habe...

von Cyril F. (lea)


Lesenswert?

Hallo,
 frequenz von PWM stimmt nicht das war ein Schreibfehler sorry ... also

  PWM Frequenz ist:16000000/1*1024=15625 Hz
  ADC Frequenz ist:16 MHz /128= 125 KHz

zwischen ADC und PWM kommt einen PI Spannunugsregler ich muss eigentlich 
die Spannung eines Buck Converter konstant halten, ich kann leider die 
Frequenz von adc nicht mehr mit Vorteiler runtersetzen. Deswegen muss 
ich das Frequenz von adc auf PMW Frequenz synchronisieren; die 
Synchronisierung ist notwendig sonst  bekommt den PI Regler immer neue 
werte von dem ADC und schickt neu Duty cycle zum PWM  was negative 
einfluss  auf das system hat... sorry ich kann nicht gut Deutsch 
schreiben ich hoffe das ihr mich verstanden ..
das ist meine code ADC+PWM

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>


//global varialbles


//...............................

/*------------------PWM--------------------*/
void pwm_init()
{

  TCCR1A = (1<<WGM10)|(1<<WGM11)    // fast pwm 10 bits
  |(1<<COM1A1)|(1<<COM1B1);         // non inverting mode
  TCCR1B = (1<<WGM12)               //  fast  pwm 10 bits
  |(1<<CS10);              // FREQUENZ PRESCALER 16000000/1*1024=15625 
hzentsprecht T=0,000064 s
  // make sure to make OC0 pin (pin PB3 for atmega32) as output pin

  DDRD |= (1<<PD5);      // OCR1A
  DDRD |= (1<<PD4);   // OCR1B


}
/*------------------ADC--------------------*/

uint16_t ADCtheTenBitResults;

int main(void)
{
  DDRC    = 0b11111111; // Pins 0-7 als Ausgang
  ADCSRA |= 1<<(ADPS2)| (1<<ADPS1) | (1<<ADPS0) ; // FREQUENZ VORTEILER 
=64 DES ADC 16MhZ/128= 125 Khz
  ADMUX  |= 1<<REFS0 ;  // Vref=5V
  ADMUX  |= 1<<MUX0  ;  // ADC CHANNEL 1 (EINGANG)
  //ADCSRA |= 1<<ADATE ;  // ADC FREE RUNNING
  ADCSRA |= 1<<ADEN  ;  // Enable ADC
  ADCSRA |= 1<<ADIE  ;  // Enable ADC conversion complete interrupt



  sei();

  ADCSRA |= 1<<ADSC  ;  // Start the first conversion

  // initialize  PWM mode
  pwm_init();

  uint16_t duty;



  // run forever
  while(1)
  {

    if(ADCtheTenBitResults<512)
    {
      PORTC =  0b11111111;
    }
    else{
      PORTC =  0b00000000;
    }

    duty = ADCtheTenBitResults ;
    // OCR1A = duty;
    OCR1B = duty;
  }



}

ISR(ADC_vect)
{
  uint8_t theLowADC = ADCL;

  uint8_t thehighADC = ADCH;

  ADCtheTenBitResults = thehighADC<<8 | theLowADC;





    ADCSRA |= 1<<ADSC;
}

von Cyril F. (lea)


Lesenswert?

das war ein  schreibfehler adc=125 KHz
                           PWM= 15625 Hz

von Falk B. (falk)


Lesenswert?

@ Cyril Feddag (lea)

> frequenz von PWM stimmt nicht das war ein Schreibfehler sorry ... also

>  PWM Frequenz ist:16000000/1*1024=15625 Hz
>  ADC Frequenz ist:16 MHz /128= 125 KHz

F.B. 10 points ;-)

Da der ADC 13 Takte zur Wandlung braucht, hat man bestenfalls 9,6kHz 
ADC-Abtastrate. Man kann also nicht jeden PWM-Takt ausmessen.

>zwischen ADC und PWM kommt einen PI Spannunugsregler ich muss eigentlich
>die Spannung eines Buck Converter konstant halten, ich kann leider die
>Frequenz von adc nicht mehr mit Vorteiler runtersetzen.

Das Gegenteil ist nötig, die muss HÖHER!

> Deswegen muss
>ich das Frequenz von adc auf PMW Frequenz synchronisieren; die
>Synchronisierung ist notwendig sonst  bekommt den PI Regler immer neue
>werte von dem ADC und schickt neu Duty cycle zum PWM  was negative
>einfluss  auf das system hat...

Kann sein, glaub ich aber nicht so ganz.

An deinem Code ist noch viel zu tun, da fehlt einiges.

von Cyril F. (lea)


Lesenswert?

Ingo L. schrieb:
> Hallo Cyril,
> ich habe keinen fertigen Code den ich dir "schicken kann".
> Weiter wurde bereits alles gesagt, du kannst mit dem ADC des AVRs nicht
> jeden PWM-Zyklus abtasten, dafür is der zu langsam, siehe hier:
>> > Erst mal ist das alles VIEL zu schnell für einen AVR-ADC.
>
> Weiter wundert es mich, dass du in deiner Masterarbeit nicht selbst in
> der Lage bist, das selbst zu erkennen. Du willst mal ne Führungskraft
> werden!!!.

Hallo Ingo,
 danke dir für deine Antwort... ich glaube man kann nicht stark in alle 
Bereichen ich mache mehr mit Matlab Simulink (Regelung), das ist erstes 
mal dass ich mit Mikrocontroller "programmiere"

von W.A. (Gast)


Lesenswert?

Falk B. schrieb:
> Da der ADC 13 Takte zur Wandlung braucht, hat man bestenfalls 9,6kHz
> ADC-Abtastrate. Man kann also nicht jeden PWM-Takt ausmessen.

Jede Synchronisation eines Signals auf einen Takt macht nichts anderes. 
Die Taktflanke ist als Chance für eine Aktion zu sehen. Es muss nichts 
passieren. Aber wenn etwas passiert, geschieht es in fester 
Phasenbeziehung zum Takt.

von Cyril F. (lea)


Lesenswert?

W.A. schrieb:
> Falk B. schrieb:
>> Da der ADC 13 Takte zur Wandlung braucht, hat man bestenfalls 9,6kHz
>> ADC-Abtastrate. Man kann also nicht jeden PWM-Takt ausmessen.
>
> Jede Synchronisation eines Signals auf einen Takt macht nichts anderes.
> Die Taktflanke ist als Chance für eine Aktion zu sehen. Es muss nichts
> passieren. Aber wenn etwas passiert, geschieht es in fester
> Phasenbeziehung zum Takt.

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.