- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 31

Thema: Frequenz in analoge Spannung wandeln

  1. #21
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thoralf
    Registriert seit
    16.12.2003
    Ort
    Dresden
    Beiträge
    530
    Anzeige

    Powerstation Test
    zum Abgriff des Signal von der Zündung steht hier auch was:
    https://www.roboternetz.de/phpBB2/ze...170&highlight=

    Wenn deine Kiste nicht grade ne Magnetozündung hat (wo ich mir den Signalabgriff schwierig vorstelle), geht es im Prinzip so wie Jacko sagt. Nur .... dort liegt eine ziemlich hohe Selbstinduktionsspannung an. Die wird zwar bei modernen Zündanlagen Per Zenerdiode geclipped aber nicht auf 0...5V.
    Wenn du dort das Signal abgreifst, dann über Vorwiderstand von sagen wir 10 kOhm und 5V-Zenerdiode gegen Masse. Dann überlebts auch der ATMega.

    Prinzipiell würde ich IMMER bei Basteleien, die nicht nur am grünen Tisch laufen sollen, alle Analogeingänge durch Zenerbarrieren schützen. Ein wegen Induktions- oder anderer Störspannungen zerknallter µC kostet mehr als ne lappsche Zenerdiode.

  2. #22
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Wenn deine Kiste nicht grade ne Magnetozündung hat (wo ich mir den Signalabgriff schwierig vorstelle), geht es im Prinzip so wie Jacko sagt.
    Wenn das Ding ein Polrad hat, was ich annehme, sollte es am einfachsten mit einem Magnetfeldsensor machbar sein.
    Das Teil läuft mit 5V und Angst wegen vagabundierender Hochspannung braucht man auch nur wenig haben, es sei denn man legt die Signalleitungen direkt neben das Zündkabel.

    Zum Thema Codeschnipsel:

    Zuerst die beiden Interruptroutinen zur Ermittlung der Drehzahlen:
    Code:
    /* Turn registers saving off */
    #pragma savereg-
    // External Interrupt 1 service routine Drehzahlmesser impulseingang
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
        new_drimp=1;
        #asm
        PUSH r26
        IN r26,SREG
        PUSH r26
        PUSH r27
        
        ;*** Erste Phase der Drehzahlermittlung mittels Timerabfrage = Periodendauermessung ***
        IN r26,TCNT0            ;Aktuelle Zeit holen
        LDS r27,(_li_oldtimer)  ;Vorherigen Wert holen
        STS (_li_oldtimer),r26  ;Vorheriger alten Wert überschreiben
        SUB r26,r27             ;Unterschied berechnen
        STS (_li_drwert),r26    ;Die berechnung als Wert abspeichern
        
        LDS r26,(_li_timer+1)     ;Das gleiche für die 2te Stelle _li_timer+1 ist der überlauf des TCNT0
        LDS r27,(_li_oldtimer+1)
        STS (_li_oldtimer+1),r26
        SBC r26,r27
        STS (_li_drwert+1),r26
        
        LDS r26,(_li_timer+2)       ;Das gleiche für die 3te Stelle
        LDS r27,(_li_oldtimer+2)
        STS (_li_oldtimer+2),r26
        SBC r26,r27
        STS (_li_drwert+2),r26
        
        LDS r26,(_li_timer+3)      ;Das gleiche für die 4te Stelle
        LDS r27,(_li_oldtimer+3)
        STS (_li_oldtimer+3),r26
        SBC r26,r27
        STS (_li_drwert+3),r26
        
        ;*** Zweite Phase der Drehzahlermittlung mittels Pulszählung ***    
        LDS r26,(_ui_intpulses)
        INC r26
        STS (_ui_intpulses),r26
        BRNE ENDINT1
        LDS r27,(_ui_intpulses+1)
        INC r27
        STS (_ui_intpulses+1),r27
        ENDINT1:
        POP r27
        POP r26
        OUT SREG,r26
        POP r26
        #endasm;
    }
    
    
    
    // Timer 0 overflow interrupt service routine Drehzahlmesser Pulsdauermessung
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
        #asm
        PUSH r26
        IN r26,SREG
        PUSH r26
        LDS r26,(_li_timer+1)
        INC r26
        STS (_li_timer+1),r26
        BRNE ENDINT0
        LDS r26,(_li_timer+2)
        INC r26
        STS (_li_timer+2),r26
        BRNE ENDINT0
        LDS r26,(_li_timer+3)
        INC r26
        STS (_li_timer+3),r26
        ENDINT0:
        POP r26
        OUT SREG,r26
        POP r26
        #endasm
    }
    /* re-enable register saving for the other interrupts */
    #pragma savereg+
    Nun der Teil der für die Sekundenzählung ( Torzeit ) und Mittelung der Drehzahlimpulse zuständig ist.
    Code:
    // Timer 1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    /* 1 Sekunde */
    ui_timer++;
    if (new_drimp>0)
        {
        li_drmittel+=li_drwert;      /* Aufaddierung für Drehzahlmittelwertbildung */
        uc_stellen++;                /* Aufaddierung der Stützstellen */
        new_drimp=0;                 /* Neue Drehzahl Flag löschen*/
        };                             
    if (ui_timer>19)
    {
        ui_drpulses=ui_intpulses;
        ui_intpulses=0;
        ui_timer=0;
        new_sec=1;
        uc_overflow++;
    }
    }
    Nun die Berechnung der Drehzahl

    Code:
    //Drehzahlermittlung
    if (ui_drpulses<3)      /* Drehzahlen unter 120 U/min werden ignoriert */
    {
        li_drehzahl=0;
    }
    else
    {
        if (ui_drpulses<350) /* Entscheidung welches Drehzahlermittlungsverfahren angewendet wird bei 21000 U/min*/
        {
            li_drmittel=li_drmittel/uc_stellen;        /* Mittelwert der Drehzahlmessungen errechnen */
            li_drehzahl=7500000/(li_drmittel*uc_blatt);  /* Periodendauermessung */
        }
        else
        {
            li_drehzahl=ui_drpulses;                   /* Pulszählung in Torzeit ( 1Sekunde )*/
            li_drehzahl=(li_drehzahl*60)/uc_blatt;
        }
    }
    ui_drpulses=0;   /* Pulszählung zurücksetzen */
    li_drmittel=0;   /* Mittelwertbildner zurücksetzen */
    uc_stellen=0;    /* Stützstellenzähler zurücksetzen */
    Und die dazugehörige Timer initialisierung
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 125,000 kHz
    TCCR0=0x03;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000,000 kHz
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    // CTC Mode : On
    TCCR1A=0x00;
    TCCR1B=0x0A;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0xC3;
    OCR1AL=0x4F;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x11;
    Die Routine arbeitet mit beiden möglichen Messmethoden und schaltet ab 350 Impulsen pro Sekunde ( ~21000 U/min ) zwischen den beiden Berechnungsverfahren um.
    Der Controller läuft mit einem externen 8MHz Quarz.

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    02.04.2008
    Ort
    Feldthurns
    Alter
    32
    Beiträge
    37
    hallo! ich habe mir den code angeschaut und finde den code von jaecko recht übersichtlich, eines brauche ich allerdings noch, und zwar wie ich den timer1 so einstelle dass er mir jede halbe sekunde überläuft? oder auch jede sekunde, das muss ich dann später anpassen...aber was schreibe ich denn da?

    Config Timer1 = ???

    keine ahnung was ein polrad ist, ich kann nur sagen es ist ein vespa motor, also ein älterer, baujahr ~ 1980. ist bei diesen motoren sowas üblich?

    wahrscheinlich trenne ich dann den zündstromkreis und den microcontroller galvanisch mit einem optokoppler, aber um das möchte ich mich später kümmern ^^

    vielen dank!!!!


    vielen dank

    @wkrug: vielen dank für deinen code! hobe jetzt aber doch mal probiert, das in Bascom zu realisieren, da ich es sehr angenehm finde. aber deinen code könnte ich mir zu herzen nehmen! vielen vielen dank!!

  4. #24
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Also bei sooo ner alten Vespa bin ich mir nicht sicher ob die schon ne CDI haben da bin ich ein bischen überfragt momentan aber da is google dein freund
    Du kannst mir auch mal das Modell schreiben oder einfach in meinem Forum nachfrage: www.scooter-point.de (Moderator Matthias-SP) dann kann ich dir eventuell dort helfen.

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Also der Timer-Init müsste so aussehen:

    Code:
    Config Timer1 = Timer, Prescale = x  ' Normaler Timer mit Prescaler x
    Timer1 = y  ' Timer mit y vorladen
    In der ISR des Timers gehört noch als erste Zeile ebenfalls "Timer1 = y" rein.

    Bei beiden musst du aber x bzw. y noch gegen die folgenden Werte austauschen, abhängig von der CPU-Frequenz:

    1 MHz: x = 8, y = 3036
    4 MHz: x = 64, y = 34286
    8 MHz: x = 64, y = 3036
    16 MHz: x = 256, y = 34286
    #ifndef MfG
    #define MfG

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    02.04.2008
    Ort
    Feldthurns
    Alter
    32
    Beiträge
    37
    @oZe: ja ist nicht besonders modern, glaub auch nicht dass die so was hat.

    danke jeacko! jetzt funktioniert es! aber ich verstehe nicht wie ich die zahlen abändern muss wenn ich z.b. den timer in 1s zeitintervall überladen will, oder z.b. 1/4 s

  7. #27
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Da gibts 2 Möglichkeiten...
    #1 Umständlich per Datenblatt raussuchen und rechnen
    #2 meine Favoritenlösung: Programm "RNAVR", gibts auch hier zum Download: https://www.roboternetz.de/phpBB2/dl...le&file_id=169
    #ifndef MfG
    #define MfG

  8. #28
    Benutzer Stammmitglied
    Registriert seit
    02.04.2008
    Ort
    Feldthurns
    Alter
    32
    Beiträge
    37
    hab das noch nicht ganz verstanden...in diesem programm muss ich die frequenz eingeben, dann bekomm ich bestimmte werte, aber die anzahl an interrupts pro sekunde(frequenz) ist doch variabel, immerhin sind di umdrehungen pro minute des motors doch nicht konstant.
    ich müsste die zeit halbieren bzw. verdoppeln, in der der timer überläuft

  9. #29
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2006
    Ort
    Dortmund
    Alter
    36
    Beiträge
    379
    Ne da haste wirklich was nicht verstanden:
    Du hast einen Timer der sagen wir mal einmal pro Sekunde überläuft. Dann hast du zusätzlich noch deinen Interrupt eingang an dem du die Zündimpulse entgegen nimmst. Jetzt startest du deinen Timer und beginnst zu zählen wieviele Interrupts von der Zündung ausgelöst werden. Nach einer Sekunde löst dein Timer dann seinen Interrupt aus und du kannst schauen wieviele Zündsignale du bis dahin erhalten hast. Das multiplizierst du einfach mit 60 und schon hast du deine Drehzahl pro Minute. Danach einfach wieder deinen Zähler zurücksetzten und das spiel geht von vorne los

  10. #30
    Benutzer Stammmitglied
    Registriert seit
    02.04.2008
    Ort
    Feldthurns
    Alter
    32
    Beiträge
    37
    jaja klar das habe ich schon verstanden

    aber im moment löst mein timer im abstand von einer halben sekunde sein interrupt aus, aber wie schaffe ich es, dass er es jede sekunde, oder jede viertel sekunde auslöst?

    edit: srysry, habe schon verstanden! habe ursprünglich gemeint das wären nicht dir timer interrupts sondern die interrupts dir mit dann das zündsignal auslöst
    danke

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen