www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 2 Motoren unterschiedlich ansteuern


Autor: Franki C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Werde aus der Sache nicht ganz schlau: Ich hatte erst gedacht man könnte 
bei dem Atmega8 zwei unterschiedliche PWM Signale mit unterschiedlicher 
Frequenz ausgeben. Jetzt stellt sich jedoch heraus, dass man zwar zwei 
verschiedene PWM Signale einstellen kann, jedoch nur bei einer Frequenz. 
Ich habe einen Servo den ich mit einer Impulszeit von 20ms (500Hz) über 
OC1A ansteure. Nun möchte ich aber mit Hilfe einer H-Brücke (L293D) 
einen DC-Motor über OC1B in zwei Richtungen ansteuern. Die 500Hz sind 
jedoch zu wenig, ich würde lieber zwischen 2 - und 4 kHz liegen. Wie 
bekomme ich das nun hin?
Hier mein Programm zum Ansteuern des Servos:
Ich sende Zeichen über RS232 zum Einstellen des Winkels.

#define FOSC 8000000UL // Clock Speed
#define BAUD 9600UL
#define MYUBRR ((FOSC+(BAUD * 8))/(16*BAUD))-1
// Servo Frame-Time:
#define FRAME_TIME 20 // msec

unsigned char USART_Receive( void );
void USART_Init( unsigned int);
void USART_Transmit( unsigned char);
void init_timer(void);

void main( void ){

unsigned char a = 'U';
unsigned char b;
int index;


            USART_Init (MYUBRR);
          init_timer();

    do{
      b=USART_Receive();

      if(b=='M'){
        OCR1A = 1400;
      }
      if(b=='R'){
        OCR1A = 2380;
      }

      if(b=='L'){
        OCR1A = 550;
      }
    }while(1);




}

Autor: Icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch den anderen Timer benutzen.

Autor: Franki C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Icke

inwiefern? sorry beim Timer tue ich mich etwas schwer..

Hier nochmal mein init_timer():

void init_timer(){

  // OC1A auf Ausgang
  DDRB = (1 << DDB1) | (1 << DDB2);

  PORTC |= (1<<PC0);
  PORTC |= (1<<PC1);

  ICR1   = FRAME_TIME * 1000;                      // PWM cycle time in 
usec
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); // OC1A/B clr on 
match, set on TOP
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11);    // TOP = ICR1, clk 
= sysclk/8 (->1us)
  TCNT1  = 0;                                      // reset Timer

  OCR1A  = 950;    // set Servo 1 to 1ms-position

}

Autor: Icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer 2 kann auch PWM allerdings nur 8 Bit.
Habe ich selbst noch nicht benutzt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.