- LiFePO4 Speicher Test         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 48

Thema: Nulldurchgangserkennung

  1. #31
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Anzeige

    E-Bike
    Also mit dem Int ist sehr gut. Nur der INT kommt nicht genau zum Zeitpunkt des Nulldurchgangs. Bei Int0 faling kommt er kurz danach, bei rising kurz davor.
    Wenn du bei einer Phasenanschnittssteuerung (oder wie immer das genau heisst) schon genau im Nulldurchgang abschalten willst, kannst du deine Lampe auch gleich am Schalter ausmachen.
    Wenn der Interrupt erst ein "bischen" später auslöst, sollte das nicht ganz so schlimm sein, denn ein "bischen" Spannung braucht eine Lampe auch bevor sie sichtbar leuchtet.

    Kommt natürlich drauf an, wieviel ein bischen ist, bzw. wann genau "kurz danach" ist.

  2. #32
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Ich denke mal die 0-10ms sind der dimmbare Bereich.

  3. #33
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    ja genau. die 0-10ms sind der dimmbare Bereich

  4. #34
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    @Getaco,

    könntest du mir deinen Code zur Verfügung stellen ?

  5. #35
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    49
    Beiträge
    33
    @blaueled
    kann ich, der steht auch schon irgendwo im forum(forum_dimmer***.bas), nur nicht gleich heute, muss noch arbeiten aber so in groben zuegen ->
    --------------------
    config timer1
    enable int0
    enable compare1a
    variabeln, etc...
    ---Hauptschleife---
    do
    Taster abfragen und auswerten
    Wenn Taster kuerzer als x ms dann Lampe toggeln
    Wenn Taster laenger als x ms dann Lampe dimmen
    loop

    ---Interrupt---
    timer1_code:
    decr zuendzeitpunkt
    wenn zuendzeitpunkt = lampen Helligkeit dann triac zuenden (set pinx.n)
    compare1a = naechster zuendzeitpunkt bei
    Return

    ---Nulldurchgang---
    int0_code:
    timer1 = 0
    compare1a = erster zuendzeitpunkt
    zuendzeitpunkt = 256
    Return

    end
    --- 255 Zuendzeiten ---
    data xxx,xxx,xxx

    Grobe erklaerung :

    Zu INT0:
    Bei einem Nulldurchgang wird Int0 ausgeloest und setz den zuendzeitpunktszaehler (wow was fuer ein wort) auf Null bzw auf 256, der timer wird auf null gesetz und compare1a auf den ersten (im wert niedrigsten aber in der helligkeit hoechste) wert gesetzt. Bei 10 MHz quartz und timer prescale 8 ist das so um die 400 oder 500.
    Diese erste wert entspricht etwa dem "kurz nach" dem Nulldurchgang der sinus kurve d.h. wenn du deinen Triac dann Zuendest hast du die volle welle.

    Zu Timer1 interrupt (eigentlich das compare1a interrupt) :

    wird nun der erste kleinste wert vom timer ereicht d.h. das compare1a interrupt ausgeloest, zaehlst du einfach einen zaehler von 255 um eins nach unten, vergleichst diesen wert mit dem deiner lampe wenn diese beiden gleich sind zuendest du. Bevor der return kommt noch schnell den naechsten comapre wert setzen,damit das spiel von vorne beginnen kann.

    zur Hauptschleife :
    Hier kanns du alles reinpacken was du willst nur , es darf nicht zu viel zeit "kosten" . Du brauchst in deiner hauptschleife nicht zu warten oder zu "pausieren" oder irgendwelche interrupte manuel auszuloesen, das geht alles von selbst.

    Klingt alles sehr verwirrend geb ich zu doch wenn du dir mein progi anschaust und ein bischen auseinander nimst wirst du es verstehen wenn nicht werd ich dir helfen,ich hab auch einige tage und wochen damit verbracht.

    Ich schreib dir nen richtigen code sobald ich zuhause bin

  6. #36
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    @Getaco

    Alles klar. danke schonmal

  7. #37
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    49
    Beiträge
    33
    Hier kuck mal.
    Code:
    $regfile = "m8535.dat"
    $crystal = 10000000
    
    Config Portc = Output
    
    '(
    Im Hauptprogramm Berechnest Du Aus Jedem Helligkeitswert(8 Bit) Die
    Entsprechende Anzahl Von Timerticks. Beim Nulldurchgang Löscht Du
    Deinen Timer Und Schreibst Die Timerticks Der Hellsten Lampe Ins
    Compare -register Deines Timers. Wenn Das Compare -reg Einen Ir Auslöst,
    Schaltest Du Die Lampe Ein Und Schreibst Den Wert Der Zweithellsten
    Lampe Ins Compare -reg , Usw.
    Fang Am Anfang Mit Nur Einer Lampe An. Dann Hast Du Nur Einen Wert Für
    Das Compare -register Und Dein Programm Bleibt Einfach. Wenns Läuft , Bau
    Die Anderen Lampen Ein!
    ')
    
    ' 8 chanel werter festleen an engem array !
    Dim Chanel_val(8) As Word
    Dim Temp_chanel_val(8) As Word
    Dim Trigger_chanel_num(8) As Byte
    Dim T As Byte
    Dim C As Byte
    Dim M As Byte
    Dim Idx As Byte
    Dim Chanel As Integer                                       'actuel chanel nummer
    Dim Comp As Integer
    Dim T_c As Integer
    Dim R_c As Integer
    Dim R2d2 As String * 1
    Dim R3d3 As String * 10
    
    
    
    Declare Sub Big_level() As Bit
    
    ' Offset NUll Duurchgang = 1750 ticks
    Chanel_val(1) = 1750                                        'MIN
    Chanel_val(2) = 1700
    Chanel_val(3) = 1600                                        '
    Chanel_val(4) = 1500                                        '
    Chanel_val(5) = 1400                                        '
    Chanel_val(6) = 1300                                        '
    Chanel_val(7) = 1200                                        '
    Chanel_val(8) = 1100                                        'MAX
    
    'Config Int0 = Rising
    Set Mcucr.isc01
    Set Mcucr.isc00
    
    ' Interrupts
    Enable Interrupts
    
    
    
    
    'timer configureiren
    Call Big_level
    Compare1b = 250                                             '12502
    
    Config Timer1 = Timer, Prescale = 8
    Config Serialin = Buffered, Size = 64
    
    
    
    Enable Int0                                                 'Null Durchgans erkennung
    Enable Compare1a                                            'timer1 interrupt
    Enable Compare1b                                            'timer1 interrupt
    
    On Int0 Int0_isr
    On Compare1a Timer_isr
    On Compare1b Port_reset
    
    
    
    
    
    
    Do
    R2d2 = Inkey()
    If Err = 0 Then
       If R2d2 <> "*" Then
          R3d3 = R3d3 + R2d2
       Else
          Print "Chanel 1 set to "; R3d3
          Chanel_val(1) = Val(R3d3)
          R3d3 = ""
       End If
    End If
    
    Loop
    
    
    
    
    'main routine
    'Timer_ticks_max = 12500                                     'bei prescale = 8 ass 12500
    'One_step = 50                                               'linear ticks
    
    
    
    
    
    
    
    
    
    Timer_isr:                                                  'compare1a interrupt
       T_c = Trigger_chanel_num(Chanel)
       Select Case T_c
          Case 1 : Set Portc.0
          Case 2 : Set Portc.1
          Case 3 : Set Portc.2
          Case 4 : Set Portc.3
          Case 5 : Set Portc.4
          Case 6 : Set Portc.5
          Case 7 : Set Portc.6
          Case 8 : Set Portc.7
      End Select
       Chanel = Chanel + 1
       If Chanel > 8 Then
          Chanel = 1
       End If
       T_c = Trigger_chanel_num(Chanel)
       Comp = Chanel_val(T_c)
       Compare1a = Comp
    Return
    
    
    
    
    
    Int0_isr:                                                   'Null Durchgangs Interrupt
       Timer1 = 0
       Start Timer1
       Chanel = 1
       T_c = Trigger_chanel_num(Chanel)
       Comp = Chanel_val(T_c)
       Compare1a = Comp
    Return
    
    
    Port_reset:
       Portc = 0
    Return
    Dieser code hat in etwa so bei mir funktioniert. experimentiere mal damit herum. Ist glaube ich auch ne bessere erklaerung als mein versuch vorhin

  8. #38
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    mal sehen, ob ich das richtig verstanden habe :

    nach jedem Nulldurchgang muss ich ja 0-10ms warten, bis ich den Triac zünde. Ich nehme mir also einen Timer und lege die Timerzeit fest ( z.B. 5ms ). Wenn nun Int0 auslöst, starte ich den Timer. Ist der Timer abgelaufen, zünde ich den Triac. Ist das so im groben richtig ?

  9. #39
    Benutzer Stammmitglied
    Registriert seit
    08.05.2005
    Alter
    49
    Beiträge
    33
    ja so im groben richtig, die feinheiten liegen in den timer werten die sich mit einer, zumindest für mich, Formel berechnen lassen. Wieviele triacs möchtest du eigentlich ansteuern ?
    mfg

    getaco


    ---------------------------------------------------------------------------------------------
    Programiere lang und erfolgreich.

  10. #40
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    also ich will 3 Dimmer bauen. aber für jeden Dimmer ist 1 AVR und 1 Triac vorgesehen. Also jetzt zum testen, habe ich einen Atmega 8 und nen Tic226. Also nur einen Triac. Wie berechnest du die Timer Werte denn genau ?

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress