Servo hat das große Zittern
Hallo zusammen,
mein Servo hat das große Zittern:
Ich versuche ihn über das Control M32 Board des RP6 anzusteuern. Dabei verwende ich die Standard PWM Betriebsart des Timers 1 und der Servo liegt mit seiner Steuerleitung an PIND5.
Das Problem:
Der Servo dreht zwar wie befohlen, zittert aber mächtig.
Kann ich ihm das Zittern abgewöhnen ?
Viele Grüße
Igeligel
Hier mein Code:
Code:
#include "RP6ControlLib.h"
void initServo(void)
{
DDRD |= (1 << PD5); // define PIND5 as output
TCCR1B |= (1 << CS12); // systemclock :256
TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM11); // 9bit PWM-mode
OCR1A = 26; // set compare value
sei(); // enable interrupts
}
int main(void)
{
uint8_t counter=0;
initRP6Control();
initServo();
startStopwatch1(); // Stopwatch1 starten!
while(true)
{
// Check if a key is pressed:
uint8_t key = getPressedKeyNumber();
// If button 1 is pressed => turn servo to the right
if (key==1 || ch=='u') {
OCR1A++;
setStopwatch1(0);
while(getStopwatch1() < 200) {
counter++;
}
}
// If button 2 is pressed => turn servo to the left
if (key==2 || ch=='d') {
OCR1A--;
setStopwatch1(0);
while(getStopwatch1() < 200) {
counter++;
}
}
// If no button is pressed => do nothing
if (key==0) {
}
}
}
Servo scheint doch irgendwie defekt zu sein ...
Hallo Leute,
ganz großes Dankeschön für Eure Mühen (insbesondere an Dirk, der extra seinen Code nochmals mit Oszi getestet hat).
Habe inzwischen den Servo an mein myAVR MK1 Board angeschlossen.
Das Ergebnis: auch dort gibt's das große Zittern.
Ich glaub' ich kaufe mir einen neuen Servo bevor ich noch mehr Zeit investiere. Irgendwie doof.
Trotzdem ein dickes Dankeschön für Eure Mühen.
Igeligel
PS: hier der PWM-Code des myAVR MK1 Boards für die Nachwelt. (beachte: ATmega32 führt OC1A an PortD5 heraus während ATmega8 OC1A an PortB1 herausführt)
Code:
/*
Description: ATmega8 uses Timer1 in PWM-Mode to control servo
Code runs on myAVR MK1 Development Board (SP2) NOT on RP6
Usage: By default you get a 1ms/20ms PWM-signal on Port PB1
Use pushbutton "Taster1" to enlarge the 1ms-signalshoulder
Use pushbutton "Taster2" to shrink the 1ms-signalshoulder
Wires: PD6 -> Taster2
PD7 -> Taster1
Lo -> Servo (black)
Hi -> Servo (red)
PB1 -> Servo (orange)
PC0 -> LED (green)
PC1 -> LED (yellow)
Date: 01.02.2009
Author: Igel
Reference: http://www.mikrocontroller.net/topic/103629
*/
// Takt
#define F_CPU 3686400UL
#include <avr/io.h>
#include <util/delay.h>
void initServo(void) {
// init timer 1:
//ICR1 = 7200; // PWM cycle time in usec
ICR1 = 9216; // PWM cycle time in usec
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11); // OC1A/B clr on match, set on TOP
//TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS12) | (1<<CS10); // TOP = ICR1, clk = sysclk/8 (->1us)
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS11); // TOP = ICR1, clk = sysclk/8 (->1us)
TCNT1 = 0; // reset Timer
OCR1A = 461; // set Servo 1 to 1ms-position
}
int main(void) {
DDRD &= ~((1 << PD6) | (1 << PD7)); /* PIN PD6 + PD7 auf Eingang (Taster) */
PORTD |= (1 << PD6) | (1 << PD7); /* Pullup-Widerstand aktivieren */
DDRC |= (1 << PC0) | (1 << PC1); /* PIN PC0 + PC1 als Ausgang (LED) */
DDRB = (1 << PB1) | (1 << PB2); // OC1A and OC1B for PWM
initServo();
while(1) {
if(PIND & ( 1 << PD6 )) {
PORTC &= ~(1 << PC0); }
else {
PORTC |= (1 << PC0);
OCR1A -= 10;
_delay_ms(200);
}
if(PIND & ( 1 << PD7 )) {
PORTC &= ~(1 << PC1); }
else {
PORTC |= (1 << PC1);
OCR1A += 10;
_delay_ms(200);
}
}
return(0);
}
Die Lösung: neuen Servo angeschlossen - nun funktioniert's.
Hallo Leute,
nur um diesen Thread auch sauber zu Ende zu bringen, möchte ich Euch noch berichten, wie die Geschichte ausging:
Das Ende der Story ist dabei eher profan: Ich bin in den nächstbesten Spielzeugladen marschiert, habe mir für 8,99 EUR den billigsten dort verfügbaren Servo gekauft und ihn an mein myAVR-Entwicklungsboard angeschlossen.
Ergebnis: der neue Servo funktionierte direkt vom Start weg. Das "große Zittern" lag also eindeutig an einem Defekt im alten Servo - da half auch kein Elko oder sonstiges gutes Zureden.
Vielen Dank an dieser Stelle nochmals für Eure Unterstützung und Eure Mühen
Igeligel