Programmera mjuk inbromsning till viss position

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:

Programmera mjuk inbromsning till viss position

Inlägg av fosfor »

Hej!

Arduino MEGA + Curtis 1212 Motorstyrning

Jag har en motor som jag kan styra fram och tillbaka, samt programmera ett stopp (sitter rotary encoder på motorns axel).
Så när jag passerar det stoppet (pulsen) jag programmerat så stannar den vid den positionen.
So far ganska good :)

Problemet är att motorn tvärnitar när den kommer till rätt position. Varvid jag skulle vilja kunna ställa in så att den går ner i en lägre
hastighet innan den stannar, så att det blir ett lite mjukare stopp och som blir lite mer kontrollerat.
Typ att den går ner i hastighet i två steg, eller kanske till och med tre steg vore bra. :shock:

Curtis motorstyrningen styrs av en spänningssignal, så 0V är full spetta åt ena håller, 2.5V är stilla och 5V är fullt ös åt andra hållet.
Jag kan styra maxhastigheten med en siffra från 0 (0V) till 250 (5V), med PWM från MEGA'n.

Skulle alltså behöva något i koden som säger att när den är t.ex. 45 pulser från programmerad position så sänker den hastigheten
innan den stannar på den position den ska stanna på. :humm:

Koden där hastigheten för fullt ös framåt ser ut som följande.
("Åker fram långsamt" är bara för när den knappen trycks in, och påverkar inte programmerade stoppet).

Kod: Markera allt

