- Labornetzteil AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 33

Thema: Soft-PWM erstellen

  1. #21
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Anzeige

    Praxistest und DIY Projekte
    Du kannst jeden freien Pin nehmen, es besteht kein Zusammenhang mit einer Sonderfunktion.

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Mein Danke an alle, vor allen an Hubert!

    Diese Thema ist nun erledigt.

    Weiter gehts... was noch fehlt ist; Daten zwischen PC - µC per Funk zu senden.
    Aber erstmal, Platine zusammen bauen und in Forum weiter lesen.

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi,

    ich muss noch einmal Stören

    Also habe jetzt 2 Motoren (PC0 bis PC5) an den L293D angeschlossen.
    Links/Rechts -drehung
    1 Motor 100% / 50%
    2 Motor 100% / 100%

    Der 2 Motor dreht Rechts nicht mit 50%.

    Jetzt habe ich mal die Anschlüsse von 2 Motor (PC3 bis PC5) und 1 Motor (PC0 bis PC3) vertauscht.
    Jetzt bekomme ich diese % raus.
    Links/Rechts -drehung
    2 Motor 100% / 100%
    1 Motor 100% / 100%

    Das ist doch nicht normal oder?

    So sieht der Code aus:

    Code:
    void Getriebe100(void){
       if(takt>=10){ //Takt bis 10 zählen 
          takt=0; 
          PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100% 
    	  }
    }	  
    
    void Getriebe50(void){
       if(takt>=10){ //Takt bis 10 zählen 
          takt=0; 
          PORTC^=(1<<PC1)^(1<<PC4); //PortD3 toggelt 50%   
    	  }
    }
    Code:
    switch(rxwert){ 
       case 0x32 : 
          Getriebe50();
          PORTC|=(1<<PC0); // GLRückwärts 50%
          PORTC|=(1<<PC3); // GRRückwärts 50%	  
          break; 
       case 0x33 : 
          PORTC&= ~(1<<PC0); // GLRückwärts Stop 
          PORTC&= ~(1<<PC3); // GRRückwärts Stop	  
          break;
        case 0x38 : 
          Getriebe100();
          PORTC|=(1<<PC2); // GLVorwärts 100%
          PORTC|=(1<<PC5); // GRVorwärts 100%
          break; 
       case 0x39 : 
          PORTC&= ~(1<<PC2); // GLVorwärts Stop 
          PORTC&= ~(1<<PC5); // GRVorwärts Stop	  
          break; 
          }    
    	}

  4. #24
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Alle PortC auf Ausgang gestellt.
    Code:
    void Getriebe100(void){
       if(takt>=10){ //Takt bis 10 zählen
          takt=0;
          PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
         } 
    }
    Hier kannst du dir die Abfrage sparen und gleich so schreiben
    Code:
    void Getriebe100(void){
          PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
         }
    Die beiden Motoren wirst du ja schon mal untereinander vertauscht haben um eiinen Fehler dort auszuschließen. Sonst mal mit einem Oszi auf die PWM-Leitungen schauen ob auch wirklich PWM kommt und alles richtig verkablet ist.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi,
    danke für den Hinweiß.

    Problem 1 hat sich erledigt, du hattest recht, hatte nicht alle PortC als Ausgang deklariert! Zum Test, Motor 1 an Pin PC3 bis PC5 angeschlossen.

    Problem 2 besteht immer noch.
    Ich kann auch leider nicht mit einen Oszi nachschauen
    Leitung sind ok, auch wenn ich die 3 Leitungen von 2 Motor (A,B, Enable) vertausche, dreht der Motor immer schnell. An 2 Motor liegen dann 3,3V beiden Richtungen an.

    Der 1 Motor hat 3,0V Links und 1,0V Rechts.

    Hört sich an, ob der IC ein weg hat oder?

  6. #26
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Du müsstest eingentlich auch den Spannungsunterschied auf der PWM-Leitung vom µC her messen können. Kontrolliere auch noch ob die Leitungen auch wirklich richtig drauf sind, es ist mit auch schon passiert das ich etwas dreimal kontrolliert und jedesmal wieder falsch gemacht habe.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi,

    also folgende Werte habe ich beim µC gemessen gegen Masse:
    an PC1 und PC4 (PWM)
    3,2 V bei 100%
    0,6 V leer lauf
    1,9 V bei 50%

    Aus den µC kommt dann alles richtig raus oder?.
    Die verdrahtung auf der Platine ist ok.
    Ich denke mal, das beim löten der IC zuviel wärme abbekommen hat und dadurch der 2 Motor kaputt ist.

    Am IC Pin´s 3,6 und 11,14 ohne Last (Motoren) messe ich:
    • 100% 50%
      Pin 3,6 -5,52V +5,35V
      Pin 11,14 -5,52V +5,52V


    beim 2 Motoranschluss Pin 11,14 sind bei 50% 0,2V mehr...

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Sieht schon nach IC aus.
    Nur die Spannungen, 3,2V an PC1 und PC4, arbeitest du nicht mit 5V, dann sollten auf den Pins auch annähernd 5V sein. Du hast doch einen Mega8, sind AVCC und AGND richtig versorgt, dort auch die Spannung messen.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #29
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Jo,

    ich habe ja vorher einen Spannungsteiler und habe von dort aus gemessen. Mein Fehler. Ich messe auf Board

    Neue Werte:
    z.B. PC1 am µC
    2,6V und 1,3V - 100% und 50%

    Ich bestelle mal einen neuen IC dann wissen wir es

  10. #30
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    So wieder da

    Ich habe jetzt 2 IC. Aber geht trotzdem nicht
    Ich habe das Programm umgeschrieben und fahre jetzt nur mit 100%

    z.B. wenn ich den Befehl dafür geben vor/zurück/links/rechts zu drehen, drehen sich die 2 Getriebemotoren aber bleiben nicht stehen, muss paar mal drücken dann erst…
    Manchmal klappt die Funktion! <- Dachte zu erst Probleme mit Kommunikation (Max232)

    Aber:
    Die 2 Servos (Werden auch gesteuert) drehen sich ohne Probleme!
    Also ist die Kommunikation zwischen PC und µC in Ordnung.

    Was ich auch Bemerkt habe:
    Wenn ich den Befehl gebe vor/zurück/links/rechts zum drehen, werden die 2 Servos kurz mit bewegt.

    Hier der aktuelle Code:

    Code:
    #include <stdint.h> 
    #include <string.h> 
    #include <avr/io.h>          
    #include <stdbool.h> 
    #include <stdlib.h> 
    #include <avr/io.h> 
    #include <AVR/iom8.h> 
    #include <inttypes.h> 
    #include <avr/interrupt.h> 
    #include <util/delay.h> 
    
    #define F_CPU 8000000    // clock 
    #define   BAUD   9600 
    #define bauddivider (unsigned int)(F_CPU / BAUD / 16 - 0.5) 
    volatile unsigned char rxwert=0x30; 
    volatile uint8_t takt;    
    
    // Timer1 initialisieren 
    void timer1_init(void) 
    { 
     TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1  
     TCCR1B = (1<<CS12); 
       
     OCR1A =490; // Servo1 auf Mittelposition vorstellen (477-502) 
     OCR1B =478; // Servo1 auf Mittelposition vorstellen (477-502) 
    } 
    
    // Timer0 initialisieren 
    ISR(TIMER0_OVF_vect){ 
    takt++; 
    } 
    
    // UART initialisieren
    ISR(USART_RXC_vect){ 
    rxwert= UDR; 
    } 
    
    // COM1 initialisieren
    void usart_init(void){ 
    UBRRL = bauddivider;         //set baud rate 
    UBRRH = bauddivider >> 8; 
    UCSRB = (1<<RXCIE)|(1<<RXEN); 
    UCSRC = (1<<URSEL)|(3<<UCSZ0); 
    } 
    
    // Servo1 initialisieren
    void Servo1_init(void){
    switch(rxwert){ 
       case 0x51 : 
          if(OCR1A > 477){ /* Servo1 dreht bis min 477 dann stop */
            OCR1A--;      /* Pulsbreite verkürzen */ 
    		 _delay_ms(250);} /* 250ms warten */ 
    		      UDR = 'H';
     
          break; 
       case 0x52 : 
          /* Servo1 nichht drehen */  
    	  break; 
    	  
       case 0x57 : 
           OCR1A =490; // Servo1 auf Mittelposition 
          break; 
       case 0x58 : 
          /* Servo1 nichht drehen */  
    	  break; 
    
       case 0x45 : 
          if(OCR1A < 502){ /* Servo dreht bis min 502 dann stop */
            OCR1A++;      /* Pulsbreite verlängern */ 
    		 _delay_ms(250);} /* 250ms warten */
          break; 
       case 0x46 : 
          /* Servo1 nichht drehen */  
          break; 
            }  
          
        }
    
    // Servo2 initialisieren
    void Servo2_init(void){
    switch(rxwert){ 
       case 0x41 : 
          if(OCR1B > 472){ /* Servo2 dreht bis min 472 dann stop */
            OCR1B--;      /* Pulsbreite verkürzen */ 
    		 _delay_ms(250);} /* 250ms warten */ 
          break; 
       case 0x42 : 
          /* Servo2 nichht drehen */  
          break; 
    	  
       case 0x53 : 
           OCR1B =478; // Servo2 auf Mittelposition 
          break; 
       case 0x54 : 
          /* Servo2 nichht drehen */  
    	  break; 
    
       case 0x44 : 
          if(OCR1B < 490){ /* Servo dreht bis 490 dann stop */
            OCR1B++;      /* Pulsbreite verlängern */ 
    		 _delay_ms(250);} /* 250ms warten */
          break; 
       case 0x43 : 
          /* Servo2 nichht drehen */  
          break; 
            }  
          
        }
    
    // Getriebe 100% drehzahl initialisieren
    void Getriebe100(void){
        PORTC|=(1<<PC2)|(1<<PC5); // Motor läuft mit 100% 
    	 }	  
    
    // Getriebe 50% drehzahl initialisieren
    void Getriebe50(void){
       if(takt>=10){ //Takt bis 10 zählen 
          takt=0; 
          PORTC^=(1<<PC2)^(1<<PC5); //PortD3 toggelt 50%   
    	  }
    }	
    
    // Getriebemotoren initialisieren
    void Getriebe(void){
    switch(rxwert){ 
       case 0x32 : 
          Getriebe100(); //Geändert auf 100%
    	  PORTC|=(1<<PC0); // GLRückwärts 50%
          PORTC|=(1<<PC3); // GRRückwärts 50%	  
          break; 
       case 0x33 : 
          PORTC&= ~(1<<PC0); // GLRückwärts Stop 
          PORTC&= ~(1<<PC3); // GRRückwärts Stop	  
    	  break;
    
       case 0x34 : 
          Getriebe100();
    	  PORTC|=(1<<PC4); // GRVorwärtsRechts 100%
          break; 
       case 0x35 : 
          PORTC&= ~(1<<PC4); // GRVorwärtsRechts Stop 	  
          break; 
    	  
       case 0x36 : 
          Getriebe100();
    	  PORTC|=(1<<PC1); // GLVorwärtsLinks 100%
          break; 
       case 0x37 : 
          PORTC&= ~(1<<PC1); // GLVorwärtsLinks Stop 
          break; 
     
        case 0x38 : 
          Getriebe100();
    	  PORTC|=(1<<PC1); // GLVorwärts 100%
      	  PORTC|=(1<<PC4); // GRVorwärts 100%
          break; 
       case 0x39 : 
          PORTC&= ~(1<<PC1); // GLVorwärts Stop 
          PORTC&= ~(1<<PC4); // GRVorwärts Stop	  
          break; 
          }    
    	}
      
     
    int main(void) { 
    
    usart_init();
    
    DDRB = (1<<PB1)|(1<<PB2); // Pin PB1 und PB2 als Ausgang für Servo1/2       
    DDRC=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5);// PC0=M2Z,PC3=M1Z, PC2=Getriebe1, PC5=Getriebe2, PC1=M2V,PC4=M1V
    TCCR0=(1<<CS00); //kein Prescaler 
    TIMSK|=(1<<TOIE0); // Overflow Interrupt en 
    
    timer1_init(); 
    sei(); 
    
    for(;;){ 
    
    Getriebe(); 
    Servo1_init();
    Servo2_init();  
       
    } 
    }

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