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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.