Problem: Digitalservo mit AVR BOARD steuern

Gast #2172508
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??
Gast #2172635
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....
Gast #2173803
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!
Gast #2184095
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
Gast #2186075
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ß.
Gast #2186248
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)?
Gast #2186312
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ß
#2186417
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.
#2186444
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.
#2186450
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.
Gast #2186686
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ß
#2186700
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.
Gast #2186895
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.
Gast #2186960
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ß
Gast #2189460
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
Gast #2189477
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
Gast #2189661
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren