- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: Toggle Geschwindigkeit über Poti verstellen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318

    Frage Toggle Geschwindigkeit über Poti verstellen

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich sitz momentan echt aufm Schlauch. Ich möchte über ein Potti die Toggle Geschwindigkeit eines Ausganges zwischen 0,2s und 5s verstellen. Das ganze linear.

    Momentan lese ich den ADC 0 ein und teile den Wert durch 20. So komme ich auf einen Bereich von ca 0-50. Jetzt habe ich einen Timer mit einer Frequenz von 10Hz. Beim überlauf des Timers lasse ich eine Variable hochzählen. Wenn nun die Variable den Wert des Poti´s erreicht hat, toggle ich den Ausgang. Das ganze funktioniert, aber nicht wirklich schön. Die Abstufungen sind mir zu grob. Ich hätte halt gerne das ich im Bereich von 0,2s bis 5s schön linear am besten mit den vollen 1023 Schritten regeln kann.

    Hier mein Code:

    Code:
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                         Chip Definition                                 ***
    '*******************************************************************************
    '-------------------------------------------------------------------------------
    $regfile = "m88def.dat"
    $crystal = 8000000
    $hwstack = 60
    $swstack = 40
    $framesize = 60
    $baud = 9600
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                              Ports                                      ***
    '*******************************************************************************
    '-------------------------------------------------------------------------------
    Config Pinb.0 = Input                                                           'Taster
    Config Pinb.1 = Input                                                           'Taster
    Config Pind.2 = Input                                                           'RC-Signal
    Config Pind.3 = Input                                                           'RC-Signal
    Config Portd.7 = Output                                                         'Led
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                             Timer                                       ***
    '*******************************************************************************
    '-------------------------------------------------------------------------------
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Timer_irq
    Const Timervorgabe = 53036
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                               ADC                                       ***
    '*******************************************************************************
    '-------------------------------------------------------------------------------
    Config Adc = Single , Prescaler = Auto
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                              Alias                                      ***
    '*******************************************************************************
    '-------------------------------------------------------------------------------
    Led Alias Portd.7
    Taster2 Alias Pinb.1
    Taster1 Alias Pinb.0
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                              Dims                                       ***
    '*******************************************************************************
    Dim Tick_ticker As Word
    Dim Adc_value As Word
    Dim Adc_ticker As Word
    
    
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                              Konstanten                                 ***
    '*******************************************************************************
    
    '_______________________________________________________________________________
    '*******************************************************************************
    '***                          Main / Hauptprogramm                           ***
    '*******************************************************************************
    '-------------------------------------------------------------------------------
    '--- Boot ---
    Portb.1 = 1                                                                     'Pullup aktivieren
    Portb.0 = 1                                                                     'Pullup aktivieren
    
    Enable Interrupts
    Enable Timer1
    
    
    '--- Main ---
    Main:
    
    Adc_value = Getadc(0)
    Adc_ticker = Adc_value / 20
    Print Adc_ticker
    
    Goto Main
    
    
    '--- Interrupt ---
    Timer_irq:
      Timer1 = Timervorgabe
      Incr Tick_ticker
    
      If Tick_ticker > Adc_ticker Then ' Wenn Wert von Variable größer als ADC Wert ist , dann löschen
       Tick_ticker = 0
      End If
    
       If Tick_ticker = Adc_ticker Then
          Toggle Led
          Tick_ticker = 0
       End If
    
    Return
    Kann mir jemand einen Tip geben, wie ich das ganze linearer hinbekommen könnte ?

    Danke und Gruß
    Kay

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Wenn du das ganze in 1024 Schritten linear haben möchtest, brauchst du erstmal ein sehr feines Poti für die 1024 Werte und das Poti sollte auch linear sein. Wenn das linear ist ist der Rest es auch

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    man könnte den Timer auf CTC einstellen mit

    CONFIG TIMER1 = TIMER , PRESCALE = 1024
    SET TCCR1B.WGM12 'CTC, TOP Ist OCR1A (weis nicht ob das im CONFIG TIMER Befehl geht)

    Bei 8MHz läuft er dann mit 7812,5 Hz was einer Periodendauer von 128µs entspricht.
    Um auf 5s zu kommen muß er 5s / 0,000128s = ca 39063 Takte laufen, also

    OCR1A = 39063 'als TOP Wert zuweisen

    Beim Topwert wird der COMPARE1A Interrupt ausgelöst

    ON COMPARE1A ISR_Toggle_LED
    ENABLE COMPARE1A
    ENABLE INTERRUPTS 'LED wird nun alle 5 Sekunden getoggelt.

    Mit Poti nun das OCR1A Register versorgen bis zu einem maximalen Wert von 39063

    39063 / 1023 = ca 38 besser 39 ?

    Also den vom ADC ausgelesenen Wert mit 39 multiplizieren und dem OCR1A in der Main zuweisen.

    Von ADC Wert 0 bis 41 würde es dann aber auch unter 0,2s toggeln; könnte man mit IF THEN abschneiden.
    Toggle Auflösung wäre pro ADC Schritt 39 * 128µs = ca 5ms.


    In der ISR steht dann nur: Toggle Led

    Wenn die Grenzwerte ganz genau eingehalten werden müssen, müßte man weiter überlegen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318
    Hi und Danke für die Antworten. Ich werde das morgen mal testen.

    Danke und Gruß
    Kayle
    ...::: AVRFreak :::...

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318
    Hi,

    vielen Dank für den Tip mit dem CTC Timer. Das Programm läuft soweit. Hier der Code:

    Code:
    '--- Chip ---
    $regfile = "m88def.DAT"
    $crystal = 8000000
    $baud = 9600
    $framesize = 40
    $hwstack = 40
    $swstack = 40
    
    '--- Ports ---
    Config Portb.1 = Output
    
    '--- ADC ---
    Config Adc = Single , Prescaler = Auto
    
    '--- Dim ---
    Dim Adc_wert As Word
    
    '--- Timer ---
    Config Timer1 = Timer , Prescale = 1024 , Compare_a = Toggle , Clear_timer = 1                      ' Timer auf CTC Mode setzen und Ausgang OCR1A togglen
    
    '--- Main ---
    Do
    
    Adc_wert = Getadc(0)                                                                                ' ADC einlesen
    
    Waitms 100                                                                                          ' 100ms warten
    
    If Adc_wert < 40 Then Adc_wert = 40                                                                 ' minimalen Wert von 40 einhalten / ca. 0,2s
    
    Ocr1a = Adc_wert * 40                                                                               ' Timer setzen
    
    Loop
    Mit diesem code kann ich nun zwischen ca. 0,2s - 5s die Toggle Geschwindigkeit einstellen und das sehr "smooth". Wenn ich nun auf 5s stellen und dann "schnell" auf 0,2s runtergehe, dann dauert es natürlich maximal 5s bis die 0,2s eingestellt sind. Wie kann ich dafür sorgen, das wenn der aktuelle per Poti eingestellte Wert kleiner ist, als der des OCR1A Registers den Timer "stoppt" und neu startet für die 0,2s ?

    Gruß Kay
    ...::: AVRFreak :::...

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    So vielleicht:

    Code:
    Ocr1a = Adc_wert * 40                   ' Timer setzen
    If Ocr1a < Tcnt1 Then Tcnt1 = 0         ' Zählregister anpassen
    
    Loop
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    42
    Beiträge
    318
    Hi,

    genau so funktionierts

    Danke für die Hilfe

    Gruß Kay
    ...::: AVRFreak :::...

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 19.04.2011, 12:36
  2. ISP Asuro --> fusebits verstellen
    Von applican im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 29.07.2007, 21:03
  3. durch Poti bei Atmel-Board Geschwindigkeit ansteuern
    Von mucahith im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 23.03.2007, 14:39
  4. Motor über Poti steuern
    Von FoCus im Forum Elektronik
    Antworten: 22
    Letzter Beitrag: 11.07.2006, 12:12
  5. Poti über uC Steuern
    Von Superhirn im Forum Sensoren / Sensorik
    Antworten: 8
    Letzter Beitrag: 28.04.2005, 16:22

Berechtigungen

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

Solar Speicher und Akkus Tests