PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motor ohne Library starten



Andi1888
10.03.2014, 19:53
Hallo,

ich würde gern den rechten Motor ohne die Asuro.c steuern.
Dazu verwende ich folgenden Code:


#include <asuro.h>

int main(void) {
Init();
while (1) {
//Rechter Motor

DDRB |= ((1 << PB2) | (1 << PB4) | (1 << PB5)); //als Ausgang festlegen
PORTB |= ((1 << PB4) | (1 << PB2)); //auf 5V setzen, Transistor T8 schaltet
PORTB &= ~(1 << PB5); //auf 0V setzen, Transistor T5 schaltet
}
while (1) {}
return 0;
}

Nun hätte ich erwartet, dass sich der rechte Motor dreht, mit voller Geschwindigkeit. Macht er aber nicht.
Hat jemand einen Tipp, wo mein Denkfehler liegt?

gruß
Andi

radbruch
10.03.2014, 20:07
Hallo

Lass doch mal das Init() weg. Ich vermute, dass der OC1B-Ausgang dadurch aktiviert wird (durch die PWM-Funktion der Library) und dein HIGH an PB2 überschreibt:


...
// for PWM (8-Bit PWM) on OC1A & OC1B
TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
// tmr1 running on MCU clock/8
TCCR1B = (1 << CS11);
...
MotorDir(FWD,FWD);
MotorSpeed(0,0);
(Aus Init() in asuro.c)

Und dann wird bei MotorSpeed(0,0) das PWM-Signal auf Dauerlow gesetzt...

Gruß

mic

Andi1888
10.03.2014, 20:30
Danke für die schnelle Antwort, radbruch.
Daran habe ich nicht gedacht.
Motor dreht nun mit voller Geschwindigkeit.

Gibt es irgendwo eine gute Anleitung wie man nun mittels Timer und PWM die Geschwindigkeit anpassen kann?
Werde aber nicht so richtig schlau aus den Befehlen in der Asuro lib, also aus

OCR1B

_SFR_IO16(0x28)

#define _SFR_IO16(io_addr) ((io_addr) + __SFR_OFFSET)

Gibt es dazu vielleicht eine verständliche Erklärung?

gruß
Andi

shedepe
10.03.2014, 22:44
Schau dir in einem AVR Tutorial (Kleiner Tipp schau auf mikrocontroller.net) und im Datenblatt vom Kontroller an wie man den Timer verwendet.

Andi1888
11.03.2014, 13:48
Kann jemand erklären, was OCR macht und wie es definiert ist?

shedepe
11.03.2014, 16:42
Siehe:
http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf
Seite 75 ff.

Und:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR

OCR1 ist das Output Compare Register des 16bit Timers des Atmega 8.
Definiert wird es in der avr standard Library und ist im Hintergrund nicht mehr als eine Speicheradresse.

Genau das gleiche Thema wurde außerdem hier behandelt:
https://www.roboternetz.de/community/threads/64425-Asuro-PWM-Signal-erzeugen

Andi1888
14.03.2014, 11:29
Habe es nun einigermaßen hinbekommen.



#include <avr/io.h>
#include <avr/interrupt.h>

int main(void) {
TCCR1A|= ((1 << WGM10) | (1 << COM1B1)); //PWM, Phasenkorrekt, 8-Bit, lösche OC1B wenn CompareMatch beim hochzählen, setze beim herunterzählen
TCCR1B|= (1 << CS11); //PreScale 8 8000000Hz/8=1000000Hz, da 8-Bit: 1000000/256=3906,25Hz->3906,25 mal wird von 0..255 gezählt
OCR1B=130; //Hier Wert zwischen 0..255 für Geschwindigkeit
TIMSK|= ((1 << TOIE1) | (1 << OCIE1B)); //Overflow Interrupt erlauben, wird nicht benötigt
DDRB|= ((1 << PB2)|(1 << PB4)|(1 << PB5)); //Motor-Rechts, Pins als Ausgang setzen
PORTB|= (1 << PB5); //Damit Motor vorwärts dreht
PORTB&= ~(1 << PB4); //Damit Motor vorwärts dreht
sei(); //Globale Interrupts erlauben
while (1)
{
//Quellcode
}

while (1) {}
return 0;
}


Zwei kleine Verständnisfragen hätte ich noch.
OCR1B ist ja der Wert, welcher intern mit TCNT1 also dem Timer/Counter Daten Register abgeglichen wird. Wenn eine Übereinstimmung stattfindet dann wird am OC1B entsprechend der Einstellungen reagiert.
Nun eine kleine Rechnung.
Interner Takt ist 8MHz.
PreScaler ist 8, also wird der Takt auf 1MHz reduziert.
Da der Timer auf 8Bit eingestellt ist, wird 1MHz durch 2^8 geteilt --> 3906,25Hz; 1/3906,25Hz=256µs
Also wird alle 256µs der Ausgang OC1B getoogelt.
Die wäre Gesetz dem Fall, dass OCR1B 255 beträgt.
Ist das soweit richtig oder habe ich hier schon einen Denkfehler?

Die andere Frage, woher weiß ich denn mit welcher Frequenz der Motor angesteuert werden muss um eine bestimmte Drehzahl zu realisieren?
Steht so etwas im Datenblatt? Gibt es zu den Asuro Motoren ein Datenblatt, auf der CD war keins dabei.

markusj
14.03.2014, 13:16
Also wird alle 256µs der Ausgang OC1B getoogelt.
Die wäre Gesetz dem Fall, dass OCR1B 255 beträgt.
Nein. Der Timer wird in einem PWM-Modus betrieben (oder sollte es zumindest). Die verbreiteten Bibliotheken nutzen 8-Bit-Phasenkorrektes PWM, d.h. der Timer zählt abwechselnd hoch und runter. Bei erreichen von OCR1 wird der Ausgang invertiert. Innerhalb von einem Zyklus (2*256µs) ist der Ausgang dabei zu OCR1/256 der Zykluszeit eingeschaltet. PWM beinflusst das Verhältnis Eingeschaltet/Ausgeschaltet, die Frequenz bleibt konstant!


Die andere Frage, woher weiß ich denn mit welcher Frequenz der Motor angesteuert werden muss um eine bestimmte Drehzahl zu realisieren?
Gar nicht. Das hängt vom Motor, vom Getriebe, von Reibungswiderständen (die wiederum von anderen Faktoren beeinflusst werden, wie etwa der Temperatur) und der Batteriespannung ab. Wenn du eine bestimmte Drehzahl erreichen möchtest, musst du eine Drehzahlregelung programmieren. Dazu sind die Radencoder (Reflektorscheiben + Reflexlichtschranke) des ASURO da, mit ihnen kannst du die Geschwindigkeit des ASURO ermitteln und diese Information nutzen um die Motorleistung entsprechend anzupassen.

mfG
Markus