Byta PWM (hastighet) innan motor når sitt mål

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Byta PWM (hastighet) innan motor når sitt mål

Inlägg av fosfor »

Hoy!

Förra tråden förblev olöst trots hjälp från flera. Jag lyckades helt enkelt inte få det att fungera med att motorn bromsar in innan den når stopp position.
Så nu ger jag mig på en (förhoppningsvis) "lättare" lösning på problemet... :roll: Med att istället för en mjuk inbromsning iaf ändra hastigheten
till en lägre innan den når sin stopp position. Kommer inte bli lika "snyggt" men skulle lösa mitt grundläggande problem.

Jag har alltså en motor som jag kan köra fram och tillbaka vid en släde. Jag kan spara en valfri position via pulsräkningen. Och den kan stanna på sparad position.
Det fungerar så långt. Ett problem är bara det att motorn "glider" lite precis efter att den stoppar via koden, så den tar någon halvsekund att
stanna. Detta kan korrigeras via koden nedan som bestämmer att den ska stanna 45 pulser innan sitt riktiga stopp. Då glider den in exakt rätt.
Kruxet med denna lösning är dock att när det är lite mer tyngd på motorn, då stannar den ju mycket tidigare istället, pga gravitation osv. Mindre glid.
Så den blir inte jättepålitlig.
Jag skulle vilja ha ner hastigheten istället när den börjar närma sig sin stopp-punkt.
Motorstyrningen styrs via en 0-5V PWM signal från Arduininon. Så tanken är att få koden att förstå att 45 pulser ifrån målet/stoppet,
så ska den sänka PWM från siffra 250 (nästan 5V) till typ siffran 200. Då kommer den mycket långsammare till sitt stoppmål och den kommer hamna
mer exakt. Då kommer den inte glida in och över sitt stopp för att den kör för snabbt. Eller iaf mycket mycket mindre.

Jag har suttit i flera dagar för att försöka få eländet att fungera nu. Men förstår inte vad det är jag gör fel :(
Jag har försökt dela upp första raden kod här nedan. För att separera på Fram och Tillbaka, även testat utan.
Samt att när den når denna punkt +45 eller -45 så ska den skicka signal att bara sänka PWM'et.
Men inget har fungerat. Jag skulle verkligen behöva lite guidning och hjälp.

Min signal till PWM ut från Arduino heter controlPin2.
HighSpeed1Pin och HighSpeed2Pin är knapparna för fram och tillbaka.


Det här är den delen kod som fungerar bäst hittils.
Men den saktar inte ner på något sätt innan den når sin stopp.

Kod: Markera allt

  
  // ---- STOPPAR MOTORN i 1 sek när den är inom värdet -- Gäller oavsett om man åker FRAM och TILLBAKA
  // - och + värdet avgör hur långt innan riktiga stoppet som stoppet skall startas, används pga motorn glider lite innan den stannar

  {
    if ( UserStopPulseCount != 0 && PulseCount >= UserStopPulseCount - 45 && PulseCount <= UserStopPulseCount + 45 )

// Här på raden ovanför och under har jag försökt allehanda olika kommandon och varianter utan att få det att fungera

    {
      digitalWrite(controlPin1, LOW);
      digitalWrite(controlPin2, LOW);
      if(okgo==0){
      lcd.setCursor(0, 1);
      lcd.print("Users Stop");
      }
      int valA = digitalRead(HighSpeed1Pin); 
      int valB = digitalRead(HighSpeed2Pin);
      while (valA+ valB>0 && okgo==0){
      Serial.println("Users programmed STOP activated ⛔");
     // Serial.println("HighSpeed1Pin %3d HighSpeed2Pin %f",HighSpeed1Pin,HighSpeed2Pin);
      delay(0);
      valA = digitalRead(HighSpeed1Pin); 
      valB = digitalRead(HighSpeed2Pin);
      }
      okgo=1;
      
    }else{
    okgo=0;  
      }
  }    


På ren "svenska" är det en sån här kodsnutt jag behöver:
OM du kör FRAMÅT, och är inom 45 pulser från 0, då sänks PWM till 200, när du når 0, så stannar motorn.
Samt
OM du kör BAKÅT, och är inom -45 pulser från 0, då sänks PWM till 120, när du når 0, så stannar motorn.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av Icecap »

Det är egentligt ganska enkelt:
unsigned short ÄR_VÄRDE är den position som motorn har här och nu.
unsigned short BÖR_VÄRDE är dit den ska.
signed short KÖR är ett positivt eller negativt värde som PWM-delen ska styras av.

KÖR = BÖR_VÄRDE - ÄR_VÄRDE;
KÖR *= <någon lämplig faktor>; // Testa med 5 - 20 eller så
if(KÖR > 255) KÖR = 255;
if(KÖR < 0) KÖR = 0;

Man kan förfina det hela med att ha ett visst minimum PWM så att den t.ex. har en gräns vid t.ex. ±5%, blir det under är det 0% direkt.
Användarvisningsbild
HUGGBÄVERN
Tidigare soundbrigade
Inlägg: 32737
Blev medlem: 23 augusti 2006, 22:44:11
Ort: Lilla Paris
Kontakt:

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av HUGGBÄVERN »

??????????????????

Så när du inte får bra svar i en tråd, startar du en ny???????????????? :roll:
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av fosfor »

Huggbävern:
Jag fick bra svar, även ett kodexempel från bearing, men det blev för komplicerat. Fick det tyvärr aldrig att fungera.
Startade ny tråd för att det nu rör sig om en annan lösning, fast på samma problem så att säga. :humm:
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av fosfor »

Icecap skrev:Det är egentligt ganska enkelt:
unsigned short ÄR_VÄRDE är den position som motorn har här och nu.
unsigned short BÖR_VÄRDE är dit den ska.
signed short KÖR är ett positivt eller negativt värde som PWM-delen ska styras av.

KÖR = BÖR_VÄRDE - ÄR_VÄRDE;
KÖR *= <någon lämplig faktor>; // Testa med 5 - 20 eller så
if(KÖR > 255) KÖR = 255;
if(KÖR < 0) KÖR = 0;

Man kan förfina det hela med att ha ett visst minimum PWM så att den t.ex. har en gräns vid t.ex. ±5%, blir det under är det 0% direkt.

Mmm... Sitter o meckar med det där nu. Knepigt.
Får det inte att fungera ordentligt. Det är något i min "om, så gör detta" kod.
svanted
Inlägg: 5083
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av svanted »

med nedan kommer spänningen till motorn att börja sjunka när den är 51 steg från stoppet,
och den stannar om man släpper knappen.

otestat..
det finns säkert fel att rätta till.
typ att "PulseCount * speedFactor" får inte ge overflow då måste man ta till fler bitars int eller dividera PulseCount med något.
kontaktavstudsning på knapparna...
e.t.c.


vilka pinnar använder du?
alla klarar inte PWM?

Kod: Markera allt


int valA;
int valB;
int speed;
int speedFactor = 5;
int maxCount = ?;


void loop( void )
{


valA = digitalRead(HighSpeed1Pin); // läs av knappen höger
valB = digitalRead(HighSpeed2Pin); // läs av knappen vänster

if(  valA == TRUE )		//knappen höger intryckt
{
speed = PulseCount * speedFactor; // multiplicera med 5 for lämplig ramp

if( speed > 255 )	 // maska bort värden högre än vad PWM klarar
{
	speed = 255;

}
digitalWrite(controlPin1, 0);		//stoppa vänstergång
digitalWrite(controlPin2, speed);	//skicka PWM värdet till utgången	


}

else if(  valB == TRUE )	//knappen vänster intryckt
{
speed = maxCount - ( PulseCount * speedFactor); // subtrahera positionen från maximala 							// lägesvärdet

if( speed > 255 )
{
	speed = 255;

}
digitalWrite(controlPin2, 0);
digitalWrite(controlPin1, speed);


}
else
{
digitalWrite(controlPin2, 0);
digitalWrite(controlPin1, 0);



}

}
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av fosfor »

OK, problem nu löst.
Tack alla för förslag!
Användarvisningsbild
tecno
Inlägg: 27037
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: Byta PWM (hastighet) innan motor når sitt mål

Inlägg av tecno »

:humm:

Och vad var lösningen till problemet?
Skriv svar