PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motor - Geschwindigkeitssteuerung funktioniert nicht



Relaxed
12.04.2011, 18:28
Hallo zusammen,

Ich probiere verzweifelt bei einem DC-Motor die Geschwindigkeit zu steuern.
Ich habe einen Arduino und den L293D. Die Drehrichtung steuern ist kein Problem.
Heute hab ich mal den Wert eines Potentiometers ausgelesen und bin mit dem Wert auf den Enable-Eingang vom IC. Ab einem PWM Wert von ca. 80 fängt der Motor an zu drehen. Auch wenn ich jetzt höher gehe ändert sich die Drehzahl nicht.
Kann mir vielleich jemand sagen an was es liegen kann? Vielleicht habe ich auch einfach einen Denkfehler gemacht.


Mfg Relaxed

Hubert.G
13.04.2011, 09:39
Kannst du mit einem Oszi kontrollieren ob sich das PWM-Verhältnis auch entsprechend ändert.
Wenn der Motor unbelastet ist, kann es auch sein das er auch bei einem geringerem PWM-Verhältnis die der Spannung entsprechende max. Drehzahl erreicht.

Relaxed
13.04.2011, 17:40
Kannst du mit einem Oszi kontrollieren ob sich das PWM-Verhältnis auch entsprechend ändert.
Wenn der Motor unbelastet ist, kann es auch sein das er auch bei einem geringerem PWM-Verhältnis die der Spannung entsprechende max. Drehzahl erreicht.


Hm leider besitze ich kein Oszilloskop... Ich denke aber, dass die PWM-Ausgabe in Ordnung ist. Ich habe hier einen 5V und einen 24V Motor. Bei beiden besteht das gleiche Problem ob unbelastet oder belastet. Die Spannung am Motor-Terminal Ausgang bleibt auch immer konstant.

Welche Alternativen gäbe es noch um die Spannung mit PWM-Werten zu steuern? Dass ich zum Beispiel beim PWM-Wert 0, 0V habe und bei einem Wert von 255 24V.

Danke für die Hilfe.


Gruss Relaxed

Hubert.G
13.04.2011, 17:48
Die einfachste Art zu testen ob der PWM Ausgang vom µC funktioniert ist eine LED mit Vorwiderstand dran hängen. Die Helligkeit der LED ist zwar nicht propotional der PWM, aber man kann die Änderung erkennen.
Das was du willst sollte sich schon mit PWM machen lassen, allerdings kenne ich weder Hardware noch Software von dir.

