duinozone.cz - Arduino a Raspberry fórum

Autor Téma: Linearni actuator  (Přečteno 137 krát)

Offline Micky

  • Bastlíř začátečník
  • *
  • Příspěvků: 39
Linearni actuator
« kdy: Září 26, 2017, 13:44:39 odpoledne »
Zdravím vás, nemohl by někdo z vás mrknout na mů sketch?
Už nevím kde hledat chybu, Jedná se o řízení lineárního actuatoru s tím že actuator se zasouvá a vysouvá podle polohy potenciometru.
Problém je v tom že na jednu stranu funguje jak má, ale když ubírám, tak se actuator nehne.
Actuator má jako výstup 0-10V, mám udělaný převodník pomocí OZ aby na výstupu bylo 0-5V
H mustek je tvořen fety řízenými obvodem TC4427.

Díky za všechny postřehy.




const int feedback = A3; //vazební potenciometr actuatoru
const int pot = A1;      //potenciometr ridici


const int PWMA = 12;  // PWM H mustek
const int PWMB = 10;  // PWM H mustek

int actMax = 920; // Maximalni poloha actuatoru
int actMin = 10;  // Minimalni poloha actuatoru

int potMin = 0;   // Minimalni poloha potencimetru
int potMax = 1023;  // Maximalni poloha potenciometru

int precision = 2;  // Presnost
int checkingInterval = 50;  // Interval kontroly polohy v ms

int rawcurrentPosition = 0;
int currentPosition = 0;
int rawdestination = 0;
int destination = 0;
int difference = 0;

void setup()
{
  pinMode(feedback, INPUT);
  pinMode(pot, INPUT);
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  Serial.begin(9600);
}

void loop()
{   
    destination = getDestination();
    currentPosition = analogRead(feedback);
    Serial.print("Position    ");
    Serial.println(currentPosition);
    Serial.print("Destination ");
    Serial.println(destination);
    difference = destination - currentPosition;
   
    if (currentPosition > destination) pullActuatorUntilStop(destination);
    else if (currentPosition < destination) pushActuatorUntilStop(destination);
    else if (difference < precision && difference > -precision) stopActuator();
   
}

int getDestination()
{
    rawdestination = analogRead(pot);
    destination = map(rawdestination,potMin,potMax,actMin,actMax);
    return(destination);
}

void pushActuatorUntilStop(int destination)
{
  destination = getDestination();
  int temp = analogRead(feedback);
  difference = destination - temp;

  while (difference > precision || difference < -precision)
  {
    destination = getDestination();
    temp = analogRead(feedback);
    difference = destination - temp;
    pushActuator();
  }
  delay(25);
  stopActuator();
}

void pullActuatorUntilStop(int destination)
{
  destination = getDestination();
  int temp = analogRead(feedback);
  difference = destination - temp;

  while (difference > precision || difference < -precision)
  {
    destination = getDestination();
    temp = analogRead(feedback);
    difference = destination - temp;
    pullActuator();
  }
 
  delay(25);
  stopActuator();
}

void stopActuator()
{
  analogWrite(PWMA,0);
  analogWrite(PWMB,0);
}

void pushActuator()
{
  analogWrite(PWMB,255);
  analogWrite(PWMA,0);
}

void pullActuator()
{
  analogWrite(PWMB,0);
  analogWrite(PWMA,255);
}


Offline Micky

  • Bastlíř začátečník
  • *
  • Příspěvků: 39
Re:Linearni actuator
« Odpověď #1 kdy: Listopad 10, 2017, 13:49:38 odpoledne »
Pratele program jsem vyresil, mel jsem prehazene piny na procesoru a v programu. Nicmene mam jeste otazku kdyby nekoho neco napadlo. Pouzivam dva actuatory v jednom programu, v podstate jen zkopirovany program. Nicmene kvuli smycce While se mi motory ovlivnuji. Pokud jeden nedojede na pozicic, druhy nejede. Jak to udelat aby fungovali oba dva nezavisle na sobe? Nejaka jina smycka misto while? Diky za kazdou radu.