Hallo Leute, nach mehr stündigem Googlen und Forum durchsuchen konnte ich nichts finden daher Post ich mal. Ich habe nen ATMega 168 und möchte gern einen Servo ansteuern über eine PWM. Dafür habe ich OCR0A für den Servo und OCR0B fürs Relais gesetzt. Ich habe mir ein kleines C Programm geschrieben das meine Servo aber nur Fiepen lässt statt sich zu drehen. Sieht wer nen programmier/Denkfehler? Liebe Grüße Mike
1 | /*###################################
|
2 | ###################################
|
3 | ##### PWM für Servor-Motor ########
|
4 | ##### ########
|
5 | ##### Datum:21.07.2013 ########
|
6 | ###################################
|
7 | ###################################
|
8 | */
|
9 | #ifndef F_CPU
|
10 | #define F_CPU 8000000UL
|
11 | #endif
|
12 | |
13 | #include <avr/io.h> |
14 | #include <util/delay.h> |
15 | //#include <avr/iom168.h>
|
16 | #include <stdint.h> |
17 | |
18 | |
19 | void InitPWM() |
20 | {
|
21 | /*
|
22 | TCCR0B - Timer Counter Control Register (TIMER0)
|
23 | -----------------------------------------------
|
24 | |
25 | Bit Name Wert
|
26 | ----------------------------------------------------------
|
27 | BIT 7 : FOC0 Force Output Compare 0
|
28 | BIT 6 : WGM00 Wave form generartion mode 0
|
29 | BIT 5 : COM01 Compare Output Mode 0
|
30 | BIT 4 : COM00 Compare Output Mode 0
|
31 | |
32 | BIT 3 : WGM02 Wave form generation mode 0
|
33 | BIT 2 : CS02 Clock Select 0
|
34 | BIT 1 : CS01 Clock Select 0
|
35 | BIT 0 : CS00 Clock Select 1
|
36 | |
37 | Einstellungen PWM
|
38 | --------------------------
|
39 | |
40 | Timer Clock = CPU Clock (/1024)
|
41 | Mode = Fast PWM
|
42 | PWM Output = Non Inverted
|
43 | |
44 | |
45 | */
|
46 | |
47 | |
48 | TCCR0A |= 0xA3; |
49 | TCCR0B |= 0x01; |
50 | |
51 | //Output Setzen
|
52 | |
53 | DDRD |= 0x60; |
54 | }
|
55 | |
56 | /******************************************************************
|
57 | Setzt Vout auf OCR0A und OCR0B PIN.
|
58 | Wert: Zwischen 0 - 255
|
59 | |
60 | 0= 0%
|
61 | |
62 | 255= 100%
|
63 | |
64 | |
65 | Wert
|
66 | Vout= ------ x 5v
|
67 | 255
|
68 | |
69 | *********************************************************************/
|
70 | |
71 | void SetPWMOut(uint8_t wert) |
72 | {
|
73 | OCR0A=wert; |
74 | OCR0B=wert; |
75 | }
|
76 | |
77 | /********************************************************************
|
78 | |
79 | Pause
|
80 | |
81 | *********************************************************************/
|
82 | |
83 | void Pause() |
84 | {
|
85 | _delay_ms(15); |
86 | }
|
87 | |
88 | void main() |
89 | {
|
90 | |
91 | |
92 | //PWM Initialisieren Channel 0
|
93 | InitPWM(); |
94 | |
95 | while(1) |
96 | {
|
97 | //PWM mit 50%
|
98 | for(int i=0;i<200;i=i+10) |
99 | {
|
100 | SetPWMOut(i); |
101 | _delay_ms(1); |
102 | }
|
103 | |
104 | for(int i=200;i>=0;i=i-10) |
105 | {
|
106 | SetPWMOut(i); |
107 | _delay_ms(1); |
108 | }
|
109 | |
110 | }
|
111 | }
|