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
@ 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 |
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.
aber danke , jedenfalls hatte ich es so auch versucht aber es wollt nicht funktionieren. Habe es jetzt in abgewandelter Form wieder hochgeladen.
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.
Hallo Heinz, ich hab den Mikrocontroller über einen linearen Spannungsregler auf 5V und den Servomotor getrennt auf 7,5 - 12 V.
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.
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.
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 |
Ä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.
> 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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.