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);
}
Lesezeichen