- 3D-Druck Einstieg und Tipps    Werbung      
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

    E-Bike
    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
    63
    Beiträge
    5.799
    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  
    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
    63
    Beiträge
    5.799
    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. Bild  

    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  
    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
    63
    Beiträge
    5.799
    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  
    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
  •  

    Werbung      LiFePO4 Speicher Test