Hi!
Ich habe schon erfolgreich nen Servo mit PWM gesteuert, aber jetzt habe
ich hier einen DC-Motor, den ich auch gern in der Geschwindigkeit regeln
möchte..
Habe dazu schon im Forum gesucht, und bin auf den Code unten gestossen.
Diesen habe ich ein bisschen verändert.
Den PWM-Pin, also PB1 habe ich an den enable-Pin eines L293D
angeschlossen,
dieser ist auch korrekt beschaltet.
Wenn ich nun eine LED an den Motor-Ausgang d. L293D anschliesse, blinkt
sie , bei Taster1 wird sie ganz hell, und bei Taster2 geht sie ganz aus,
so wie geplant..Wenn ich nun den DC-Motor an den Ausgang hänge, läuft
er die ganze Zeit, egal ob ich Taster drücke oder nicht, die gemessene
Spannung ist hier immer 3V..??? (L293D mit 6V beschaltet)
Hier mein Code:
1 | /* DC-Motor-Steuerung mit PWM, erster Test */
|
2 | /* Tobias Weis 2008 */
|
3 |
|
4 | #include <avr/io.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | main(){
|
8 | int x=0;
|
9 | /* Taster an PD0 und PD1 */
|
10 | DDRD=0x00;
|
11 | /* PullUps einschalten */
|
12 | PORTD=0xFF;
|
13 |
|
14 | /* Gesamter Port C als Ausgang */
|
15 | DDRC=0xFF;
|
16 | PORTC=0x00;
|
17 |
|
18 | /* Gesamter Port B als Ausgang */
|
19 | DDRB=0xFF;
|
20 |
|
21 | /* PWM-Einstellungen */
|
22 | TCCR1A |= (0<<COM1A0)|(1<<COM1A1)|(0<<COM1B0)|(1<<COM1B1)|(0<<FOC1A)|(0<<FOC1B)|(1<<WGM11)|(0<<WGM10);
|
23 |
|
24 | TCCR1B|=(0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10);
|
25 |
|
26 | ICR1H = 0xFF;
|
27 | ICR1L = 0xFF;
|
28 |
|
29 | // Kein Prescaler, Timer starten
|
30 | TCCR1B |= (1<<CS10);
|
31 |
|
32 | for(;;){
|
33 | if(!bit_is_set(PIND,0) && (bit_is_set(PIND,1))){
|
34 | OCR1A = 0xFFFF; // Volle 6V
|
35 | }
|
36 |
|
37 | if(!bit_is_set(PIND,1) && (bit_is_set(PIND,0))){
|
38 | OCR1A = 0x0000; // Aus
|
39 | }
|
40 |
|
41 | if(bit_is_set(PIND,0) && bit_is_set(PIND,1)){
|
42 | OCR1A = 0x7FFF; // Hälfte
|
43 | }
|
44 | } //for
|
45 | return 0;
|
46 | } //main
|