Servo mit Pwm und Poti ansteuern, wo ist mein Fehler?

OP #3475574
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
Angehängte Dateien:
#3475585
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
#3475729
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
Gast #3475774
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.

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