Forum: Mikrocontroller und Digitale Elektronik Servo mit Pwm und Poti ansteuern, wo ist mein Fehler?


von Christopher T. (chriscrystal)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

also ich hab da ein Problem bei einer Ansteuerung eines 
Servos(Modelcraft YH-3009).

Ich programmiere mit Bascom Avr.

Ich hab alles soweit konfiguriert und programmiert, vorher erstmal eine 
LED gedimmt und den eingegebenen Wert umgerechnet(wobei die Umrechnung 
um auf werte zwischen 50 - 100 zu kommen nicht funktioniert). Rechnung 
dazu :
y=((y* 50/1024))+50), y = eingelesener Wert.

Doch leider "ruckelt" der Servo hin und her, fährt aber wenigstens in 
etwa in die vom Potentiometer eingestellte Richtung.

Die Frequenz der pwm um zu einer korrekten Ansteuerung zu gelangen habe 
ich mittelt dieser Formel gemacht:
f(Quarz) = Prescale  Timerauflösung  2 f(pwm).

Ich hab auch versucht zur Entstörung einen Kondensator parallel zu 
schalten, was aber nichts änderte.

Wäre echt nett wenn mir irgendjemand meinen Fehler zeigen könnte.

Anbei Programmcode

von Falk B. (falk)


Lesenswert?

@ Christopher Tiel (chriscrystal)

>y=((y* 50/1024))+50), y = eingelesener Wert.

Einen Servo steuert man mit einem Puls zwischen 1-2ms an, meistens mit 
~20ms Periodendauer. Bei deiner PWM hast du ~60Hz, könnte klappen.

>Doch leider "ruckelt" der Servo hin und her, fährt aber wenigstens in
>etwa in die vom Potentiometer eingestellte Richtung.

>Die Frequenz der pwm um zu einer korrekten Ansteuerung zu gelangen habe
>ich mittelt dieser Formel gemacht:
>f(Quarz) = Prescale  Timerauflösung  2 f(pwm).

Passt.

>Ich hab auch versucht zur Entstörung einen Kondensator parallel zu
>schalten, was aber nichts änderte.

WO? Am Servosignal? NEIN!

>Wäre echt nett wenn mir irgendjemand meinen Fehler zeigen könnte.

Was sol das Chaos in deinem Sourcecode? Kannst du dich nicht 
etnschweiden, mit welcher Variable du arbeiten willst?

Pwm1a = Pw

Das ist Unsinn. Die Periodendauer ist konstant, nur das Tastverhältnis 
wird geändert.

Eher so.
1
Do
2
   Pw = Getadc(0)
3
   S = Pw * 50
4
   S = S / 1024
5
   S = S + 50
6
   PW = S
7
   Compare1a = Pw
8
Loop

von Christopher T. (chriscrystal)


Lesenswert?

ou stimmt da war ein Teil des Programmcodes dabei den ich noch nicht 
rausgelöscht hatte.
So wie du ihn gerade beschrieben hast hatte ich es bereits versucht, nur 
mit dem oben beschriebenen Ergebnis.

von Christopher T. (chriscrystal)


Angehängte Dateien:

Lesenswert?

aber danke , jedenfalls hatte ich es so auch versucht aber es wollt 
nicht funktionieren. Habe es jetzt in abgewandelter Form wieder 
hochgeladen.

von Karl H. (kbuchegg)


Lesenswert?

Hardwareaufbau?

Ein Servo zieht beim ANfahren des Motors schon mal ordentlich Strom. 
Versorg es mal aus einer eigenen Stromquelle (Akku), so dass der µC eine 
saubere Spannung behält.

von Christopher T. (chriscrystal)


Lesenswert?

Hallo Heinz,

ich hab den Mikrocontroller über einen linearen Spannungsregler auf 5V 
und den Servomotor getrennt auf 7,5 - 12 V.

von kuebellord (Gast)


Lesenswert?

12V ist viel zu viel fuer das Servo.

von Christopher T. (chriscrystal)


Lesenswert?

ok, aber 9V ist doch in Ordung.

von MWS (Gast)


Lesenswert?

Christopher Tiel schrieb:
> ok, aber 9V ist doch in Ordung.

Laut welchem Datenblatt? Meistens gehen die bis 6V, High-Voltage-Typen 
gehen höher, 9V sollte auch da jenseits der Schmerzgrenze sein.

Definiere mal Stack & Frame, Du verwendest Fließkomma, da ist das 
zwingend.

von Christopher T. (chriscrystal)


Lesenswert?

leider gemäß keinem Datenblatt, da ich es nicht finden konnte. Auch auf 
Conrad.de wo es her ist findet man keins.
Du meinst ich sollte einen hwstack und einen framesize definieren? Dann 
müsste ich mir das mal anschauen.

von Falk B. (falk)


Lesenswert?

Man kann auch mal 5 Minuten nachdenken und die passenden Integervariable 
nutzen. Der ADC spuckt maximal 1023 raus, *50 macht ~50000. Da reicht 
ein word.
1
$regfile = "m8def.dat"
2
$crystal = 1000000
3
4
5
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 8
6
7
8
Enable Timer1
9
Start Timer1
10
11
Config Pinb.1 = Output                                      
12
13
Config Pinc.0 = Input                                       
14
15
Dim Pw As Word
16
Config Adc = Single , Prescaler = Auto , Reference = Avcc
17
Start Adc
18
19
20
Do
21
    Cls
22
                                           ' Umrechnung Auf 50 -100 "
23
   Pw = Getadc(0)
24
   PW = Pw * 50
25
   PW = PW / 1024
26
   PW = PW + 50
27
   Compare1a = Pw
28
Loop
29
30
End

von MWS (Gast)


Lesenswert?

Ändere mal auf Compare A Pwm = Clear Up, siehe auch Datenblatt "Phase 
Correct PWM" und Registerbeschreibung COM1A1..0
Die Puls/Pausenzeit ist sonst verkehrt herum, außer bei zu alter 
Bascom-Version, denn da gab's mal 'ne Korrektur. Außerdem mach' das Cls 
raus, wenn kein Display konfiguriert ist.

von Uwe (Gast)


Lesenswert?

> ok, aber 9V ist doch in Ordung.
Hoffentlich nicht aus ner 9V Batterie !?!
Die haben einen zu hohen Innenwiderstand und können nur 100mA-200mA 
liefern ...

von chriscrystal (Gast)


Angehängte Dateien:

Lesenswert?

Hey,

Danke hab das Problem soweit gelöst, Fehler war mein nicht Verständnis 
vom Compare und dessen Schaltung und der Analog Digital wandlung mitm 
Poti.



Grüße

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.