INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
DC-Motor Geschwindigkeit regeln
22.06.2019, 08:43 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2019 08:47 von Mjischa.)
Beitrag #1
DC-Motor Geschwindigkeit regeln
Hallo zusammen,
im Rahmen eines Schulprojekts hat meine Tochter einen primitiven Wecker gebaut.
Zur Verfügung stand nur ein DC-Motor an welchem ein Zeiger befestigt wurde.
Wenn der Zeiger bei "12 Uhr" über einen Photowiderstand fährt, beginnt ein delay für die voreingestellte "Weckzeit" zu der ein Tonsignal ertönt. Über einen Kippschalter sind folgende Einstellungen möglich:
1: alles aus; 2: Uhr läuft; 3: Alarm an.
Nun zu den Problemen:
Der Motor wird über PWM mit einem Wert von 20 in der Geschwindigkeit gedrosselt.
Da dies aus dem Stand heraus manchmal zu wenig erscheint, sollte er kurzzeitig mit einen höheren Wert "Starthilfe" bekommen und dann wieder auf 20 reduziert werden. Es macht aber den Anschein als wenn die Reduzierung völlig ignoriert wird.
Der Motor dreht nur mit der hohen Geschwindigkeit.
Ich verstehe nicht warum das so ist.
Es stehen auch keine weiteren Bauteile außer den verwendeten zur Verfügung.

Hier der Code:
Code:
int motor=5;
int licht=A0;
int lichtwert=0;// Variable fuer das Auslesen des Umgebungslichts
int lichtwert1=0; //Variable zum Vergleich des Umgebungslichts und dem Licht unter dem Zeiger
int AllesAus=8;
int weckerAn=10;
int AllesAusStat=0;
int weckerAnStat=0;


void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(motor, OUTPUT);
pinMode(weckerAn, INPUT);
pinMode(AllesAus, INPUT);
lichtwert1=analogRead(lichtwert); //einmaliges Einlesen des Umgebungslichts fuer den Vergleich
}