oberallgeier
13.04.2011, 18:25
... denke aber, dass die PWM-Ausgabe in Ordnung ... 5V und einen 24V Motor. Bei beiden besteht das gleiche Problem ...Das klingt ja eher so, als sei die PWM eben nicht in Ordnung. Keine Ahnung wie Du den L293 am arduino angeschlossen hast. Aber ich habe hier (m)einen Schaltplan (http://oberallgeier.ob.funpic.de/m168d-schaltung-x97.pdf) und dazu gibts auch den Code für die Ansteuerung von zwei Motoren. Im Schaltplan ist eine funktionierende Anbindung des L293D, der Controller ist ein m328 (mitunter ein m168er), im Code die dazugehörige Software. Möglicherweise hilft es Dir, wenn Du diesen Code mit Deinem vergleichst. . . . .


/* >>
. . . . .
================================================== =================================
Target MCU : siehe main
Target Hardware : MiniD0
Target cpu-frequ. : In der Quelle wählbar
================================================== =================================
Enthaltene Routinen: Alle Motorroutinen
. . .
void TC0PWM_init(void) //Init Timer/Counter0 für Erzeugung des PWM-Signals
void setPWMrechts(uint8_t speed) //Geschwindigkeit rechter Motor
void setPWMlinks(uint8_t speed) //Geschwindigkeit linker Motor
void Mrechtsvor(void) //Motor dreht im mathematischer Drehsinn
void Mrechtszur(void) //Motor 1,2 dreht im Uhrzeigersinn
void Mrechtsstop(void) //Motor aus
void Mlinksvor(void) //Motor dreht im mathematischer Drehsinn
void Mlinkszur(void) //Motor 3,4 dreht im Uhrzeigersinn
void Mlinksstop(void) //Motor aus
================================================== =================================
*** Versionsgeschichte:
====================
x32 11Okt10 1730 In ~tst~/RC5t_17: Bitanalyse "just in time" - LÄUFT gut
Ausgabe nur als dezimale Darstellung von Adress- und Befehlsbyte
x00 01Nov09 1910 Übernahme des Originals, aus dem Directory
. . .
================================================== =================================
*** Aufgabenstellung : Software für R3D01
Original: . . . .
================================================== =================================

================================================== ============================== */

// ================================================== ===============================
// ================================================== ===============================
void TC0PWM_init(void) //Init Timer/Counter0 für Erzeugung des PWM-Signals
{
TCCR0A |= (1<<COM0A1)|(1<<COM0B1); //Clear/set OC0A/OC0B on Compare Match,
// doc S102 , OC0A/OC0B ist Port PD6/D5
TCCR0A |= (1<<WGM01)|(1<<WGM00); // Fast PWM, TOP=0xFF=dez255, doc S104
// das ergibt aus 20 MHz mit Prescaler 1/64 1220 Hz
TCCR0B |= (1<<CS01)|(1<<CS00); // Prescaler ist clk/64 doc S106
TIMSK0 &= ~(1<<OCIE0A)|(1<<OCIE0B); // Tmr/Cntr0 Oput CompB Match intrrpt dsabld
TIMSK0 &= ~(1<<TOIE0); // Tmr/Cntr0 Overflow interrupt disabled
OCR0A = 0; // PWM auf Null setzen
OCR0B = 0; // PWM auf Null setzen
}
// ================================================== ===============================
void setPWMrechts(uint8_t speed) //Geschwindigkeit Motor 12 (rechter)
{OCR0B = speed;} // PWM auf PD5/OC0B, korrig. 24mrz09
// ================================================== ===============================
void setPWMlinks(uint8_t speed) //Geschwindigkeit Motor 34 (linker)
{OCR0A = speed;} // PWM auf PD6/OC0A, korrig. 24mrz09
// ================================================== ===============================

// ================================================== ===============================
// Motoransteuerung mit dem L293D, hier werden die Drehrichtungen gesetzt
// Anschlüsse M168 für R3D01 für die Motoransteuerung (Stand 24mrz09 1410) :
// Motor 12 ist in Fahrtrichtung rechts (Kennzeichen 1 Punkt)
// Motor 34 ist in Fahrtrichtung links (Kennzeichen 2 Punkte)
/*
(E7) _|-- 1,2 Guz, PD4___6 23___PC0, SFH 5110, IN irDME 1-2
. . . . . . . . . . . .
XTAL1 PB6___9 20___VCC
XTAL2 PB7 10 19 PB5, SCK
(E6) PWM 1,2 uz+Guz,PD5 11 18 PB4, MISO, _|-- 1,2 uz, Taster1
(E5) PWM 3,4 uz+Guz,PD6__12 17___PB3, MOSI, Reserve 2
(E8) _|-- 3,4 uz,PD7 13 16 PB2
(E9) _|-- 3,4 Guz,PB0 14 15 PB1 */
// -----------------------
// Drehrichtungsbefehle für Motor 1,2 = "rechter" Motor
void M12pos (void) // Mot12 dreht im Uhrzeigersinn = neg. math.
{ PORTB |= (1<<PB4); PORTD &= ~(1<<PD4); mdir12 = 1; }
// r r r r r r r Motor 1,2 = rechter Motor r r r r r r
void M12neg (void) // Mot12 dreht im mathematisch positiven Drehsinn
{ PORTB &= ~(1<<PB4); PORTD |= (1<<PD4); mdir12 = -1; }
// r r r r r r r Motor 1,2 = rechter Motor r r r r r r
void M12stp (void) // Motor 12 aus
{ PORTB &= ~(1<<PB4); PORTD &= ~(1<<PD4); }
// -----------------------
// Drehrichtungsbefehle für Motor 3,4 = "linker" Motor
void M34neg (void) // Mot3,4 dreht im Uhrzeigersinn = neg. math.
{ PORTB |= (1<<PB0); PORTD &= ~(1<<PD7); mdir34 = 1; }
// l l l l l l l Motor 3,4 = linker Motor l l l l l l
void M34pos (void) // Mot3,4 dreht im mathematisch positiven Drehsinn
{ PORTB &= ~(1<<PB0); PORTD |= (1<<PD7); mdir34 = -1; }
// l l l l l l l Motor 3,4 = linker Motor l l l l l l
void M34stp (void) // Motor 12 aus
{ PORTB &= ~(1<<PB0); PORTD &= ~(1<<PD7); }
//
// - - - - - - - Übersetzungstabelle für "alten" Code
void Mrechtsvor (void)
{ M12pos (); return; }
void Mrechtszur (void)
{ M12neg (); return; }
void Mrechtsstop (void)
{ M12stp (); return; }
void Mlinksvor (void)
{ M34neg (); return; }
void Mlinkszur (void)
{ M34pos (); return; }
void Mlinksstop (void)
{ M34stp (); return; }
// ================================================== ===============================

// ================================================== ===============================
// ===== ENDE Subroutinen ================================================== ===
// ================================================== ===============================


Immerhin: dieser Antrieb in meine beiden autonomen Dosen R2D03 und R3D01/MiniD0 läuft und läuft und läu...

Relaxed
13.04.2011, 18:39
Ich hab das Problem gefunden! Ich habe den Enable-Eingang an einen Ausgang ohne PWM-Unterstützung angeschlossen...peinlich.
Jetzt funktioniert alles wie es soll.

Vielen Dank an euch!


Mfg Relaxed

PS: @oberallgeier: Danke für den Code und den Schlatplan.

Richard
14.04.2011, 11:16
Hallo zusammen,

Ich probiere verzweifelt bei einem DC-Motor die Geschwindigkeit zu steuern.
Ich habe einen Arduino und den L293D. Die Drehrichtung steuern ist kein Problem.
Heute hab ich mal den Wert eines Potentiometers ausgelesen und bin mit dem Wert auf den Enable-Eingang vom IC. Ab einem PWM Wert von ca. 80 fängt der Motor an zu drehen. Auch wenn ich jetzt höher gehe ändert sich die Drehzahl nicht.
Kann mir vielleich jemand sagen an was es liegen kann? Vielleicht habe ich auch einfach einen Denkfehler gemacht.


Mfg Relaxed

Kannst Du das etwas näher beschreiben? Du liest über ADC das Poti aus und legst den Gemessenen Wert auf den Enable Eingang des Treibers? Das wird so nicht gehen. Der Poti Wert gehört in ein OCRA oder OCRB Register und der Pin OCRA Oder OCRB gehört an den Enable Eingang. PWM Muss natürlich eingeschaltet sein. Oder hast Du es so gemacht und nur etwas ungenau beschrieben?

Gruß Richard

Relaxed
14.04.2011, 16:53
Kannst Du das etwas näher beschreiben? Du liest über ADC das Poti aus und legst den Gemessenen Wert auf den Enable Eingang des Treibers? Das wird so nicht gehen. Der Poti Wert gehört in ein OCRA oder OCRB Register und der Pin OCRA Oder OCRB gehört an den Enable Eingang. PWM Muss natürlich eingeschaltet sein. Oder hast Du es so gemacht und nur etwas ungenau beschrieben?

Gruß Richard


Ich hab den Wert des Potis ausgelesen und dann mit dem PWM Spektrum gemappt. Der Code war richtig, nur hab ich einen "falschen" Pin vom Arduino benützt welcher keine PWM unterstützt.

Es war auch nur ein Vorprojekt und zu schauen ob die Geschwindigkeitssteuerung funktioniert. Ich baue an einem autonomen Fahrzeug. Jedoch hab ich jetzt ein Ultraschallsensor dran welcher ab 100cm die Geschwindigkeit drosselt und die Motoren immer längsämer werden lässt je näher er einem Hinderniss zufährt.

Hier noch der Arduino Code:


#include "Ultrasonic.h"



int analogOutPin = 9;
int digitalPin = 7;
int trig = 12;
int echo = 13;
int var = 0;
int outputValue = 0;

Ultrasonic ultrasonic(12,13);


void setup() {

Serial.begin(9600);


pinMode(digitalPin, OUTPUT);
pinMode(analogOutPin, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);

}


void loop() {

digitalWrite(7, HIGH);

(var) = (ultrasonic.Ranging(CM));

if ((var) > 100){

analogWrite(analogOutPin, 255);
}

else {

outputValue = map(var, 0, 100, 0, 255);
analogWrite(analogOutPin, outputValue);
}
Serial.println(outputValue);

delay(10);
}


Mfg Relaxed