{
    int valfast = digitalRead(HighSpeed1Pin);               // Åker fram snabbt
    int valslow = digitalRead(SlowSpeed1Pin);             // Åker fram långsamt
    if (valfast == HIGH || valslow == HIGH)               // Checkar om knappen trycks
    {
        if(valfast == HIGH)
            analogWrite(controlPin2, 250);                     // 250 är PWM som blir 5V ut, denna ser till att motorn snurrar snabbt/100%
        else if(valslow == HIGH)
            analogWrite(controlPin2, 200);                     // Valfri siffra, denna går långsammare när åka långsamt knappen trycks in

Det här är koden som ser till att stoppa motorn på sparad position
- 45 och +45 är att den stannar motorn när den är 45 pulser ifrån stoppet, detta pga att motorn har lite fördröjning så för att få den att
stanna exakt där jag vill så behövs detta. Men den stannar endå för hårt. Med en kontrollerad och programmerad inbromsning tror jag inte dessa
siffror skulle behövas.

Kod: Markera allt

  {
    if ( UserStopPulseCount != 0 && PulseCount >= UserStopPulseCount - 45 && PulseCount <= UserStopPulseCount + 45 )
    {
      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(100);
      valA = digitalRead(HighSpeed1Pin); 
      valB = digitalRead(HighSpeed2Pin);
      }
      okgo=1;
bearing
Inlägg: 11250
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Programmera mjuk inbromsning till viss position

Inlägg av bearing »

Spontant, en linjärt avtagande motorstyrka från 100% ned till 0% från position -45 ned till 0. Räta linjens ekvation. Sen kan du behöva justera lite, men jag föreslår detta som utgångspunkt. Kan göras så enkelt som att -45 ger ett "hopp" till 90%, och sedan minskas 2% för varje position.

Sen är det väl så att 255 ger 5V. Och mittläget 2,5V är 128. Inte 250 och 125.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Programmera mjuk inbromsning till viss position

Inlägg av fosfor »

bearing:
Spontant, en linjärt avtagande motorstyrka från 100% ned till 0% från position -45 ned till 0. Räta linjens ekvation. Sen kan du behöva justera lite, men jag föreslår detta som utgångspunkt. Kan göras så enkelt som att -45 ger ett "hopp" till 90%, och sedan minskas 2% för varje position.
Oki, ja det vore något! Skulle vara snyggare.
Vet du någon bra guide eller något jag kan titta på för att försöka börja implementera detta på min kodsnutt??

Sen är det väl så att 255 ger 5V. Och mittläget 2,5V är 128. Inte 250 och 125.
Ah, ja det stämmer!
kodar-holger
EF Sponsor
Inlägg: 920
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: Programmera mjuk inbromsning till viss position

Inlägg av kodar-holger »

Jag skulle kolla dom PID-bibliotek som finns för Arduino till att börja med. Kräver trimning av reglerparametrar men det är något du får leva med oavsett reglermetod. Det finns metoder för att hitta P, I och D experimentellt. Zieger-Nichols metod tror jag en heter.

Sen finns ett bibliotek som heter AccelStepper. Det är visserligen för stegmotorer men internt bör den komma till en "analog" lösning om vilken hastighet motorn skall hålla i varje ögonblick. Där bör man kunna koppla in sig även till en analog styrning. Har aldrig använt eller kollat i koden. Bara sett coola demos på youtube.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Programmera mjuk inbromsning till viss position

Inlägg av fosfor »

Ok, så PID finns som alternativ..

Vilka fler alternativ skulle jag ha?
Är det PID som gäller även om jag bara skulle vilja att den saktar ner i 2 steg innan den stoppar helt också?
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Programmera mjuk inbromsning till viss position

Inlägg av fosfor »

Känns som att lite kod där koden för stoppen finns borde kunna räcka?
Om jag alltså bara vill få den att gå ner i hastighet i olika steg innan den når sin stopp position.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Programmera mjuk inbromsning till viss position

Inlägg av Krille Krokodil »

P-regulatorn räcker nog bra här och den är enkel att skriva.

Utsignal = k*Avståndet till målet + 2.5 V.

Om det blir under 0 eller över 5 så sätter man utsignalen till 0 respektive 5.
download.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Programmera mjuk inbromsning till viss position

Inlägg av fosfor »

Krille Krokodil:

Ok, vet du någon bra guide eller hur jag ska skriva den?

Antar att jag placerar den någonstans i denna kod jag har:

Kod: Markera allt

 // ---- STOPPAR MOTORN när den är inom värdet -- 
  // - och + värdet avgör hur långt innan riktiga stoppet som stoppet skall startas, används till finkalibrering av stoppet pga motorns fördröjning
  {
    if ( UserStopPulseCount != 0 && PulseCount >= UserStopPulseCount - 45 && PulseCount <= UserStopPulseCount + 45 )
    {
      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(100);
      valA = digitalRead(HighSpeed1Pin); 
      valB = digitalRead(HighSpeed2Pin);
      }
      okgo=1;
      
      // -- Dessa tre rader nedanför gör pipljudet när användarens programmerade stopp aktiveras
      // tone(tonePin, 600);
      // delay(50);
      // tone(tonePin, 950);
      // delay(70);
      // tone(tonePin, 800, 125);
      // delay(800);
      // noTone(tonePin);
      // delay(1500);
    }else{
    okgo=0;  
      }
  }       //Går till raderna ovan
bearing
Inlägg: 11250
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Programmera mjuk inbromsning till viss position

Inlägg av bearing »

Jag vill inte riktigt ge några förslag. Tycker att din kod ser "farlig" ut. Först måste det fixas innan några finesser läggs till.

Ett realtidsprogram får aldrig fastna i några loopar, likt nedan:

Kod: Markera allt

      while (valA+ valB>0 && okgo==0){
      Serial.println("Users programmed STOP activated ⛔");
     // Serial.println("HighSpeed1Pin %3d HighSpeed2Pin %f",HighSpeed1Pin,HighSpeed2Pin);
      delay(100);
      valA = digitalRead(HighSpeed1Pin); 
      valB = digitalRead(HighSpeed2Pin);
      }
Den enda loopen bör vara huvudloopen, alltså funktionen loop() i ditt Arduino-program. Och programmet måste alltid följa samma sekvens, nämligen:
Läsa insignaler
Behandla
Sätta utsignaler

I en snabb följd (ms).

Programmet får aldrig fastna och fördöjas så att utsignalerna inte sätts på lång tid.
All "behandling" bör skötas via villkor (if-satser) och/eller med en tillståndsmaskin (switch/case). Behandlingen får aldrig fastna i en while-loop. Och det är heller inte nödvändigt om man tänker efter lite, och skriver programmet därefter. En if-sats i huvudloopen får ju samma effekt som en while-sats, utan att blockera resten av programmet.

Sen tycker jag att det ser väldigt mysko ut att du använder både analogWrite(controlPin2 och digitalWrite(controlPin2. Varför?
Varje gång du växlar mellan PWM-funktion och digital utgång innebär detta att PWM-modulen sätts på/av, med osäkert beteende som följd.

Vad gör förresten digitalWrite(controlPin1, LOW);?
Och om du sätter digitalWrite(controlPin2, LOW);, innebär inte det full back (0V)? vilket kanske förklarar varför den stannar med ett ryck.
Och sedan när denna pinne görs till PWM-utgång igen, kommer ju filtret ligga på 0V, vilket innebär att den kommer starta med full back innan filtret har nått önskad spänning.

Föreslår att aldrig blanda analoga och digitala funktioner på samma pinne. Om du inte verkligen vet vad du gör.

Varför vill du styra maskinen med knappar och inte ett vred/pedal?
Tydligen har du märkt att en knapp för fullt frammåt var för grovt, och har alltså lagt in en till, som ger "halvfart". Varför inte bara ha hela den analoga skalan?
Senast redigerad av bearing 26 mars 2019, 14:11:19, redigerad totalt 1 gång.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Programmera mjuk inbromsning till viss position

Inlägg av Krille Krokodil »

Skiss på tillståndsmaskin och mycket annat nyttigt finner du i denna tråden:

https://elektronikforumet.com/forum/vie ... 3#p1394493
Skriv svar