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
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
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
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
Die Messung dauert min. 13µSec. <----- µSec. ist falsch -sollte cycle heissen
@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.
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
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...
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.
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
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.
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.
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!!!.
@ 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
@ 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.
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.
@ 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.
Falk B. schrieb: > Das hast du aber vorher missverständlich formuliert. Ich fand das "... oder ..." doch recht eindeutig.
@ 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.
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...
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; }
@ 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.
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"
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.