PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motoransteuerung



luma
14.10.2005, 14:24
Hio. Ich arbeite mich gerade immer mehr in RN-Controll rein. Mein Problem ist, dass das Programm-Beispiel in der Dokumentation nur in Basic ist. Ich kann aber kein Basic, sondern programmiere in C und da ist einiges anders. Deswegen kann ich halt in der Dokumentation nicht nachschauen wie man dies und jenes programmiert…
Ich bin gerade an der Motoransteuerung und da brauch ich dringend Hilfe! Motoren will ich gerade im Moment nicht ansteuern sondern einfach nur verstehen wie das ganze funktioniert. Kann mir da jemand vielleicht ein bisschen Beispielcode posten und dokumentieren? Wäre sehr nett. Ich würde z. B. gern wissen mit welchem Timer das ganze funktioniert und wie man diesen Motortreiber auf der Platine ansteuern muss, et cetera.

Gruß
Lutz

Frank
15.10.2005, 18:02
Die meisten Anwender programmieren in Basic weils schneller geht und übersichtlicher ist, daher gibt es kaum C-Beispiele. Aber Basic ist eigentlich recht übersichtlich, so das du es mit C-Kentnissen eigentlich leicht übersetzen kannst. Bei RN-Control wird der Timer 1 zur Motorsteuerung verwendet.
Gute Tips dazu findet man hier:

https://www.roboternetz.de/phpBB2/viewforum.php?f=34
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=219


Hier Grundprinzip:


#include <avr/io.h>


/* Timer1 initialisieren */
void timer1_init(void);

int main(void)
{
/* Timer1 initialisieren */
timer1_init();

OCR1AL = 0xff;
OCR1BL = 0x7f;
while (1) ;
}

/* Timer1 initialisieren */
void timer1_init(void)
{
/* normale 8-bit PWM aktivieren ( nicht invertiert ),
Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

/* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);

/* Interrupts für Timer1 deaktivieren
Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
TIMSK &= ~0x3c;
}


Vielleicht kann ein C-Programmierer mal ein paar weitere Beispiele ins WIKI posten

luma
15.10.2005, 22:32
Hio Frank. Was muss den dann passieren wenn ich das Programm in den µC flashe? Ich hab das jetzt gemacht. Zuerst hab ich mein Voltmeter an einen Motorausgang gehalten, da kam aber keine Spannung. Hab da aber wenig auf meinem Display gesehen… D. h. 0 V wurden mir da angezeigt (ich hab bei meinem Voltmeter alle Einstellungen für Volt durchgetestet, aber eigentlich dürfte hier ja nur Gleichstrom rauskommen, wenn ich PWM richtig verstanden habe). Jedenfalls kommt kein Strom. Dann hab ich an den beiden Pins OC1A sowie AC1B die Spannung gemessen. Da bekomme ich dann für
- OC1A 0,86 Volt
- OC1B 0,79 Volt
Ist das so okay? Ich check jetzt aber gerade null was dass alles soll!
Hinweis: Ich hab mal aus versehen den ISP-Stecker in den Port D gesteckt und dann natürlich erfolglos versucht den µC zu flashen. Der ISP-Programmer hat nichts abbekommen, ich kann immer noch erfolgreich meinen µC flashen. Nur beim Port bin mir nicht ganz sicher. Kann das vielleicht damit was zu tun haben dass ich keine Spannung an den Motorausgängen messen kann?

Gruß
Lutz

Andree-HB
16.10.2005, 08:26
PWM kannst Du mit einem normalen Messgerät nicht richtig messen, da brauchst Du ein Oszi für. Es ist halt ein gepulstes Signal. Vielleicht misst Du was bei PWM=255, dann ist die Pulsweite nämlich komplett "gefüllt"

Und das mit dem ISP-Stecker ist wohl fast jedem Besitzer von RN-Control schon passiert, habe mir Stecker und Buchse nun farbig markiert. Den ISP-Anschluss / Port macht es (bei mir zumindest) soweit nix aus...

luma
17.10.2005, 12:51
PWM kannst Du mit einem normalen Messgerät nicht richtig messen, da brauchst Du ein Oszi für. Es ist halt ein gepulstes Signal. Vielleicht misst Du was bei PWM=255, dann ist die Pulsweite nämlich komplett "gefüllt"


Nee, ich kann nichts messen. Hab leider kein Oszi. Aber wie soll sich da bitte ein Motor drehen? Ich hab hier einen ganz billigen. Kann ich den mal anschließen, wenn ich ein ganz kleines PWM-Signal (oder wie man das in diesem Fall nennt) einstelle?

17.10.2005, 13:01
Wenn er nicht mehr als 1A zieht und mit der Spannung läuft, dann probiers doch

luma
17.10.2005, 20:06
Also der Motor dreht sich nicht. Steht D/4V drauf... Eigentlich müsste sich ja an den OC1A/B Pins was ändern, wenn ich für die jeweils im Programm nen anderen Wert angeben... Ich grieg immer die gleiche Spannung...

Andree-HB
18.10.2005, 05:30
....schliesse doch einfach mal den Motor oder eine Lampe an den dafür vorgesehenen, schwarzen Motorklemmen an - PD4/5 sind ja nur die Enable-Leitungen für den vorgeschalteten (Motor-)treiber.

Ausserdem solltest Du Dir generell aber vielleicht nochmal die grundlegende Funktion einer Pulsweitenmodulation anschauen.

luma
18.10.2005, 11:56
Hio. Es geht! Ich weiß net so recht, aber ich glaub es war ein stromtechnisches Problem. Kann es sein, dass wenn zu wenig Strom aus dem Netzteil kommt das der µC zwar weiter läuft aber einfach kein Strom an den Motorausgängen rauskommt? Ich hab hin und her getestet und irgendwann kam mir dann die Idee das ich mal das Test-Hexfile welches mitgeliefert wird aufspiele. Naja, da hab ich dann wieder gemessen aber nur am zweiten Motorausgang kam Saft am ersten nicht. Hab dann hin und her gespielt (keine Ahnung was ich schlussendlich anders gemacht habe) und auf einmal (nur so zum Test wieder einmal den kleinen Motor drangehoben) ein ziemlich lautes und unangenehmes quuuuiiiiiiiiiiiiittttttttttttzzzzzzzzzzzccccc (usw.) und der Motor hat sich ganz schön schnell (wenn auch Widerwillens ;D ) gedreht 8). Ich glaube in meinem Fall ist das ein Softwarefehler. Ist denn der obige Code wirklich korrekt? Überprüft das doch bitte noch einmal. Ich hab nämlich null Erfahrung mit PWM :(.

Lutz

Kjion
24.10.2005, 15:58
Ist denn der obige Code wirklich korrekt? Überprüft das doch bitte noch einmal.

Der obige Code ist korrekt, da bin ich mir sicher. Wenn du ihn so auf das RN Control Board gespielt hast sollte eigentlich klar sein, das an den Motorausgängen sich erstmal gar nichts tun kann, dazu müsstest du erst die entsprechenden Enableleitungen des L293D setzen.

Die gemessenen Spannungswerte hören sich doch ganz gut an. Den genauen Wert kannst du mit deinen Multimeter nicht bestimmen, höchstens wenn du einen Tiefpass dahinter baust, ansonsten schafft es das Multimeter nicht das Signal auszuwerten.


und der Motor hat sich ganz schön schnell (wenn auch Widerwillens ;D ). Ich glaube in meinem Fall ist das ein Softwarefehler.

Warum sollte es den ein Softwarefehler sein wenn sich der Motor zu schnell dreht ??

Versuchs mal mit folgendem Programm:

#include <avr/io.h>

/* F_CPU sollte schon im Makefile definiert sein.
Wenn nicht, dann einfach hier auskommentieren und
Quarzfrequenz entsprechend eintragen */

//#define F_CPU 16000000L

void init(void);
void timer1_init(void);
void delay_ms(unsigned int ms);

/**
* \brief Hauptprogramm
*/
int main(void)
{
init();

timer1_init();

PORTC = (1<<PC6);
PORTB = (1<<PB0);

while(1)
{
OCR1AL += 20;
OCR1BL += 20;

delay_ms(1000);
}

return 0;
}

/* Initialisierung des µC */
void init(void)
{
/* Port A als Eingang deklarieren ( A/D-Wandler Eingänge ) */
DDRA = 0x00;
PORTA = 0x00;

/* Port B als Ausgang deklarieren */
DDRB = 0xff;
PORTB = 0x00;

/* Port C als Ausgang deklarieren */
DDRC = 0xff;
PORTC = 0x00;

/* Port D als Ausgang deklarieren */
DDRD = 0xff;
PORTD = 0x00;
}


/* Timer1 initialisieren */
void timer1_init(void)
{
/* normale 8-bit PWM aktivieren ( nicht invertiert ),
Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

/* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);

/* Interrupts für Timer1 deaktivieren
Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
TIMSK &= ~0x3c;

OCR1A = 0;
OCR1B = 0;
}

/* Eine kleine Warteschleife */
void delay_ms(unsigned int ms)
{
unsigned int zaehler;

while (ms)
{
zaehler = F_CPU / 5000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}

Wenn das nicht funktioniert, dann kommentier mal timer1_init(); und die beiden OCR1A Befehle aus und füg mal folgendes ein:
PORTD = (1<<PD4)|(1<<PD5);

Wenn es dann immer noch nicht geht, dann ist irgendwas grundlegendes mit deinem Board falsch :-)

MfG Kjion