- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: Servo-Steuerung

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    11.09.2007
    Ort
    Leipzig
    Alter
    44
    Beiträge
    31
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Die Funktion cli() sperrt die Behandlung von Interrupts, die Funktion sei() schaltet diese wieder ein. Also kann zwischen cli() und sei() kein anderer Interrupt irgendwelche Daten verändern.

    Gebraucht hatte ich dass, da ich zu Testzwecken ins TCNT-Register schreiben wollte um den aktuellen Zählerstand zu ändern. Und laut Doku sollen vorher alle Interrupts gesperrt werden.
    Na gut, laut Doku soll man auch alle Interrupts sperren, wenn man einen neuen Vergleichswert in OCR setzt. Vielleicht kann sich da jemand dazu äußern, der mehr Ahnung von der Sache hat.

    servo1_move() erwartet bei mir eine Gradzahl der Servos, rechnet und setzt den entsprechenden Vergleichswert OCR

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    So, ich hab mir jetzt diesen Code zusammengebaut.
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    //#include "servo.h"   //da meckert der irgendwie rum
    #include <util/delay.h>
    
    #ifndef F_CPU
    #define F_CPU 16000000
    #endif
    
    #define Scheinwerfer 0
    #define Rueckleuchten 1
    #define PWM_ServoPort 7
    
    int main(void)
    {
    cli();
    uint8_t i;
    TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0); //9-Bit PWM, Inverted Mode
    TCCR1B = (1<<CS12); 	//Prescaler 256
    
    DDRD |= (1<<PD5); 
    PORTD |= ( 1 << PD5 );
    //OC1A = 480;
    sei();
    
    while(1)
    {
    OCR1A = 480;
    for (i=0; i<=100; i++)
    {
    _delay_ms(10);
    }
    OCR1A =450;
    for (i=0; i<=100; i++)
    {
    _delay_ms(10);
    }
    
    }
    
    }
    Ich hab mir gedacht die Zeit für eine Periode ist [1/(16.000.000/256/512)*2]=16,384ms. In der zeit zählt der Counter 1mal hoch und runter. Also ist diese zeit auf 1024 (2mal 512) schritte aufgeteilt.
    und dann hab ich mit 3-Satz ausgerechnet, wieviele schritte 0,5 ms sind, da der impuls dann durch invertmode beim hochzählen 0,5ms von compare bis Top und beim runterzählen wieder 0,5ms von Top bis Compare dauert also 1ms.
    Die rechnung sieht so aus:
    512 - 8,192ms
    1 - 0,016ms ... 0,5ms/0,016 = 31,25
    31,25 - 0,5ms
    32 -0,512ms
    512-32=480 also OCR1A auf 480 stellen für Tein=1ms bei einer Periodendauer von 16,384.
    Wenn man das für Tein = 2ms ausrechnet kommt 450 raus.

    Hab ich da einen Denkfehler? Mein Servo macht nicht das was ich will.
    Hoffe es hat jemand lust sich damit auseinanderzusetzen. Würde mich auch jeden Fall freuen!!!

    Ach ja. Wegen #include "servo.h" meckert der irgendwie rum. Hab das erstmal kommentiert.

    MfG Jan
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Ich hab´s grade nochmal ausprobiert, und hab gesehen das es irgendwie doch klappt. der Servo fährt hin und her, nur er fährt nicht ganz in die jeweilige Endstellung. Der fährt ca. von 45° bis 135°. Ich versteh aber nicht wieso. Hab ich irgendwo "mal 2" vergessen? Wüsste aber nicht wo und wieso. Hab gemessen das sich mein 9V-Akku irgendwie auf 3V entladen hat. Macht mir irgendwie sorgen...

    MfG Jan
    Habe Mut, dich deines eigenen Verstandes zu bedienen.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress