Forum: Mikrocontroller und Digitale Elektronik Elektro Bobby Car Atmega8 PWM


von Digit-22 N. (digit-22)


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

von amateur (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

>Ich benötige eigendlich am PWM Ausgang ein PWM mit 50Hz. Bekomme es aber
>nicht so richtig hin.

Das solltest du auch mit einem 16Bit-Timer machen. PWM-Mode 14 oder 15.

MfG Spess

von Digit-22 N. (digit-22)


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

von Udo S. (urschmitt)


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.

von amateur (Gast)


Lesenswert?

How!
Professor Dr. Dr. Udo Schmitt hat gesprochen.

von Digit-22 N. (digit-22)


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

von Udo S. (urschmitt)


Lesenswert?

amateur schrieb:
> How!
> Professor Dr. Dr. Udo Schmitt hat gesprochen.

Dazu muss man kein Prof sein, nur sein Resthirn zum Denken nutzen.
Aber ich geh mal davon aus, daß du noch grün hinter den Ohren bist und 
keine Kids hast.

von Digit-22 N. (digit-22)


Lesenswert?

Hat irgendwer noch nen Tipp für mich?

LG
Shabi

von Timo N. (tnn85)


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.

von Spess53 (Gast)


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

von Jörg E. (jackfritt)


Lesenswert?

Ist zwar schon älter und leicht OT ,aber würdest du mal Bilder von der 
Mechanik einstellen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.