Hallo Zusammen, wie würdet ihr am besten vorgehen, wenn ihr bei einem Rechtecksignal von ~600Hz von 0V-5V die Pulse mit einem AVR zählen wollt? Ich lasse über einen Shunt einen Strom eines DC-Motors fließen, und werte das Signal über einen OPV aus und bekomme ein feines Rechtecksignal. Nach 12 Rechteckimpulsen habe ich eine Umdrehung. Ist es generell möglich das Rechtecksignal wie folgt auszuwerten? Der AVR würde mit einem 16MHz Quarz beschaltet werden. Von der Frequenz her passt ja alles, 600Hz ist ja eigentlich "nichts". while(1) { if(eingang == 1 && merker == 0) { Motorpuls + 1; merker = 1; } if(eingang == 0 && merker == 1) { merker = 0; } if(Motorpuls == 12) { Motorumdrehung + 1; Motorpuls = 0; } } Oder soll man hierfür am besten einen "Pinchange Interrupt" anwenden? Oder direkt auf die externen Interrupts des Controllers?
Thomas R. schrieb: > werte das Signal über einen OPV aus und bekomme ein feines > Rechtecksignal. Dafür hättest du auch den internen Komperator nutzen können. Der ist genau für solche Sachen gedacht und dessen Ausgang kann u.a. auch zur Steuerung des ICP-Interrupts benutzt werden. Und genau den solltest du auch für deine Aufgabe nehmen, ist auch auf einen Pin rausgeführt. Du triggerst entweder auf fallende oder steigende Flanke (kannst auch ständig umschalten, wenn due H- und L-Teil einzeln messen willst). Der Rest ist ne einfache Subtraktion. edit: Ok, du willst ja gar nicht die Drehzahl wissen, sondern nur die Umdrehungen zählen... Aber auch da bieten sich die Timer/Counter an, die können auch externe Signale zählen. Da reicht bei dir ein 8bit-Counter, den setzt du auf -12. Bei Überlauf wird ein Interrupt ausgelöst. Dort erhöst du dann deine Zählervariable und setzt den Timer wieder auf -12. So läuft das alles schön im Hintergrund und du verpasst nichts. Und wenn du gar nichts anderes zu tun hast, kannst du das auch so machen wie vom dir angedacht, mit polling. Bisschen umständlich siehts aus, geht sicher "schöner". Trotzdem: machs lieber gleich richtig.
Danke für deine Antwort. Macht wohl sinn, das ganze über einen Interrupt laufen zu lassen, anstatt über Polling. Hab das ganze nun über den PCINT gemacht. Funktioniert auch einwandfrei. Da ich über den PCINT Vektor eh nur den einen Interrupt abfrage reicht dieser mir völlig aus um die Umdrehungen des Motors zu zählen. In der ISR frag ich nun einfach ab, ob ich den Motor rechts oder links laufen lasse, und zähl dann die Umdrehungen nach oben oder wieder nach unten.
Thomas R. schrieb: > Ist es generell möglich das Rechtecksignal wie folgt auszuwerten Im Prinzip ja, aber bei Motoren sind das wichtigste die Störungen. Eine primitive Zählung wird sich verzählen. Man baut in Software eine PLL, die weiss, wie dynamisch der Motor seine Drehzahl ändern kann und alle anderen Impulse verwirft. Alles andere führt nur zu gestörten Unsinnsregelungen. Ja, das ist etwas komplexer als dein bisheriges Programm.
Oder so :-) Kannst natürlich auch erst mal nur die Rohimpulse zählen (mit einer long-Variablen kommt man ganz schön weit) und immer nur dann wenn du dich dich für das Ergebnis tatsächlich interessierst durch 12 (bzw 24 wenn du beide Flanken zählst) teilen.
H.Joachim S. schrieb: > Bei Überlauf wird ein Interrupt ausgelöst. Dort erhöst du dann > deine Zählervariable und setzt den Timer wieder auf -12. Das sollte man genau nicht machen, da so Impulse verloren gehen können. Besser läßt man den Zähler durchlaufen und addiert 12 auf das Compareregister.
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.