void loop() {

weckerAnStat=digitalRead(weckerAn);
AllesAusStat=digitalRead(AllesAus);
if(weckerAnStat==0 && AllesAusStat==1)
{analogWrite(motor,0);}
else if (weckerAnStat==1 || AllesAusStat==0)
{
analogWrite(motor, 255);
delay(40);
analogWrite(motor, 20);}



if (weckerAnStat==1 && AllesAusStat==0)
  {  
  Serial.println("Alarm an");
  lichtwert=analogRead(licht);
  Serial.print("Licht: ");
  Serial.print(lichtwert);
  Serial.println(", ");
  
     if (lichtwert < lichtwert1/3)
     {Serial.println("0-Punkt");
     delay(576);//Weckzeit:1=096; 2=192; 3=288; 4=384; 5=480; 6=576; 7=672; 8=768; 9=864; 10=960; 11=1056; 12=1152
     tone(2, 10);
     delay(200);
     noTone(2);}}
  
  
if (AllesAusStat==0 && weckerAnStat==0)
    {
    Serial.println("Alarm aus");
    analogWrite(motor, 20);
   }
  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2019, 08:53
Beitrag #2
RE: DC-Motor Geschwindigkeit regeln
(22.06.2019 08:43)Mjischa schrieb:  .....
Es macht aber den Anschein als wenn die Reduzierung völlig ignoriert wird.

Was genau heißt das ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2019, 10:30
Beitrag #3
RE: DC-Motor Geschwindigkeit regeln
Hallo,
ich möchte den Motor mit 255 starten, nach dem delay von 40ms reduzieren auf 20. Danach soll das restliche Programm ablaufen und der Motor die ganze Zeit mit 20 drehen.
Aber er bleibt immer auf den 255.

(22.06.2019 08:53)hotsystems schrieb:  
(22.06.2019 08:43)Mjischa schrieb:  .....
Es macht aber den Anschein als wenn die Reduzierung völlig ignoriert wird.

Was genau heißt das ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2019, 10:48 (Dieser Beitrag wurde zuletzt bearbeitet: 22.06.2019 10:50 von MicroBahner.)
Beitrag #4
RE: DC-Motor Geschwindigkeit regeln
(22.06.2019 10:30)Mjischa schrieb:  Hallo,
ich möchte den Motor mit 255 starten, nach dem delay von 40ms reduzieren auf 20. Danach soll das restliche Programm ablaufen und der Motor die ganze Zeit mit 20 drehen.
Aber er bleibt immer auf den 255.
loop() ist eine Schleife, die immer wieder aufgerufen wird. Damit wird, wenn dein WeckerAnStat auf true steht, auch deine Sequenz
Code:
else if (weckerAnStat==1 || AllesAusStat==0)
{
analogWrite(motor, 255);
delay(40);
analogWrite(motor, 20);}
immer wieder aufgerufen.
Also: Motor auf 255 -> 40ms warten -> Motor auf 20 -> loop bis ende durchlaufen ( geht schnell ) -> Motor wieder auf 255 -> 40ms warten ..... und immer so fort.
Der Motor läuft also immer nur ganz kurz mit der Einstellung 20 (wahrscheinlich so kurz, dass er da garnichts von mitbekommt ), und viel länger mit 255.

Du musst dir in einem zusätzliche Flag merken, dass der Motor schon gestartet wurde, und wenn das Flag gesetzt ist, den obigen Programmteil überspringen. Wenn der Motor gestoppt wird, setzt Du das Flag wieder zurück.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.06.2019, 23:22
Beitrag #5
RE: DC-Motor Geschwindigkeit regeln
Vielen Dank für den Vorschlag!
Ich wusste erst nicht so recht wie ich den Marker einbinden sollte, habe es aber am Ende hinbekommen.
Nochmals vielen Dank.

Muss ich das Thema jetzt schließen und wenn ja wie?

(22.06.2019 10:48)MicroBahner schrieb:  
(22.06.2019 10:30)Mjischa schrieb:  Hallo,
ich möchte den Motor mit 255 starten, nach dem delay von 40ms reduzieren auf 20. Danach soll das restliche Programm ablaufen und der Motor die ganze Zeit mit 20 drehen.
Aber er bleibt immer auf den 255.
loop() ist eine Schleife, die immer wieder aufgerufen wird. Damit wird, wenn dein WeckerAnStat auf true steht, auch deine Sequenz
Code:
else if (weckerAnStat==1 || AllesAusStat==0)
{
analogWrite(motor, 255);
delay(40);
analogWrite(motor, 20);}
immer wieder aufgerufen.
Also: Motor auf 255 -> 40ms warten -> Motor auf 20 -> loop bis ende durchlaufen ( geht schnell ) -> Motor wieder auf 255 -> 40ms warten ..... und immer so fort.
Der Motor läuft also immer nur ganz kurz mit der Einstellung 20 (wahrscheinlich so kurz, dass er da garnichts von mitbekommt ), und viel länger mit 255.

Du musst dir in einem zusätzliche Flag merken, dass der Motor schon gestartet wurde, und wenn das Flag gesetzt ist, den obigen Programmteil überspringen. Wenn der Motor gestoppt wird, setzt Du das Flag wieder zurück.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Shocked Lin Bus / Motor / Arduino Marc2014 5 618 19.09.2019 21:51
Letzter Beitrag: Bitklopfer
  Motor mit Ultraschall steuern matzesims 11 791 28.08.2019 10:40
Letzter Beitrag: hotsystems
  Motor mit Taster Vollgaser 3 779 14.03.2019 18:02
Letzter Beitrag: Bitklopfer
  Per Tastendruck Stepper-Motor eine bestimmte Drehung machen lassen Chef_2 2 1.071 09.10.2018 21:59
Letzter Beitrag: Chef_2
  Motor läuft nicht. Uwe1475 8 1.565 19.08.2018 14:43
Letzter Beitrag: Uwe1475
  Bewegung zweier Motoren mit unterschiedlicher Geschwindigkeit mit AccelStepper Yoink 2 1.073 15.07.2018 06:40
Letzter Beitrag: MicroBahner
  Stepper Motor (Ansteuerung) pm96 6 1.637 30.06.2018 20:29
Letzter Beitrag: pm96
  DC Motor und Hallsensor Zähler Crazy 18 3.242 11.05.2018 18:15
Letzter Beitrag: Crazy
  Anzahl Umdrehungen DC Motor Crazy 5 1.292 01.05.2018 13:01
Letzter Beitrag: Tommy56
  Stepper Treiber A4988 - Nema 17 Motor Crazy 3 1.520 27.04.2018 22:07
Letzter Beitrag: GuaAck

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste