Hallo an das Forum!
Ich habe mir alle Beiträge zur Pulsweitenmessung durchgelesen und
durchgedacht und das nicht nur auf dieser Seite.
Leider Funktioniert mein Programm noch immer nicht.
Im Anhang als Text Datei.
Ich verwende ein AVR Board zur Programmierung und zum Testen.
Ich habe das Programm mit den Interrupts aufgebaut.
Die LEDs verwende ich zur Kontrolle in welchem Programmteil der
uC(ATMega32) gerade ist.
Ich habe einen Schalter am ICP1 Pin mit dem ich Flanken simuliere,
leider kommt der Interrupt nicht und ich komme nicht dahinter warum.
Programmiert wurde mit AVR Studio 5 und einem AVRISPmk2.
Keine Warnungen und keine Fehler.
Die Spannung am ICP1 Pin liegt zwischen 0V und 5V beim Schalten
(gemessen).
Könnte mir jemand Verbesserungsvorschläge nennen oder mich auf den
Fehler bringen bitte?
Danke schon im vorhinein.
Mfg
Ok, hab jetzt als Hex zahl initialisiert. Hatte ich schon einmal ging
aber damals nicht. Jetzt schon!
Jetzt ist natürlich der Timer im Überlauf.
Aber ich habe gedacht das der Interrupt wieder verlassen wird, er bleibt
aber ständig im Overflow Interrupt.
Ist es richtig das wärend der Interrupts keine weiteren Interrupts
kommen können?
>er bleibt aber ständig im Overflow Interrupt.
Ob das wohl an deinen
wait_ms (1000);
in den Interrupts liegt? So ein Müll gehört
nicht in Interrupts, egal in welche.
Deine main() hat keine Endlosschleife.
OK habe ich rausgeworfen und die Messung müsste jetzt Funktionieren.
Das HP hat auch eine Endlosschleife bekommen.
Danke schon mal für eure schnelle Hilfe. Bin zwar Neuling aber sind doch
dumme Fehler.
Ich will jetzt ein PWM Signal aus der gemessenen Pulsweite erzeugen und
am OC0 ausgeben.
Es geht um eine Verbindung von der Fernsteuerung zu einem Motortreiber.
Die Geradengleichung soll zum Umskalieren dienen.
Pulsweiten von der Fernbedienung sind 1,4ms bei Stillstand und 2,1ms bei
Vollgas.
Laut meiner Rechnung sollte er von 11200 bis 16800 Zählen, je nach
Stellung.
Skalierung auf 0 bis 255 für Timer 0, der dann ein PWM erzeugen sollte.
Stimmt mein Grundgedanke? Kann das Funktionieren?
Danke
Noch ein paar Anmerkungen:
Ich denke das Stoppen und Zurücksetzen des Timers kannst du dir sparen.
Der kann einfach immer durchlaufen.
Ein Überlauf sollte hier egal sein, da es bei der Differenzbildung
wieder zu einem "Überlauf" kommt und somit auch bei einem
Counter-Überlauf das korrekte Ergebnis rauskommt (kaputt ist es erst,
wenn er innerhalb eines Pulses zwei mal überläuft). Der ganze
Overflow-Interrupt Geschichte kann also weg.
Variablen die du in der Interrupt-Routine änderst sollten als volatile
deklariert werden, ansonsten kann es sein, dass der Compiler da was rum
optimiert und Änderungen der Variable nicht berücksichtigt werden.
Ich würd's in etwas so machen:
(nicht getestet)
Danke! Dein Programm läuft auch ja!
Pulsweitenmessung sollte Funktionieren.
Jetzt habe ich ein nächstes Problem.
Ich will über einen BTN7970 Motortreiber auf den Motor.
Am IN Pin hänge ich den OC0 Pin an.(PB.3)
Das Programm gibt laut LED Anzeige ein PWM aus.
Es sind aber dauernd 5V am PB.3 Pin. Der Mittelwert der PWM sollte sich
doch verändern.
Es rührt sich aber auch nichts am Motor.
Habe es auch mit prescaler versucht da der BTN7970 mit bis zu 25kHz
arbeitet.
Mfg
Hasibeder Thomas schrieb:> Danke! Dein Programm läuft auch ja!>> Pulsweitenmessung sollte Funktionieren.
Was heißt 'sollte'?
Funktioniert sie oder funktioniert sie nicht!
Wenn du es nicht weißt, dann musst du dir eben einen Test überlegen, mit
dem du das feststellen kannst. Und zwar einen möglichst einfachen Test,
damit die Chance, dass du im Test selbst wieder Fehler hast möglichst
gering ist.
Gleich mal mit dem ermittelten Wert wieder auf eine PWM zu gehen, ist
für einen Profi vielleicht ein gangbarer Test-Weg, für einen Neuling
aber eher nicht. Für einen Neuling wäre der allerbeste 'Test', sich den
ermittelten Wert auf einem LCD oder über UART auszugeben, damit man die
Zahlenwerte sieht. Leider denken Neulinge immer, ausgerechnet sie sind
die Wunderwuzzi, die so etwas nicht brauchen und daher planen sie auch
bei ihren ersten Projekten keine Ausgabemöglichkeit ein. Was regelmässig
immer wieder zu Problemen führt. Aber gut, ist halt so.
Dann muss eben Plan B greifen und man muss den Test auf die aufwändige
Art und Weise machen: Eine LED an einem Ausgangspin. Ist der ermittelte
Messwert größer als eine Grenze, wird sie eingeschaltet, ist er kleiner
wird die LED ausgeschaltet. Durch Variation der Grenze kann man dann den
ermittelten Wert auch einigermassen gut feststellen. Was bei dir
natürlich insofern ganz gut funktioniert, weil du dann die LED 'vom
Fernsteuersender aus' durch Knüppelbewegung ein bzw. ausschalten können
müsstest und durch verändern des Grenzwertes im Programm den Schaltpunkt
am Knüppel 'verschieben' kannst.
Ohne so einen Test, bei dem man sich davon überzeugt, dass die
ermittelten Werte auch tatsächlich so sind wie sie sein sollten, ist es
jedenfalls unklug, da gleich mal die nächste Stufe - Ansteuerung
Motortreiber mittels PWM - drauf zu setzen. Du hast dann 2 Teilsysteme
im Programm, von denen du nicht weißt ob sie funktionieren oder nicht.
Alles was du siehst ist: nichts geht. Aber du hast keine Ahnung warum.
Sind die ermittelten Werte falsch oder ist die Motoransteuerung
fehlerhaft?
Und nein: nur weil der Compiler keinen Senf mehr zu deinem Programm dazu
gibt, heißt das noch lange nicht, dass es funktioniert. Der Compiler
kümmert sich darum, dass deine Grammatik korrekt ist. Um die Logik in
deinem Programm musst du dich schon selbst kümmern. Der Herr Duden hat
auch an dem Satz "Das Flugzeug strickt die Weltmeere." erst mal nichts
auszusetzen. Grammatikalisch ist alles korrekt. Aber die Logik, die
Bedeutung, ist völlig daneben.
Hasibeder Thomas schrieb:> Am IN Pin hänge ich den OC0 Pin an.(PB.3)> Das Programm gibt laut LED Anzeige ein PWM aus.> Es sind aber dauernd 5V am PB.3 Pin. Der Mittelwert der PWM sollte sich> doch verändern.
Hast du deine wait Funktion noch irgendwo in Verwendung?
Die nutzt nämlich Timer0, also den selben über den auch die PWM laufen
soll...
Hallo zusammen,
Ausgabe Funktioniert aber leider die Messung noch nicht.
Habe jetzt den prescaler auf /64 gestellt und den noise canceler. Nutzte
aber auch nicht. Zählt irgendwas und sollte mit dem prescaler auf 175
kommen bei stillstand.
Bin wider etwas ratlos obwohl die Sache sicher wider recht einfach ist.
Auf jeden Fall danke für eure Hilfe.
Ich habe schon einiges gelernt in den letzten Tagen und will auch in
Zukunft damit Modellautos programmiern und verwirklichen.
Mfg
Hallo,
Also irgendetwas jetzt nicht mehr da ich das Problem entdeckt habe.
Ich habe kein TTL Signal sondern nur einen Sprung von 0,2V was zu wenig
ist.
Versuche Morgen alles zu Kontrollieren.
Mein Plan sieht jetzt eine Messung über den ADC.
Theoretisch ja such möglich, Programmtechnisch sehe ich das Morgen.
Mfg
Hasibeder Thomas schrieb:> Also irgendetwas jetzt nicht mehr da ich das Problem entdeckt habe.> Ich habe kein TTL Signal sondern nur einen Sprung von 0,2V was zu wenig> ist.
Hast du einen µC mit der Fernsteuerungsmasse (GND) verbunden?
0.2V ist viel zu wenig. Aus einem Fernsteuerungsempfänger kommen Pulse
mit dem Hub der aktuellen Versorgungsspannung raus. ALso das, was dein
Akku zur Zeit gerade liefert. Also irgendwas rund um 5V. Mehr als genug,
dass dein Mega damit was anfangen kann.
> Mein Plan sieht jetzt eine Messung über den ADC.
Falscher Weg.
Du hast irgendein elektrisches Problem.
Und der Mega steckt 'wie ein Servo' an einem Servo-Ausgang?
Dann schliesst du ihn auch genau so an, wie ein Servo angeschlossen
werden würde.
Einzige Ausnahme: wenn der Mega seine eigene Stromversorgung hat, dann
wird die positive Versorgungsspannung nicht am Empfänger angeschlossen.
Aber Puls und Masse müssen auf jeden Fall an den Empfänger. (Also 'S'
und '-' am Sanwa Empfänger)
Ok Danke.
Weis nicht warum. habe ein bisschen herumgesteckt und jetzt ist alles
wie vorher aber es geht.
zumindest auf dem AVR Board.
Auf dem Steckbrett noch nicht.
Fehlt wohl etwas.
Mfg