Hallo zusammen, ich benötige dringend Hilfe im Umgang mit dem Input Capture Pin des ATMega16. Ich habe das Problem, dass die Flanken des Signals nicht richtig erkannt werden. Das PWM-Signal hat eine Frequenz von ca. 15kHz und ist durch ein Poti auf 0-100% (0-12V) einstellbar. Die Flanken werden allerdings nur erkannt, wenn ich wie ein Wilder am Poti drehe. Die periodischen Zyklen werden nicht erfasst. Ich nutze den ATMega16 mit einem 16MHZ externen Oszillator. Als Eingangsschaltung habe ich, die im Anhang befindliche genommen. Der Code sieht wie folgt aus: ISR(TIMER1_CAPT_vect) { if (fertig==1){return;} if ((PIND & (1<<PIND6))&&(status==0))//Wenn high an PD6 && status==1 { risinglow=ICR1L; risinghigh=ICR1H; rising = risinglow; rising += (risinghigh<<8); TCCR1B = 0x81 //on rising edge, noise canceler, @16MHZ Overflows=0; status=1; } else { fallinglow=ICR1L; fallinghigh=ICR1H; falling = fallinglow; falling += (fallinghigh<<8); TCCR1B=0xC1; fertig=1; status=0; } } ISR(TIMER1_OVF_vect) { Overflows++; } void main() { uint32_t counts; uint32_t countstemp; TCCR1A |= 0x00; TCCR1B = 0xC1; //Noise Canceler on, trigger on rising edge, no prescale (16MHZ) TIMSK |= (1<<TICIE1)|(1<<TOIE1); //Interrupt wird ausgelöst wenn ICF1 Flag gesetzt wird (edge detector hat rising edge flanke erkannt) while (1) { if (fertig==1) { countstemp = ((Overflows*65536) + rising - falling); counts = 1/(counts*0.0000000625); //16MHz Quarz lcd_cls(); lcd_zeichenkette("PWM="); lcd_varout(counts); lcd_zeichenkette("Hz"); lcd_zeile(2); lcd_varout(falling); lcd_varout(Overflows); fertig=0; } } } Die Variablen rising und falling, sowie risinghigh/low, fallinghigh/low sind volatile deklariert. Weiß jemand woran das liegen könnte, dass die Interrupts nicht ausgelöst werden? Danke vielmals für die Hilfe.
Hi, daran liegt es nicht. Das hab ich drin. Hab die Funktion in der das geschehen soll was oben beschrieben ist einfach main() genannt um es für die Leser einfacher zu machen. sei() wird aufgerufen, steht nur nicht in dieser Funktion, sondern ganz am Anfang, da ich noch Timer0 mit Overflows nutze. Aber vielen Dank für die Hilfe und vielleicht fällt dir ja noch was ein....
Oben noch einen Fehler im Kommentar entdeckt: TCCR1B = 0x81 //on "FALLING" edge, noise canceler, @16MHZ
Ich habe mit deinem Code im grossen ganzen keine Probleme in der Simulation (Anhang). Ich kann mir nur vorstellen, dass das Eingangssignel keine sauberen LOW/HIGH Pegel bringt. Hast du Möglichkeiten das Signal am Pin zu oszilloskopieren? Wenn dein Signal tatsächlich 0-12V bei 15 kHz hat, sehe ich keine Probleme. Von der Schaltung her erkenne ich einen Spannungsteiler mit R11/R12, um die 0-12V auf 0-3,84V zu bringen. Daneben sehe ich noch R7/C2 als passiven Tiefpass 1. Ordnung. Der dreht dem Ue=0-3,84V Signal bei 15 kHz die Gurgel auf 0,995 * Ue zu. http://de.wikipedia.org/wiki/Tiefpass#Tiefpass_1._Ordnung Daneben sehe ich noch R8 als (IMHO überflüssige) Strombegrenzung. Wenn dein Signal allerdings nur 6,25V am Eingang des Spannungsteilers hat, sieht es duster mit dem HIGH Pegel aus. Dein Potentiometer sehe ich im Schaltplan nicht und kann nicht beurteilen, was von den 12V@15 kHz am Spannungsteiler ankommt.
@ Stefan "stefb" B. (stefb) >Wenn dein Signal tatsächlich 0-12V bei 15 kHz hat, sehe ich keine >Probleme. Ich schon. >Von der Schaltung her erkenne ich einen Spannungsteiler mit R11/R12, um >die 0-12V auf 0-3,84V zu bringen. So weit, so gut. >Daneben sehe ich noch R7/C2 als passiven Tiefpass 1. Ordnung. Der dreht >dem Ue=0-3,84V Signal bei 15 kHz die Gurgel auf 0,995 * Ue zu. >http://de.wikipedia.org/wiki/Tiefpass#Tiefpass_1._Ordnung IRRTUM! Der Tiefpass wird durch R11/R12 bestimmt! Die liegen für den Tiefpass parallel, mach aber immer noch 32 kOhm Quellwiderstand. Mit C2 ergibt das ein Zeitkonstante von ~0,32ms! Macht eine 3dB Bandbreite von 500 Hz. Und damit willst du ein 15 kHz Digitalsignal messen? Eher nicht. Lass mal C2 weg und staune. Im Prinzip reicht ein Vorwiderstand von 10 kOhm zur Stombregrenzung als Pegelwandler. MFG Falk
Hallo zusammen, werde ich gleich heut Abend ausprobieren - Vielen Dank nochmals für die Hilfe. Heut Abend poste ich obs geklappt hat.
@ Falk Danke für die Richtigstellung. Man lernt nie aus (bin kein Fachmann sondern Laie/Hobbyist). Wenn du Zeit und Lust hast: mich interessiert, wie man die 32 kOhm Quellwiderstand ausrechnet. Mit meinen Rechnungen jetzt mit dem belasteten Spannungsteiler bin ich nämlich nicht weitergekommen.
@ Stefan "stefb" B. (stefb)
>wie man die 32 kOhm Quellwiderstand ausrechnet. Mit meinen Rechnungen
Nun, es ist wie bereits gesagt die *PARALLEL*schaltung von R11/R12.
Warum? Die Netzwerktheorie sagt das. Und wieso?
R7 und R8 weglassen, die fallen quasi sowieso raus. OK. Nun muss man vom
Kondensator in "Richtung" 12V PWM Signalquelle schauen. Das Signal
verzweigt sich vom Kontenpunkt R11/R12 jeweils nach R11/R12. Die
Signalquelle, welche eine Spannungsquelle ist, wird bei dieser
Betrachtung kurzgeschlossen. Damit liegen die Wiederstände effektiv
parallel. Kann man auch einfach mal in Pspice/Switchercad eingeben und
simulieren (AC-Analyse).
MfG
Falk
Danke! Statt Pspice/Switchercad habe ich die Schaltung in Electronic Workbench 3.5 (habe Demoversion aus Franzis-Buch) simuliert. Man sieht schön die fatale Wirkung des C2 auf das Signal an Pin D6.
Hallo, hab C2 rausgelötet und siehe da, kaum macht mans richtig - schon klappts:-) Vielen Dank für eure Hilfe und die kleine Exkursion in die Signalverarbeitung. Viele Grüße
@ Stefan "stefb" B. (stefb) >3.5 (habe Demoversion aus Franzis-Buch) simuliert. Man sieht schön die >fatale Wirkung des C2 auf das Signal an Pin D6. Vor allem sollte man sehen, dass die Grenzfrequenz NICHT durch R7*C2 bestimmt wird sondern durch (R1 // R12) * C2! MFG Falk
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.