- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Timer und PWM

  1. #11
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398

    Timer funktioniert

    Anzeige

    E-Bike
    Ich habe jetzt noch etwas rumprobiert und dank eurer Hilfe funktioniert der Timer jetzt!!!


    In meinem C Programm rufe ich mit "pause_1(2000); //2 Sekunden pause " folgenden Code der oberhalb von void main{} steht

    Code:
    //timer
    int ms;
    void pause_1(ms)
    {
          while(ms){        // Schleife verlassen wenn ms=0 ist
                OPTION = 3;       // Vorteiler auf 16 einstellen 
                TMR0 = 100;       // 1/10M *4 *16*x    x=156   für 1ms 
                                            //256-156=100
                while (TMR0);     // abwarten einer Milisekunde 
                   ms--;          // "ms"-1 
          } 
    };//timer
    Zum testen habe ich 2 LEDs zum leuchten gebracht und in 30 Sekunden Abständen ( pause_1(30000) ) mit meiner alten Stopuhr gemessen. Ich weiss, dass das verglichen mit dem PIC sehr ungenau ist (wenn man in ms rechnet). Es war nur um grob zu wissen ob das Ergebnis möglich ist oder total falsch. Zwichen PIC und Stopuhr ist ein Unterschied von rund 2/10 Sekunden. Wenn man meine Reaktionszeit und die genauigkeit der Stopuhr berücksichtig, sollte so weit alles in Ordnung sein. Was genaueres zum messen habe ich hier nicht aber ich will ja mit meinem PIC der Atomuhr auch keine Konkurenz machen

    Da der Timer jetzt geschafft ist, würde ich gerne auch ein oder zwei Servos (PWM) ansteuen können.

    So viel wie ich weiss, müsste ein Servo bei 1,5 ms stehen bleiben und bei 2ms sich drehen.
    Reicht es dann wenn ich die Servos an + und - anschliesse und das dritte Kabel an einen Pin den ich dann mit meinem timer(1,5
    oder 2ms) immer auf High und Low setze?

    Grüsse,
    Tornado

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Hum, also ein Servosignal ist schon ein wenig raffinierter . Also, schon richtig, + kommt an VCC (5V gehen, nur ist der Servo da net am stärksten, glaub dass die ne Versorgung von so 6V haben wollen, aber net schlagen, wenn es abraucht ), - an GND und die Signal-Leitung (meist die weiße) an einen Ausgang des PICs.

    Das war also der Anschluss. Die Ansteuerung erfolg durch Frequenz mit einer Periodenlänge von 20ms. Von diesem sind 1 - 2ms High, der rest Low. Die High-Time bestimmt, _welche_ Position der Servo anfahren soll. Also bei 1ms fährt er auf die rechte Seite, bei 1,5ms bleibt er genau mittig stehen und bei 2ms schlägt er nach links aus. Je höher nun du die Auflösung von diesem 2ms-Pulsen gestalten kannst, desto genauer kannst den den Servo in die richtige Positon steuern. Also wirst du mit deinem TImer, der, wenn ich es richtig sehe, gerade nur ms-Auflösung kann den Sero in zwei Positionen ansteuern können (ganz links oder ganz rechts). Würdest du nun, sagen wir 500µs Auflösung haben, könntest du 3 Positionen anfahren, bei 250µs 5, bei 125µs 7, etc.
    (Quelle: erkenntnishorizont.de).

    MfG
    Mobius

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398
    Ich werde dann mal versuchen, dass sich dieses Servo erst mal nur nach rechts und links dreht und wenn dass klappt werde ich den Timer so verändern, dass ich verschiedene Positionen anfahren kann (Geschwindigkeiten)

  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398
    Hmm... der erste Versuch ist wohl gescheitert...
    Ich habe nur mal versucht mit meinem Timer einen Pin 2ms auf High und 18 auf Low zu setzen. Alles mit 5V (Auf einer INternetseite stand, dass Servos mit 5V betrieben werden können).
    Es hat sich aber nichts getan. Beim anschliessen macht der Motor einen kleinen "Sprung" und das war es dann auch schon.

    Hat jemand noch einen Tip? Kennt ihr eine Internetseite wo das mit Beispielen in C erklärt ist? RN Wissen habe ich mir schon durchgelesen, da sind aber leider keine Beispiele.

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398
    Wie steuert Ihr denn eure Servos an?
    Ich verstehe nicht warum das bei mir nicht funktioniert.

  6. #16
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398
    Kann mir wirklich keiner sagen, wie ihr eure Servos ansteuert?
    Vieleicht ist meine Frage etwas blöd, aber es funktioniert wirklich bei mir nicht.
    WÄre über hilfe wirklich sehr dankbar.
    Tornado

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    didum, didum...

    ka, wieso dieses Fragment gepostet wurde, also bitte löschen, wenn es keine Umstände macht...


    Mobius

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    shit... Sorry, das ganze Subforum wurd bei mir als "kein neues Thema" anzegeit, sodass ich deine beiden Posts irgendwie voll +bersehen habe.

    Also, zur Ansteuerung, hast du ein Osci um zumindest eine grobe Idee zu bekommen, wasür ein Signal du aussendest? Ohne dem wird die Fehlersuche ein wenig schwierig.
    Zur Ansteuerung, wenn du dem Servo ein 2 ms high, 18 ms low schickst sagst du ihm, dass er voll in die eine Richtung ausschlagen soll. Wenn nun die Periodendauern nicht ganz stimmen, sagen wir 2,7 oder ,28 ms, dann wird er dem Befehl versuchen "treu" zu folgen und das ist das characteristische Knacken des Servos, wenn er versucht weiter als den mechanisch möglichen Weg zu drehen (es exisitiert ein kleines Plastikstösel in dem Zahnrad, der ein überdrehen verhindert). Versuch es einmal mit 1 ms 19 ms (also Mittelstellung) und dreh vor dem Anschließen den Servo bis zu einem Anschlag auf die eine Seite. Wenn er dann nach dem Anschließen an den PIC fast in die Mittelstellung zurückfährt, dann funktioniert dein Code halbwegs.

    Wenn du interesse am Sourcecode hast, ich hab eines (nur Assembler), welches die Ansteuerung von theoreitsch bis zu 9 Servos wenn ich mich richtig erinnere (nicht 10, da ich noch ein wenig rechenzeit brauche und sich deswegen der 10. nicht mehr ganz ausgehen würde).
    Dieser benutzt aber 2 Timer (also sehr verschwenderisch ) und ist für einen 16F877(A) geschrieben. Die Ansteuerung hat also nur einen eher darstellenden Wert, dass man es auch so lösen kann .
    Auch kann ich dir auszüge aus dem Protokoll von der Laborübung zur Verfügung stellen, in dem die grundlegende Logik hinter der Schaltung erläutert wird, wenn ich sie in meinen Archiven wiederfinde.
    MfG
    Mobius

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398
    @Mobius
    Die Servos die ich habe sind schon gehackt und funktionieren (bei einem anderen Bot). Den alten Bot habe ich in der Uni gemacht, und die haben uns nur gesagt was wir eintippen müssen ohne zu erklären was wir eigendlich machen. Mein neuer Bot (den ich von 0 aufbaue um richtig zu lernen wie das funktioniert) hat aber einen anderen Quwartz. Daher kann ich die Formel die ich damals benutzt habe nicht gebrauchen.
    Lange Rede, kurzer Sinn...
    Das Problem ist die Programierung (in C).
    Ach ja, und ein Osci habe ich nicht
    Grüsse,
    Tornado

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.03.2005
    Ort
    Spanien
    Alter
    40
    Beiträge
    398

    Servo funktioniert

    Es hat zwar etwas gedauert, aber ich habe jetzt einen Servo zum laufen gebracht.

    Diese 1ms Auflösung war wohl nicht genau genug. Mit einem Timer mit 50us geht es jetzt.
    Ich kann ein Servo jetzt vor- und rückwÄrts drehen lassen.
    Zum stehen kann ich es aber noch nicht bringen. Wenn er eigendlich stehen müsste, fährt er rückwärts.

    Muss ich beim Servo anschliessen noch etwas beachten? Ich habe den Servo einfach an einen Ausgang von Port A gehangen. Dazwichen ist noch ein 270Ohm Wiederstand (weil ich dort vorher eine LED angesteuert hatte).

    Also, der Servo dreht. Aber es gibt ein Problem...
    der Pic wird heiss, sehr heiss. Ich habe mir eben die Pfoten verbrannt.
    Löschen oder umprogramieren kann ich den auch nicht mehr. Der scheint hinüber zu sein. Wie habe ich das hingekriegt? Das würde ich gerne wissen, um nicht noch einen PIC zu verbrennen.

    Hier kommt der fertige Code:
    Code:
    #include <pic1687x.h>
    #define PORTBIT(adr, bit)	((unsigned)(&adr)*8+(bit))
    //-------------------------------------------------------------------------
    
    int cont=0;
    
    //-------------------------------------------------------------
    void initial(){
        ADCON1=6; // PortA Pins als digital definiert 
        TRISA = 0x00;             //Port A  = Ausgang mit LEDs
        TRISB = 0b00011111;       //RB0 - RB4 = Eingänge, RB5 - RB7 =         
                                               //Ausgänge 
                                  //RB0 brauchen wir im Moment nicht
        PORTA = 0b00000000;
        PORTB = 0b00011110;       // RB5-RB7 auf Low  und RB1-RB4 auf High
                                 //RB1 - RB4 auch mit Pull-up Wiederständen auf High
    }//initial
    
    //timer                    us=50us
    int us;
    void pause_1(us){
          while(us){        // Schleife verlassen wenn ms=0 ist
                OPTION = 3;       // Vorteiler auf 16 einstellen 
                                  //  1/10M * 4 * 16 * x   x=8   für 50us
                TMR0=248;         //256-8=248
                while (TMR0);     // abwarten von 50us 
                   us--;          // "50us"-1 
          } 
    };//timer
    
    void job (){          // Servo fährt vorwärts
          if(cont==0){
                  PORTA = 0b00000001; 
                  pause_1(20);  //timer    20 *50us = 1ms
                  cont=1;        
          }    
          else{
                  PORTA = 0b00000010; 
                  pause_1(380);   // 380 * 50us = 19ms
                  cont=0;
          }         
    }//job
    //-------------------------------------------------------
    
    void main (void) 
    { 
       initial();
       
       do{   
               job();
                                                                                                                                          
       }while (1);                    //immer wiederholen
        
    }//()
    Viele Grüsse,
    Tornado

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad