Forum: Mikrocontroller und Digitale Elektronik Problem: Digitalservo mit AVR BOARD steuern


von Michael Baage (Gast)


Lesenswert?

Hallo,

Ich habe mir ein ATMEL Evaluations-Board V2.0.1 mit einem ATmega32 
besorgt und möchte damit meinen
Futaba Brushless Digitalservo steuern.
Ich hab erst vor 5 tagen mit Programmieren generell erst angefangen und 
noch nicht so die ahnung davon...

habe folgendes Programm geschrieben:

$regfile = "m32def.dat"
$crystal = 1000000
Config Servos = 1 , Servo1 = Porta.1 , Reload = 10

Config Porta = Output
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input


Enable Interrupts


Do

   If Pind.2 = 1 Then
      Servo(1) = 50
   End If
   If Pind.3 = 1 Then
      Servo(1) = 100
   End If
   If Pind.4 = 1 Then
      Servo(1) = 150
   End If

Loop

End


nur leiden macht der servo keinen mucks. Nur wenn ich mit dem weißen 
signalkabel am PORTA ausgang rumspiele tut sich was, aber nicht wenn ich 
denn weißen kabel stecken lasse, geschweige das etwas über die 3 
drucktaster was passiert. Kann mir da einer helfen??

von frank (Gast)


Lesenswert?

Porta.=Output  oder muß es nicht geschrieben werden: Porta.1 = Output

von Michael Baage (Gast)


Lesenswert?

hallo Frank:
funktioniert nicht.

#also mit rumspielen meine ich, wenn ich mit dem weißen kabel immen an 
PORTA entlangstreife, dann fährt er mal nach rechts oder ganz links oder 
mitte.
also hat er doch die positionen. Nur ist das ja nicht sinn der sache mit 
dem kabel immer rumzufummeln....

von frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Michael!
Das programm sieht mir sehr nach Bascom aus.Der Digitalservo benötigt 
Impulse von 400µs.Mit Ouarz oder Intern 1Mhz wird das 
Nichts.Ouartsfrequenz oder Intern min 8Mhz.

von frank (Gast)


Angehängte Dateien:

Lesenswert?

Oder diese Variante.

von frank (Gast)


Lesenswert?

Eines habe ich noch vergessen.Versorge den Servo aus einer externen 
Spannungsversorgung,da die Servos einen"hohen Strom" ziehen und deshalb 
die Versorgung des Boards zusammenbricht.Eigene Erfahrung!

von frank (Gast)


Angehängte Dateien:

Lesenswert?

Eine weitere Variante.

von Michael Baage (Gast)


Lesenswert?

Cool danke erstaml für deine hilfe.

Ja das ist Bascom AVR Software.

von Michael Baage (Gast)


Lesenswert?

Ich verstehe es nicht!!
Ich hab den code von den "3 Königen" für mein M32 angepasst.
Und es passiert NICHTS! Liegt es daran das ich vlt. die elektronik aus 
den Servo rausnehmen muss??!


$crystal = 80000000

$regfile = "m32def.dat"

Dim Servospeed As Integer
Dim Negservospeed As Integer
Dim I As Integer
Dim Centerservo As Integer
Dim Leftservo As Integer
Dim Rightservo As Integer
Config Portb.0 = Output
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input
Portd = &HFF
Portb.0 = 0


Servospeed = 30
Negservospeed = -23
I = 1

Centerservo = 4000
Rightservo = 1700
Leftservo = 6400

Waitms 10

Loop:


    If Pind.2 = 0 Then
       For I = Rightservo To Centerservo Step Servospeed
         Pulseout Portb , 0 , I ,
         Waitms 20
       Next
    End If

    If Pind.3 = 0 Then
       For I = Centerservo To Leftservo Step Servospeed
         Pulseout Portb , 0 , I ,
         Waitms 20
       Next
    End If

    If Pind.4 = 0 Then
         For I = Leftservo To Rightservo Step Negservospeed
         Pulseout Portb , 0 , I,
         Waitms 20
       Next
    End If

  Wait 1
  Goto Loop

End

von Stefan (Gast)


Lesenswert?

Michael Baage schrieb:
> $crystal = 80000000
80 MHz?

von Michael Baage (Gast)


Lesenswert?

Huch... :D
das war es aber nicht.

Ich frag mich was "I" fürne aufgabe hat und warum es als integer 
definiert ist.
Und was "Portd = &HFF" heißt...


Jedenfalls läuft es auch nicht anders als mein erster code ganz oben.

gruß.

von Stefan (Gast)


Lesenswert?

Ein Oszilloskop würde die Fehlersuche deutlich erleichtern.

Ist dein Servo überhaupt für die "normale" Ansteuerfrequenz und 
Impulslänge ausgelegt oder ist es ein Teil das mit höherer Frequenz und 
kürzeren Impulsen angesteuert werden will (gibt es als Heli-Heckservo 
zum Anschluss an einen geeigneten Kreisel)?

von Michael Baage (Gast)


Lesenswert?

Der servo ist ein Futaba Brushless Digitalservo : 89 €
Stellgeschwindigkeit 0.07sek./40° mit 116Ncm...

Ich finde das für mein Projekt ,denke ich mal, ausreichend. Wenn nicht 
muss ich einen zweiten deneben stellen und 232 Ncm zu haben.

Ich will das dieser Schnelle Digitalservo 2 Positionen, so schnell wie 
er kann, erreichen mittels Drucktaster, später dann eine kleine 
Panasonic Gabellichtschranke ZWEI augänge bestizt mit je 12v 50mAh als 
Trigger.

Sagen wir mal 150 ist die mittelstellung...
-Dann soll der servo bsp. 164° erreichen sobald ein objekt in die 
lichtschanke bzw. "taster1" gedrückt ist.
-sobalt das objekt wieder aus der lichtschranke raus ist, oder "taster2" 
gedrückt ist, soll der servo in etwa bsp. 139° "schießen". und dieses 
Objekt wird wohl so 5-7 mal pro sekunde da durch rauschen.
Zu dem Soll der servo auch die position halten wenn gegendruck herrscht.



Aber ich will das erstmal mit den avr board und drucktastern testen 
bevor ich mir den aufwand mache ein unkompizierteres bord mit anschluss 
der Gabellichtschranke zu bauen.


gruß

von Michael Baage (Gast)


Lesenswert?

# FUTABA BRUSHLESS-SERVO 451 MG

von Karl H. (kbuchegg)


Lesenswert?

> $crystal = 80000000


vorher war es noch

> $crystal = 1000000


Ja, was denn nun?

Mit welcher Taktfrequenz läuft denn dein Prozessor nun?

von Michael Baage (Gast)


Lesenswert?

Mir hat einer gesagt das man auf 8 MHz erhöhen muss damit es läuft.
Hab mich nur um eine null vertippt...

von Stefan (Gast)


Lesenswert?

Das Servo sollte mit den normalen Ansteuerimpulsen funktionieren.

Beim Pollin ATMEL Evaluations-Board V2.0.1 ist laut Anleitung am DIP 40 
Sockel ein 16 MHz Quarz. Änder $crystal mal entsprechend.

von Karl H. (kbuchegg)


Lesenswert?

Michael Baage schrieb:
> Mir hat einer gesagt das man auf 8 MHz erhöhen muss damit es läuft.

Das mag schon sein.
Das ist aber nicht die Frage.
Denn die eigentliche Frage lautet: Wie schnell ist denn dein Mega32 
wirklich? Hinschreiben kannst du an dieser Stelle viel. Nur interessiert 
das den µC herzlich wenig. Der läuft mit der Taktfrequenz auf die er 
eingestellt ist. Die Angabe im Programm ist nur die Information für das 
Programm, wie schnell das ist.

von Michael Baage (Gast)


Lesenswert?

ATmega 32/16
Fmax. 16MHz steht in der chipbeschreibung.

von Karl H. (kbuchegg)


Lesenswert?

Michael Baage schrieb:
> ATmega 32/16

Den CHip kann man auf fixe Taktfrequenzen
  1 Mhz
  2 Mhz
  4 Mhz
  8 Mhz
einstellen. Und natürlich auch auf jede andere Taktfrequenz, wenn man 
einen Quarz für diese Frequenz hat.

Also: Wie schnell läuft dein µC?

> Fmax. 16MHz steht in der chipbeschreibung.

Das 'max' macht dich nicht irgendwie stutzig?
Der Chip geht maximal mit 16Mhz. Aber bis hinauf zu 16Mhz hast du mit 
einem Quarz die freie Wahl.

von Karl H. (kbuchegg)


Lesenswert?

Stell es halt einfach fest.

Mach dir eine LED an einen µC Pin (mit Vorwiderstand), schreib ein 
Programm, welches mit Wait die LED im Sekundentakt blinken lässt und 
dann variierst du die Angabe bei crystal, bis es tatsächlich 1 Sekunde 
ist.

Wenn auf deinem Board ein Quarz verbaut ist, dann kann man ja als erstes 
einfach mal den dort aufgedruckten Wert benutzen.

von Michael Baage (Gast)


Lesenswert?

Mein µc hat 3 quarze: 1x 8MHz und 2x 16MHz.
Der antiny 2313 sockel hat den 8 MHz quarz.
Mega8 sockel 16 MHz quarz und der
Mega 16 sockel den 16 MHz quarz.

von Michael Baage (Gast)


Lesenswert?

