Elektro Bobby Car Atmega8 PWM

OP #3265127
Lesenswert?

Hej leute.
Ich baue gerade für meinen kleinen Jungen ein Elektro Bobby Car.
Die Mechanik ist schon fast fertig.

Zum Einsatz kommt ein Getriebe Motor und ein Fahrtenregler außem 
Modellbau mit vorwerts und rückwerts.

Mit einem Servotester funktioniert das ganze auch wunderbar.
Ich möchte jetzt einen ATmega8 und 2 Taster dazu nutzen um 3 PWM 
Situationen zu erzeugen.
OCR2 = 1   >>Rückwerts >>Taster1 zu
OCR2 = 128 >>Motor aus >>Taster1 | 2 offen
OCR2 = 255 >>Vorwerts  >>Taster2 zu

Ich habe auch schon einen Code zusammen gefriemelt aber der Funktioniert 
noch nicht so toll. Wenn ich am Ausgang einen Servo dran mache 
funktioniert das ganze halbwegs. Aber nicht optimal wie z.b. mit einem 
Servotester.

Hier ist mein Code.
Ich hab nen Atmega8 mit externen 4MHz Quarz.
Ich benötige eigendlich am PWM Ausgang ein PWM mit 50Hz. Bekomme es aber 
nicht so richtig hin.
1
#define F_CPU 4000000UL
2
#include <avr/io.h>
3

4
int main(void)
5
{   
6
  DDRC = (0<<PC0) | (0<<PC1);
7
  DDRB |= (1 << DDB3);
8
  // PB3 is now an output
9

10
  OCR2 = 90;
11
  // set PWM for 50% duty cycle
12

13
  TCCR2 |= (1 << COM21);
14
  // set none-inverting mode
15

16
  TCCR2 |= (1 << WGM21) | (1 << WGM20);
17
  // set fast PWM Mode
18

19
  TCCR2 |= (1 << CS22) ; //64
20
  
21
  while (1)
22
  {
23
    if (!(PINC & (1<<PINC0)))
24
    {
25
      OCR2 = 2;
26
    }    
27
    if (PINC & (1<<PINC0))
28
    {
29
      OCR2 = 90;
30
    }    
31
    if (!(PINC & (1<<PINC1)))
32
    {
33
      OCR2 = 253;
34
    }      
35
    if (PINC & (1<<PINC1))
36
    {
37
      OCR2 = 90;
38
    }    
39
  }
40
}


Wäre für Tipps sehr dankbar.

LG
Gast #3265173
Lesenswert?

Bitte, bitte les' Dir doch mal einen der vielen Artikel, über das 
Abfragen von Tasten, durch.

"Gefiltert"  2 wird wohl fast 0 Volt sein.
"Gefiltert" 90 wird wohl etwa 40% entsprechen
"Gefiltert" 253 wird wohl nahe am Maximum liegen.
... oder genau umgekehrt.

Warum soll der Motor, oberhalb bzw. unterhalb von 40%, plötzlich seine 
Meinung ändern und anders herum laufen?
OP #3265183
Lesenswert?

Oh das wollte ich noch ändern das war nur zum testen mit dem Servo...

Es sollte eigendlich

1    0
128  Mitte
255  Max

Sein.

""Warum soll der Motor, oberhalb bzw. unterhalb von 40%, plötzlich seine
Meinung ändern und anders herum laufen?""

Weil der Fahrtenregler bei 0 Rückwerts läuft
                       bei Mitte Motor Steht
                       bei Max Vorwerts läuft

Deswegen brauche ich nur die 3 Situationen.

LG
Shabi
#3265195
Lesenswert?

Shabi N. schrieb:
> Ich baue gerade für meinen kleinen Jungen ein Elektro Bobby Car.

Meine Güte, hoffentlich überlebt der Kleine das ohne große Verletzungen.

Wofür braucht man das? Kinder in dem Alter haben noch einen natürlichen 
Bewegungsdrang.
Den willst du unterdrücken? Dann setz ihn am besten auch 4-8h/Tag vor 
den Fernseher und kauf ihm einen Kleinkindcomputer.
So kann man das intelligenteste Kind verdummen.
OP #3265229
Lesenswert?

Was soll denn das jetzt??

Es ist mein Sohn und da ich selber auch einen Motor Bobbycar besitze, 
bekommt mein kleiner auch sowas. Das ding fährt max 6Km/h...

Ich als Kind hätte mir sowas nicht mal zu wünschen getraut und habe 
immer von so etwas geträumt...

Also bitte entweder zum Beitrag etwas Konstruktives beitragen oder 
einfach lassen.


LG
#3265627
Lesenswert?

Ja ich.
Du hast einen PWM Takt von 1/4000000*64*2^8 = 0,004096s = 4,096ms.
Eine Servoansteuerung hat einen Takt von 20ms für alle Servos (Plural) 
von 20ms. In sofern schon mal falsch.

Was du wahrscheinlich mit deinen Werten für OCR2 einstellst ist der Wert 
für einen Servo zwischen 1ms (linker Ausschlag) 1,5ms (Mitte) 2ms 
(Rechter Auschlag). Ein Servowert wird aber nur alle 20ms aktualisiert. 
Sprich:

2ms high              18ms low
|------|
|      |______________________________________ rechter Ausschlag

1ms high              19 ms low
|--|
|  |__________________________________________ linker Ausschlag


und Mittlere Stellung des Servos kannst du dir ja denken: 1,5ms high und 
18,5 ms low

danach beginnt eine neue Periode.
Gast #3265662
Lesenswert?

Hi

>Hat irgendwer noch nen Tipp für mich?

Hast du eigentlich deine Timereinstellungen mal durchgerechnet?

Du willst Impulse von 1..2 ms Länge mit einem Abstand von 20 ms.

4MHz und ein Prescaler von 64 ergibt bei einem 8-Bit-Timer eine Overflow 
Time von 4,096 ms statt der angepeilten 20 ms.

OCR2=2   -> 48µs Puls
OCR2=90  -> 1,5ms Puls
OCR2=253 -> 4ms Puls

Außer dem 1,5ms Puls stimmt da gar nichts.

Also nimm den Timer1

Prescaler 8
WGM-Bits  Mode14
ICR = 9999

OCR1A = 499  -> 1ms
OCR1A = 799  -> 1,5ms
OCR1A = 999  -> 2ms

Servo an OC1A (Pin15)

COM-Bits und DDRB für den Pin nicht vergessen.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren