Skriva ut steg till LCD ändrar RPM på motor (Arduino)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Corpze »

Hej, har ett problem med att när jag kör min stegmotor och printar ut antal steg till min LCD så räknar den lite lustigt när den byter från negativt till positivt värde på antalet steg, samt när den lägger till / drar ifrån en nolla (tex. från 9999 till 10000) så ändrar motorn hastighet en aning, vad kan detta vara för nåt fuffens?

Har satt; int manualNoOfSteps = 1;

och resten av koden ser ut såhär;

MVH

Kod: Markera allt

lcd.setCursor(0,0);
        lcd.print("Steps:");

delayMicroseconds(200);
val = digitalRead(buttonIN);
  if (val == LOW)
  {
    digitalWrite(powerPin, HIGH);
    digitalWrite(dirPin, HIGH);
    while (val == LOW) {
      digitalWrite(stepperPin, HIGH);
      delayMicroseconds(300);
      digitalWrite(stepperPin, LOW);
      delayMicroseconds(300);
      manualNoOfSteps +=1;
      if ((manualNoOfSteps % 10) == 0) {
        lcd.setCursor(6,0);
        lcd.print(manualNoOfSteps);
}
      val = digitalRead(buttonIN);
    }
    powerMillis = millis();
  }
  
//OUT

delayMicroseconds(200);
  val = digitalRead(buttonOUT);
  if (val == LOW)
  {
    digitalWrite(powerPin, HIGH);
    digitalWrite(dirPin, LOW);
    while (val == LOW) {
      digitalWrite(stepperPin, HIGH);
      delayMicroseconds(300);
      digitalWrite(stepperPin, LOW);
      delayMicroseconds(300);
      manualNoOfSteps -=1;
      if ((manualNoOfSteps % 10) == 0) {
        lcd.setCursor(6,0);
        lcd.print(manualNoOfSteps);
}
      val = digitalRead(buttonOUT);
    }
    powerMillis = millis();
  }
 // END OF MY OWN BUTTONCODE
 
 // MY OWN DHT TO LCD-CODE
 
 // Reading temperature or humidity takes about 250 milliseconds!
 // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 float h = dht.readHumidity();
 float t = dht.readTemperature();

 // check if returns are valid, if they are NaN (not a number) then something went wrong!
 if (isnan(t) || isnan(h)) {
 lcd.setCursor(1,1);
 lcd.println("Failed to read from DHT");
 } else {
  lcd.setCursor(9,1);
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0,1);
  lcd.print(t);
  lcd.print(" C");
  }}
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Klas-Kenny »

Det är ju inte så konstigt.

För att stegmotorn ska hålla en konstant hastighet måste ju Arduinon se till att pulserna kommer ut med exakt jämna mellanrum hela tiden.

Men när det ändras ifrån tex. 9999 till 10000 så ska ju fem nya tecken skrivas ut till LCD-displayen, det tar en liten stund för processorn att göra, vilket givetvis då påverkar hastigheten hos motorn.
Och jag antar att när du ändrar från positivt till negativt värde så sätts ett minustecken ut på displayen, före siffrorna vilket gör att de ska flytta sig ett steg åt höger, dvs. alla siffror ska skrivas ut igen, samma sak som ovan. :)
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Corpze »

Ok, så det är alltså en hårdvarubegränsning kan man säga?
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av void »

Jag är ingen expert på Arduino men LCD-displayer är inte raketsnabba att skriva till. Om man kikar i biblioteksfunktionen till Arduino för utskrift till LCD så ser man att det finns fördröjningar på i stoleksordningen 100uS inlagda för inklockning (E) av data till LCD¨n. Eftersom dina pulser är korta kommer, som Klas-Kenny redan påpekat, tiderna att påverkas.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Klas-Kenny »

Ptja, fast det mesta sådant går alltid att komma runt med lite smart programmering så länge man inte ligger nära max vad processorn hinner med.

Alla "delayMicroseconds" slösar ju upp en hel massa klockcykler, borde gå att lösa genom att använda timers istället (Finns väl någon funktion som heter millis() på Arduino, borde gå att använda bra här).
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Corpze »

Så man skriver alltså en fördröjning till lcd'n med funktionen millis? jag har inget behov av att kunna utläsa varje steg den gör under tiden den kör motorn, kanske var 10e eller var 20e räcker, bara när den stannar att jag kan läsa av då.

Jag märkte även att varje gång jag kör motorn förbi "nollan" så lägger den till en nolla på värdet... Så om jag går från negativt till positivt värde så multiplicerar den allt med tio... Sen så känns det som den räknar stegen extremt snabbt, min motor har 200 steg på ett varv men den räknar långt fler, kanske det tiodubbla...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av dangraf »

Om du istället skapar ett timer-interrupt där du lägger ut stegen så kan du ändra varvtalet genom att ändra intervallet på timer interruptet. Då kan du i bakgrunden hela tiden skriva ut till din långsamma display medan timern går in och avbryter emellanåt för att styra motorn. Då får du alltid exakt tid mellan varje steg oavsätt vilken display du använder eller om du t.ex lägger in mer kod in din while-snurra.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Corpze »

Har kikat lite på timerinterrupts, fann ett enklare bibliotek som kanske kan hjälpa;
http://playground.arduino.cc/Main/MsTimer2

Men kan det hjälpa om man drar upp

Kod: Markera allt

if ((manualNoOfSteps % 10) == 0)
till 100 eller 1000%?
Jag är fortfarande osäker på hur procentsatsen i den kodsträngen fungerar?
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av void »

Det är inte procent utan modulo: http://www.arduino.cc/en/Reference/Modulo
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Corpze »

Ok, så om jag har satt:
int manualNoOfSteps = 1; och
if ((manualNoOfSteps % 10) == 0)

så blir remaindern ett i min sketch?

Edit:

Har nu lyckats fått motorn att gå utan ansträngning, m.h.a msTimer2.h

Däremot har jag problem med räkningen, men kan det va så att "gamla" tecken ligger kvar, har ju inget lcd.clear-kommando? så när jag kör från 10000 till 9000 så skriver den ut 90000.... nollan kanske ligger kvar?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av dangraf »

tänkte bara höjja ett varningens finger för modulu beräkningar i en timerinterrupt rutin.
beroende på vad du har för hårdvara och storleken på talet du kör modulu på kan denna rad ta väldigt många instruktioner att beräkna. Den beräknas ung som en divition vilket många 8 och 16 bitars arkitekturer inte stöder hårdvarumässigt.
Har man då en interrupt med några microsekunder mellan (för att få så hög upplösning som möjligt) och ska beräkna detta varje gång man stegar sin räknare, finns det risk att man inte hinner med så mycket annat. Har man riktig otur avbryter interrupten sig själv för att den inte hunnit klart och då blir det ännu konstigare.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Skriva ut steg till LCD ändrar RPM på motor (Arduino)

Inlägg av Corpze »

Tog bort alla moduls jag hade, funkar prima med utskrivningen till lcdn också nu, satte en sprintf(s, "%7ld", manualNoOfSteps); och nu skriver den ut bra.
Skriv svar