Forum: Mikrocontroller und Digitale Elektronik Ansteuern von Servomotoren mit dem 8051


von Ben E. (wickedvibes)


Lesenswert?

Hallo Zusammen,

Vorab mein Vorhaben: Also ich habe ein Model eines Tauchroboters 
angefertigt, um diesen Roboter abtauchen zu lassen und unter Wasser zu 
steuern habe ich 4 Servomotoren verbaut. Jetzt möchte ich diese Servos 
mit hilfe des 8051er Board ansteuern, das Programm würde ich gerne in C 
schreiben, habe allerdings noch keine großen Erfahrungen was das 
Programmieren in C angeht. Kann mir da jemand weiterhelfen was das 
Programm alles enthalten muss!? Oder hat jemand vielleicht einen 
Quellcode an dem ich mich orientieren könnte?? Es wäre super wenn mir da 
jemand helfen könnte. Schon im Vorfeld vielen Dank für eure 
Unterstützung!!

Freundliche Grüße aus Mannheim

von Peter D. (peda)


Lesenswert?

Ben Ehrle schrieb:
> habe allerdings noch keine großen Erfahrungen was das
> Programmieren in C angeht.

Dann solltest Du erstmal die Grundlagen lernen, sonst verstehst Du 
andere Programme nicht.


Ben Ehrle schrieb:
> Oder hat jemand vielleicht einen
> Quellcode an dem ich mich orientieren könnte??

Ja, Google.

Z.B.:
http://mcu-programming.blogspot.com/2006/09/servo-motor-control.html


Peter

von Ben E. (wickedvibes)


Lesenswert?

Danke für deine Antwort. Ich habe ja schon mal etwas zusammen 
geschrieben (siehe unten). Macht das so sinn?? Und Wie komme ich auf die 
Pausen und Pulszeiten?? Bitte geht mit mir nicht so hart in die 
Kritik...



#include <c51rx2.h>

sbit Motor1 = P2_0 ;
sbit Motor2 = P2_1 ;
sbit Motor3 = P2_2 ;
// sfr at P2_3 LED1;
// sfr at P2_3 LED2;

#define Puls_10ms 10000

//sbit at P3_2 Taster;      // Taster für Motoren Aufwärts ////  Auf was 
muss geachtet werden?
//sbit at P3... Taster;      // Taster für Motor Rechts
//sbit at P3... Taster;      // Taster für Motor Links
//sbit at P3... Taster;      // Taster für LED1
//sbit at P3... Taster;      // Taster für LED2


void init_timer(){
  TMOD = 0b00010000;
  TR1  = 1;
  TF1  = 0;
  TH1  = ( 65536 - 1000 ) / 256;
  TL1  = ( 65536 - 1000 ) % 256;
}

void main(void) {
  int Puls1, Pause1;
  int Puls2, Pause2;
  int Puls3, Pause3;
  int Puls4, Pause4;

  unsigned char Zeitpunkt =1;

  init_timer();
  TR1 = 1;       //Timer 1 einschalten
  while (1){
   if (TF1 == 1) {

  if (Zeitpunkt == 1) {
         TH1  = ( 65536 - Puls1 ) / 256;
         TL1  = ( 65536 - Puls1 ) % 256;
         Zeitpunkt ++;
         P2_0 = 1; //Puls1 ausgeben
     }

  else if (Zeitpunkt == 2) {
         TH1  = ( 65536 - Pause1 ) / 256;    // Pause1 zum beenden des 
schritts notwendig
         TL1  = ( 65536 - Pause1 ) % 256;
         Zeitpunkt ++;
         P2_0 = 0; //Puls1 nullen
     }

  else if (Zeitpunkt == 3) {
       TH1  = ( 65536 - Puls2 ) / 256;
         TL1  = ( 65536 - Puls2 ) % 256;
         Zeitpunkt ++;
         P2_1 = 1; //Puls2 ausgeben
     }

  else if (Zeitpunkt == 4) {
         TH1  = ( 65536 - Pause2 ) / 256;    // Pause2 zum beenden des 
schritts notwendig
         TL1  = ( 65536 - Pause2 ) % 256;
         Zeitpunkt ++;
         P2_1 = 0; //Puls2 nullen
     }

   else if (Zeitpunkt == 5) {
     TH1  = ( 65536 - Puls3 ) / 256;
         TL1  = ( 65536 - Puls3 ) % 256;
         Zeitpunkt ++;
         P2_2 = 1; //Puls3 ausgeben
     }

  else if (Zeitpunkt == 6) {
         TH1  = ( 65536 - Pause2 ) / 256;    // Pause3 zum beenden des 
schritts notwendig
         TL1  = ( 65536 - Pause2 ) % 256;
         Zeitpunkt ++;
         P2_2 = 0; //Puls3 nullen
     }






     }
     else  {                //
         TH1  = ( 65536 - Puls_10ms ) / 256;  // Restzeit für 20ms
         TL1  = ( 65536 - Puls_10ms ) % 256;
       Rechne_Pulse_und_pausen();

   }
     TF1 = 0;

   }
 }

von Markus L. (lalomarkus)


Lesenswert?

Also jetzt muss ich mich auch mal einschalten.
Mein Name ist Markus Langlotz und der Ben und ich arbeiten gerade an dem 
o.g. Projekt.
Die Beschreibung des Projektes stimmt so nicht ganz. Wir haben keine 
Servomotoren verbaut sondern Motorregler, die Brushlessmotoren 
ansteuern.
Diese Regler werden normalerweise über einen Modellbau-Empfänger 
angesteuert.
Jetzt haben wir vor die Regler anstatt über einen Empfänger, über nen 
µController vom Typ 8051 zu steuern, da unser Modell über einen PC / 
Laptop gesteuert werden soll.

So der oben stehende Quellcode soll eine PWM erzeugen.

von R. B. (rabis)


Lesenswert?

Hi,

es gibt da den AT89C51AC3 (und auch ein fertiges Board) der kann mittels 
seiner PCA-Einheit 4 Servos ziemlich einfach ansteuern...

Gruß RABIS

von R. B. (rabis)


Lesenswert?

Falsch es sind 5 Servos möglich.

RABIS

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.