Also die bascom software hat einen eigenen Simulator.
Den code den ich hier am 14.05.2011 gepostet habe, habe ich mal mit 
$crystal 16 MHz laufen lassen: Beim ersten "WAITMS 10" wartet die 
simulation dort genau 1 Minute.
Stelle ich $crystal auf 1MHz wartet die Simulation dort nur noch 3 
sekunden.
???????



gruß

von Karl H. (kbuchegg)


Lesenswert?

Die Simulation ist uninteressant.
Der reale Prozessor zählt:

Wenn du einen

do
  LED an
  wait 1
  LED aus
  wait 1
loop

machst (symbolischer Code), wie lange sind dann die Zeiten?
Das ist doch nicht so schwer. Jeder BASCOM Anfänger muss das hinkriegen 
eine LED zum leuchten zu bringen, indem er einen Output Pin entsprechend 
konfiguriert und ansteuert. Wie willst du denn jemals ein Servo 
ansteuern, wenn dich schon die 'Kindergartenbeispiele' vor 
unüberwindliche Probleme stellen?

Auch du wirst das alles von der Pieke auf lernen müssen.

von Stefan (Gast)


Lesenswert?

Wahrscheinlich wird der uC mit 1 MHz laufen weil die Fuses im 
Auslieferungszustand so gesetzt sind, dass der interne RC Oszillator mit 
8 MHz und der Vorteiler /8 ausgewählt sind.
Für eine höhere Taktfrequenz oder um den Quarzozillator zu nutzen müssen 
die Fuses anders gesetzt werden.
Mit $crystal wird nur dem Compiler mitgeteilt wie schnell der uC 
getaktet ist damit z.B. die Waitms Warteschleifen richtig berechnet 
werden können.

von Michael Baage (Gast)


Lesenswert?

Ich war mal so fein und hab den prozessor gewechselt.
hier ist es eine led auf dem AVR Board.
In einem Video funktioniert es mit dem chrystal und waitms.

BEI MIR LEUCHTET SIE NUR :(

$regfile = "m8def.dat"
$crystal = 1000000



Config Portd.5 = Output

Dim Speed As Integer
Speed = 1000

Do
  Portd.5 = 1
  Waitms Speed
  Portd.5 = 0
Loop

End

Stefan schrieb:
> müssen
>
> die Fuses anders gesetzt werden.

Aha? und wo kann man das umstellen?? :)

gruß

von Michael Baage (Gast)


Lesenswert?

Hab ein waitms vergessen^^
....

von Stefan (Gast)


Lesenswert?

Wichtige Informationen zu den Fuses findest du hier:
http://www.mikrocontroller.net/articles/AVR_Fuses

Zu diesen allgemeinen Informationen brauchst du natürlich noch das 
Datenblatt deines AVRs.

Auf welchen Wert du $crystal setzen musst findest du dann im BASCOM-AVR 
user manual:
http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=140&Itemid=54

von Michael Baage (Gast)


Lesenswert?

Das ist doch mal Laienhaft erklärt. Damit kann ich mich schon mehr 
anfreunden, und auch vlt. andere leute :)

...."Würde der Timer direkt mit den 16MHz des Controllers getaktet 
werden, wäre die maximale Impulsbreite 16MHz/65536 = 0,0041 Sekunden 
lang. Setzen wir in der Interrupt-Routine den Timer auf 0, so läuft er 
65536 Takte hoch, bevor wieder ein Interrupt ausgelöst wird. Wollten wir 
einen Impuls von 1,5ms auslösen, müßten wir den Timer mit einem Wert von 
41536 belegen, damit 24000 Takte (brauchen 0,0015 Sekunden) beim 
Hochzählen nötig sind um wieder einen Interrupt zu erzeugen und den 
nächsten Servo einzuschalten"

gefunden hier.
http://www.vreal.de/index.php?Itemid=31&id=21&option=com_content&task=view

von spess53 (Gast)


Lesenswert?

Hi

>...."Würde der Timer direkt mit den 16MHz des Controllers getaktet
>werden, wäre die maximale Impulsbreite 16MHz/65536 = 0,0041 Sekunden
>lang. Setzen wir in der Interrupt-Routine den Timer auf 0, so läuft er...

Das ist die altmodische Variante. Bei Timer mit Compare-Einheit(en) ist 
das unnötig.

MfG Spess

von Michael Baage (Gast)


Lesenswert?

DER HIER FUNKTIONIERT so wie ich es will !! ausgang ist ein OC1A oder 
PD5...

So dann bedanke ich mich erstmal für eure zeit. Und frohes schaffen :)



$regfile = "m32def.dat"
$crystal = 1000000

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 
1

Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.4 = Input


Do

   If Pind.2 = 1 Then
      Compare1a = 389

   Elseif Pind.3 = 1 Then
      Compare1a = 650

   Elseif Pind.4 = 1 Then
      Compare1a = 1022

   End If

Loop

End

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.