mhhh ... ändert leider nicht viel am ergebnis
kannst du mal ein paar bits opfern um den timerüberlauf mit zu erfassen wie ich es oben beschrieben habe?!
mhhh ... ändert leider nicht viel am ergebnis
kannst du mal ein paar bits opfern um den timerüberlauf mit zu erfassen wie ich es oben beschrieben habe?!
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Overflow sollte einen eigenen interrupt habenAnders kann das der Interupthandler auch nicht rausfinden
nur vom vorherigen wert auszugehen birgt das risiko einen vollen durchlauf zu verpassen
(ich bin nicht firm in Bascom und versteh den code nur ansatzweise!!!)
Worum es mir geht ist eine inkonsistenz deiner werte alle ~10 messungen, irgendwas passiert da dass das timing durcheinanderbringt!
Kannst du mir mal aufschlüsseln wie dein capture timer konfiguriert hast?! 8Mhz F_CPU sehe ich ja aber bei der timer init komm ich ins schleudern
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Hat Timer1. Erklärung s.u.
Die Programmteile stammen aus dem Simulator Programm.Kannst du mir mal aufschlüsseln wie dein capture timer konfiguriert hast?! 8Mhz F_CPU sehe ich ja aber bei der timer init komm ich ins schleudern
Mit zB "on timer1 check_icp_alive" werden die Interrupt Vektoren initialisiertCode:On Timer1 Check_icp_alive 'on timer1 overflow -> ISR Check_icp_alive On Icp1 Isr_get_icr 'on icp1 interrupt -> ISR isr_get_isr Start_record: Tccr1a = 0 'init timer1 Tcnt1 = 0 Ignition_seq = 0 Flag_rec_complete = 0 Tifr1.tov1 = 1 'reset eventually set TOV1 Flag Enable Timer1 'enable timer1 overflow interrupt Icr_old = Icr1 'not nessecary. artifact ? Enable Icp1 'enable ICP1 Interrupt Tccr1b = Bits(cs11 , Ices1) 'prescaler=8 timer1 clocked with 1MHz, ICP Interrupt on rising edge Portc.pc4 = 1 'rec LED on Return Isr_get_icr: Incr Ignition_seq Word_variable = Icr1 / 10 Firing_interval(ignition_seq) = Word_variable * 10 'letzte Dezimalstelle auf Null If Ignition_seq >= Sample_count Then 'array full, stop recording Disable Icp1 'disable ICP1 Tccr1b = 0 'init, stop timer1 Flag_rec_complete = 1 Ignition_seq = 0 End If Return Check_icp_alive: Firing_interval(ignition_seq) = Firing_interval(ignition_seq) + 1 'bei timer1 überlauf wird zum letzten gespeicherten ICR wert Eins addiert If Ignition_seq_old = Ignition_seq Then Flag_icp_dead = 1 Else Ignition_seq_old = Ignition_seq End If Return
Die "Start_record" ist ein Unterprogramm und wird mit Drücken der Record Taste aufgerufen.
Dort wird der Timer1 initialisiert und mit Vorteiler 8 gestartet. Läuft bei Systemtakt von 8MHz dann mit 1MHz, Periodendauer = 1µs. Vorteil: Den ausgelesenen Wert aus ICR1 kann man mit Einheit µs versehen. Hab noch ein paar Remarks im Code eingefügt. Mit den Interrupts scharf machen (enable) und Starten des Timers beginnt die Meßwertaufnahme.
Die ISR_get_icr ist eine ISR und wird durch den ICP Interrupt aufgerufen. Dort wird jetzt die letzte Dezimalstelle auf Null gesetzt. Wenn 256 Werte aufgenommen sind wird Timer1 gestoppt mit tccr1b=0 und der ICP Interrupt wieder disabled.
Die ISR Check_icp_alive wurde und wird bei Timer1 Überlauf aufgerufen und dient eigentlich dazu festzustellen, ob überhaupt ICP Interrupts (Zündimpulse) auftreten. Aussetzen kann passieren, wenn zB das Impulsabnehmerkabel nichts liefert. In dieser ISR wird jetzt zusätzlich dem letzten, vor dem Overflow gespeicherten ICR Wert, Eins aufaddiert. Falls sich da was verschluckt müßte an der letzten Stelle mal eine Zwei auftauchen. Eine Eins immer dann, wenn nach einer großen Zahl eine kleinere auftauscht.
Im Anhang die Werte mit diesem Programm.
Ich glaube, daß die Meßwerte stimmen. Die Ausreißer könnten von der Drehzahlregelung der Maschine kommen: Die Drehzahl sinkt langsam ab. Dann wird schnell auf höhere Drehzahl geregelt. Ein Ausreißer ist die Zündung auf dem Weg nach "oben". Dann sinkt die schnelle Drehzahl wieder langsam ab bis das Spiel von vorne beginnt.Worum es mir geht ist eine inkonsistenz deiner werte alle ~10 messungen, irgendwas passiert da dass das timing durcheinanderbringt!
Gruß
Searcher
Geändert von Searcher (12.06.2019 um 16:24 Uhr)
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Hallo,
nach einer Pause habe ich mir heute wieder den Drehzahlmesser vorgenommen. Um ein paar neue Daten für den Simulator zu bekommen wurde der Zweitakter mal auf ca. 4500Upm mit Hochdrehen der Standgasschraube eingestellt. Mitteln der Drehzahl per Auge am PC Bildschirm mit den hüpfenden Ausgaben.
256 Meßwerte mit Simulator aufgenommen und über den eigentlichen Drehzahlmesser gemessen. Gegenwärtige Glättung noch durch Aufaddieren der ICR Meßwerte in einem Anzeigeinterval (etwa eine Sekunde). Im Anzeige-Interrupt wird die Summe zusammen mit der zugehörigen Anzahl der Summanden in einem Array abgespeichert. Im Augenblick gibt es nur zwei Arrayelemente, die zyklisch überschrieben werden. Aus diesen Elementen wird dann noch ein einfacher Mittelwert gebildet und die Einerstelle auf Null gesetzt. Also wird der Wert aus dem vorherigen Anzeigeinterval mit dem aktuell auszugebenden verrechnet. In diesem Drehzahlbereich von ca. 4500Upm laufen etwa 160 Werte pro Anzeigeinterval auf. Das reicht um eine relativ ruhige Anzeige hinzubekommen. Der Motor läuft hier auch viel runder wie man in der grafischen Darstellung der einzelnen Zeiten zwischen den Zündungen sehen kann. Das Muster wie bei 2700Upm gibt es nicht mehr; die Meßpunkte sind viel zufälliger wie es scheint. Allerdings greift die Kupplung in diesem Drehzahlbereich, was auch wieder eine Störung hervorrufen könnte.
Ich wollte noch weitere Glättungen ausprobieren aber irgendwie hatte ich zwischen den umgerechneten Werten des Simulators im Excel und der gemessenen Drehzahl mit dem Drehzahlmesser immer etwa 60, 70 Upm zu wenig. Die Fehlersuche hat mich fast den ganzen Nachmittag beschäftigt. Oszi zeigte richtige Pulslänge vom Simulatorausgang an. Letzten Endes kam heraus, daß der Quarz am Drehzahlmesser um 100kHz zu schnell lief, also 8,1Mhz statt 8,0MHz. Das Ding hatte ich zuletzt ohne zu überprüfen ausgetauscht. Einen anderen 8.0MHz Quarz rein und alles war gut. Die RS232 zum PC hatte nichts gemerkt.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Ich bin immer noch nicht viel weiter. Allerdings ist die Schaltung des Drehzahlmessers jetzt auf eine Platine gebracht und ein Gehäuse ist auch gefunden; von einem HP-Druckernetzteil. Strom gibt es über einen 7805 vom Akkupack mit 6 NiMh AA-Akkus. Wär nicht unbedingt nötig, hatte ich aber gerade hier herumliegen. Es täte auch ein 9V-Block. Wird ersetzt wenn ein Display im Deckel den Platz braucht. Als Display fungiert im Augenblick mein altes IC-Grab über einen Klinkenstecker am UART angeschlossen. Ist vierstellig und Drehzahlen über 9999Upm werden zur Zeit mit Doppelpunkt signalisiert. Über die Klinke kann man natürlich auch Daten zum PC laufen lassen, um dort erweiterte Auswertungen vorzunehmen. Baudrate ist von 57600 auf 115200 erhöht.
Da hat mir Bascom noch einen Streich gespielt. Es verwendet nicht das U2X Bit zur Einstellung der Baudrate und bei dem 8MHz quarzgetakteten ATtiny2313 ist der Baudratenfehler dann 8,5%. Keine lesbaren Zeichen mehr am PC. "Manuelle" Nachbesserung mit U2X Bit bringt den Fehler laut Datenblatt auf -3,5%. Auf jeden Fall wieder guten Empfang.
Bild hier
Weiter gibt es noch eine blitzende LED, die ans Abschalten erinnern soll. Das Programmierkabel steckt noch und das blaue, zweiadrige Kabel geht rechts zum Simulator auf dem Steckbrett. Das Abnehmerkabel zum Zündkabel wird mit Minibananenstecker über die rote Buchse, rechts vom Ein-/Ausschalter verbunden.
Bevor ich einige der tollen Vorschläge zur Beruhigung der Anzeige von weiter oben im thread ausprobiere, möchte ich noch eine Umschaltung während einer Messsitzung probieren. So etwas wurde oben auch schon erwähnt. Allerdings möchte ich nicht zwischen Messung mit festem Zeitintervall und Impulsdauermessung umschalten, sondern nur bei niedrigen Drehzahlen die einfache Mittelwertberechung über einen längeren Zeitraum durchführen.
Bei höheren Drehzahlen, probiert habe ich mal 4500Upm, läuft der Zweitakter wesentlich ruhiger. Die letzte Methode mit Mittellung über ca. zwei Sekunden (zwei Anzeigezyklen) ist da schon gar nicht so schlecht. Die Ablesung im Leerlauf bei 2700Upm ist fast akzeptabel, wenn nur alle zwei Sekunden die Anzeige aktualisiert wird mit Mittellung über acht Sekunden. Die Reaktion auf Drehzahländerung ist dann natürlich echt zäh. Man hat beim Leerlauf allerdings auch nicht so ein Streß wie bei Vollgas und kann sich beim Einstellen Zeit lassen. Falls doch ein rechenintensiver Filter angewendet werden muß, dann nur bei niedrigen Drehzahlen. Das Programm ist dann auch nicht so zeitkritisch als wenn der Filter auch bei hohen Drehzahlen bis 16000Upm arbeiten muß.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Lesezeichen