Hallo,
für ein Schulprojekt meines Sohne möchte ich ein Modellbauservo mit dem
Atmega8 steuern. Hierzu brauche ich ja, wie ich gelesen habe eine
20ms-Phase mit jeweils 1-2ms Peak, um die Position zu steuern.
Ich habe mir für meinen Atmega folgendes Programm geschrieben:
1 | #define F_CPU 1000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void){
|
7 |
|
8 | TCCR1A |= (1<<COM1A1) | (1<<WGM11); // non-inverting mode for OC1A
|
9 | TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS11); // Mode 14, Prescaler 8
|
10 |
|
11 | ICR1 = 2500; // 320000 / 8 = 40000
|
12 |
|
13 | DDRB |= (1<<PB1); // OC1A set to output
|
14 |
|
15 | while(1){
|
16 | //125 = 1ms
|
17 | //187 = 1,5 ms
|
18 | //250 = 2ms
|
19 |
|
20 | OCR1A = 250; // set to 0° --> pulsewidth = 1ms
|
21 | _delay_ms(1000);
|
22 | //
|
23 | OCR1A = 187; // set to 0° --> pulsewidth = 1ms
|
24 | _delay_ms(1000);
|
25 | //
|
26 | OCR1A = 125; // set to 0° --> pulsewidth = 1ms
|
27 | _delay_ms(1000);
|
28 | //
|
29 | }
|
30 | }
|
Auf dem Oszi bringt es auch genau den gewünschten Effekt (20ms mit 1-2ms
Peak). (Angeschlossen an OC1A)
Aber, mein Servo macht keinen Mux?!? Habe ich hier einen Denkfehler?
Es sind mir 2 Dinge aufgefallen:
- am Ausgang des Atmega (OC1A bzw. PB1) habe ich ja keine +5V, sondern
im Takt immer Masse
- zum Spaß habe ich mal die FB angeschlossen und nachgeschaut was da
rauskommt --> da habe ich eine Sinuskurve.
Ich mach hieran schon sehr lange rum und komme einfach nicht weiter.
Gruß
Pfeiffy