- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 9 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 89

Thema: 1 Servo mit 2 Tasten ansteuer, aber wie :-(

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,

    ich habe die for schleife komplett raus genommen und nur
    OCRA++ mit 10 ms warten
    Dazu oben noch die Impulszeiten geändert.

    Wie bekomme ich jetzt 2 ansteuerungen von Servos hin?

    habe schon Ausgänge und OCRB benutzt, aber klappt nicht.

  2. #22
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich lese nun schon seit ein paar Tagen mit und verstehe nicht, warum ihr nicht einfach den Beispielcode aus dem RN-Wissen zu den Servos verwendet. Ein Timer im CTC-Mode und eine kleine ISR dazu steuert mehrere Servos, z.B. ein ATMega32 mit 8MHz und drei Servos:

    Code:
    #include <avr/io.h>			// I/O Port definitions
    #include <avr/interrupt.h>	// Interrupt macros
    
    uint8_t  x, y, z;
    
    void init(void)
    {
    	DDRA |= 16;				// E_INT1 als Ausgang
    	DDRC |= 3;				// SCL und SDA als Ausgang
    
    	TCCR0 =  (0 << WGM00) | (1 << WGM01);					// CTC-Mode
    	TCCR0 |= (0 << COM00) | (0 << COM01);					// ohne OCR-Pin
    	TCCR0 |= (0 << CS02)  | (1 << CS01) | (0 << CS00);	// prescaler /8
    	TIMSK =  (1 << OCIE0); 										// Interrupt ein
    	OCR0  = 9; // 100kHz?
    	sei();
    }
    ISR(TIMER0_COMP_vect)
    {
    	static uint16_t count=0;
    	if(count>z) PORTA &= ~16; else PORTA |= 16;	// E_INT1 (Pin8)
    	if(count>y) PORTC &= ~1;  else PORTC |= 1;	// SCL (Pin10)
    	if(count>x) PORTC &= ~2;  else PORTC |= 2;	// SDA (Pin12)
    	if(count<2000)count++; else count=0;
    }
    int main(void)
    {
    	init();
    	x=y=z=100;
    	while(1);
    	return 0;
    }
    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

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

    Danke für dein Beispielcode!!!
    Ich habe es grade mal kopiert und compilliert.
    Erhalte aber einige Fehlermeldung dazu:

    Compiling: main.c
    avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -DF_OSC=3686400 -MD -MP -MF .dep/main.o.d main.c -o main.o
    main.c: In function 'init':
    main.c:8: error: 'DDRA' undeclared (first use in this function)
    main.c:8: error: (Each undeclared identifier is reported only once
    main.c:8: error: for each function it appears in.)
    main.c:11: error: 'WGM00' undeclared (first use in this function)
    main.c:11: error: 'WGM01' undeclared (first use in this function)
    main.c:12: error: 'COM00' undeclared (first use in this function)
    main.c:12: error: 'COM01' undeclared (first use in this function)
    main.c:14: error: 'OCIE0' undeclared (first use in this function)
    main.c:15: error: 'OCR0' undeclared (first use in this function)
    main.c: At top level:
    main.c:18: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler
    main.c: In function 'TIMER0_COMP_vect':
    main.c:21: error: 'PORTA' undeclared (first use in this function)
    main.c:32:2: warning: no newline at end of file
    make.exe: *** [main.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:02


    Mein altes Program läuft ja! Also mit 2 Taster 1 Servo.
    Deswegen versuche ich mal das alte progamm zu erweitern.
    Will aber jetzt 4 Taster und 2 Servos anschliesen.

    Hab das hier mal versucht:

    Code:
    // Timer1 initialisieren 
    
    void timer1_init(void) 
    { 
     DDRB = ( 1 << PB1 )|( 1 << PB2 );  //PB1 und PB2 Als Ausgänge
     TCCR1A |= (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);  
     TCCR1B = (1<<CS11);  
     OCR1A = 75; // Servo1 auf Mittelposition vorstellen (40-120)
     OCR1B = 75; // Servo2 auf Mittelposition vorstellen (40-120)
    }
    Und dachte mir das ich jetzt auf PinB2 den 2 Servo steuern könnte, tut sich aber nichts...

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi,

    Danke für deinen Code!!!
    Ich kriege aber mehrere Fehlermeldung beim compillieren:

    main.c: In function 'init':
    main.c:8: error: 'DDRA' undeclared (first use in this function)
    main.c:8: error: (Each undeclared identifier is reported only once
    main.c:8: error: for each function it appears in.)
    main.c:11: error: 'WGM00' undeclared (first use in this function)
    main.c:11: error: 'WGM01' undeclared (first use in this function)
    main.c:12: error: 'COM00' undeclared (first use in this function)
    main.c:12: error: 'COM01' undeclared (first use in this function)
    main.c:14: error: 'OCIE0' undeclared (first use in this function)
    main.c:15: error: 'OCR0' undeclared (first use in this function)
    main.c: At top level:
    main.c:18: warning: 'TIMER0_COMP_vect' appears to be a misspelled signal handler
    main.c: In function 'TIMER0_COMP_vect':
    main.c:21: error: 'PORTA' undeclared (first use in this function)
    main.c:32:2: warning: no newline at end of file
    make.exe: *** [main.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:01


    Wie schon gesagt, mein altes Programm mit 2 Taster und 1 Servo geht ja jetzt. Will es jetzt erweitern und zwar die gleiche funktion wie bei Servo1 an Servo2. Habe dafür folgendes geschreiben:

    Code:
    void timer1_init(void) 
    { 
    
     DDRB = (1<<PB1)|(1<<PB2);   /* Pin PB1, PB2 als Ausgang für  Servo1/Servo2 */ 
    
     TCCR1A |= (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);  
     TCCR1B = (1<<CS11);  
     OCR1A = 80;  //Servo1
     OCR1B = 80;  //Servo2
    }
    Aber leider tut sich nichts an PB2

    Frage, dieses PWM was ich erzeuge, kann ich nur 3 Servos damit an einen Atmega8 ansteuern? Oder kann ich dieses PWM für mehrere benutzten?
    Mein Ziel, 2 Servos und noch eine L293D (mit 2 Gleichstrommotoren) zu betreiben.

  5. #25
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Die Fehler kommen da der Code für einen Mega32 geschrieben ist.

  6. #26
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Sorry, ich hätte auch dazuschreiben sollen, dass es ein Beispiel für einen ATMega32 ist. Wenn man aber irgendwo in diesem Thread auf ein blaues "Servo" klickt, kommt man direkt zur RN-Wissenseite. Dort ist das Beispiel zu finden, das als Vorlage zu meinem Code diente.

    Wie schon gesagt, mein altes Programm mit 2 Taster und 1 Servo geht ja jetzt.
    Ich dachte, du willst noch zwei Motoren per PWM ansteuern. Das wird aber schwierig, wenn du schon die Servos über PWM ansteuerst. Der ATMega8 hat nur 3 PWM-Kanäle...

    Code:
    TCCR1A |= (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
    Für's Ansteuern von OC1B(PB2) muss im TCCR1A auch das COM1B1-Bit gesetzt sein, oder? Und um Probleme durch falsch gesetze Bits zu vermeiden sollte man TCCR1A hier nicht mit |= sondern besser nur mit = beschreiben.

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Ich dachte man könnte die PWM für die 2 Gleichstrommotoren (über L293D) ansteuern und die 2 Servo dan über Software programmieren.
    Geht überhaubt sowas?

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Hier mal der Code für 2 Servos
    Code:
    #include <avr/io.h>         
    #include <stdbool.h>
    #include <stdlib.h>
    #include <avr/io.h>
    #include <AVR/iom8.h>
    #include <inttypes.h>
    //#include <util/delay.h>
    
    #define F_CPU 12000000    // clock
    
    // Timer1 initialisieren
    
    void timer1_init(void)
    {
     TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
     TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz
    
     OCR1A = 476; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
                 
     OCR1B = 476;
    }
    
     int main (void)
         {
    timer1_init();
    
    
         DDRB = (1<<PB1)|(1<<PB2);           /* Pin PB1 2  als Ausgang für Servo */
       
         DDRD  &= (~ (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1)); /* Pin D als Eingang */
         PORTD |= (1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1); /* Pull Up  aktivieren */
    
       
    while(1){
       if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */
       {
          OCR1A=450;
          }
       
       if (!( PIND & (1<<PIND3)))      /* mache was wenn PinD3 low ist */
       {
          OCR1A=499;
       }
       
       if (( PIND & (1<<PIND2))&&(PIND & (1<<PIND3))) {  /* Mitte wenn keine Taste */
        	OCR1A = 476;
       }
       if (!( PIND & (1<<PIND0)))      /* mache was wenn PinD0 low ist */
       {
          OCR1B=450;
          }
       
       if (!( PIND & (1<<PIND1)))      /* mache was wenn PinD1 low ist */
       {
          OCR1B=499;
       }
       
       if (( PIND & (1<<PIND0))&&(PIND & (1<<PIND1))) {  /* Mitte wenn keine Taste */
        	OCR1B=476;
       }
    }
    }
    Da auch noch SW-PWM dazumachen für die Motoren ist sicher auch noch eine knifflige Sache.

    Edit: Welche Frequenz hast du dir für die PWM vorgestellt.

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

    werde ich gleich mal testen. Ich habe 8Mhz eingestellt.

  10. #30
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Er meinte die Frequenz mit der die Spannung für die Motoren "zerkackt" werden soll. Hier ein (vielleicht) passernder Thread dazu:

    https://www.roboternetz.de/phpBB2/ze...?p=72521#72521

    Ups, der Link zum Datenblatt in dem Thread funzt nimmer:
    http://www.the-starbearer.de/Files/d...tter/l293d.pdf

    Man ist das zäh, auf Seite drei steht da:
    NOTES: A. The pulse generator has the following characteristics: tr 3 10 ns, tf 3 10 ns, tw = 10 ms, PRR = 5 kHz, ZO = 50 W
    PRR ist dann wohl die Max-Frequenz.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 3 von 9 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress