Go Down

Topic: [parte 2]Muoviamo i motori col PID (Read 1 time) previous topic - next topic

lesto

Quì presento 2 classi: la classe Motore, molto semplice, e la classe PID, che però implementa solo la parte P (spero che basti!  ;))

Motore.h:
Code: [Select]

#ifndef Motore_h
#define Motore_h

#include "WProgram.h"

class Motore{
 public:
 Motore(int);
 void update(int actualPower);
 private:
 int PWMpin;
};
#endif


Motore.cpp:
Code: [Select]

#import "Motore.h"

#define ENGINEMIN 20
#define ENGINEMAX 230

Motore::Motore(int pin){
 PWMpin=pin;
}

void Motore::update(int actualPower){
 actualPower=constrain(map(actualPower, 0, 255, ENGINEMIN, ENGINEMAX), ENGINEMIN, ENGINEMAX);
 analogWrite(PWMpin, actualPower);
}

ENGINEMIN e ENGINEMAX servono per evitare di fermare del tutto o mandare a massimo regime il motore.
l'input deve essere un numero compreso tra 0 e 255, anche se l'algoritmo risolve il problema di input errati, non lo farà proporzionalmente.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lesto

ed ecco la classe PID:
per capire meglio cosa fa in questo caso è pensata per passare da un angolo attuale ad un altro, e calcolarci la potenza del motore. Ma si tratta di una semplice proporzione, può essere usata anche per gestire temperature ecc...
per maggiori info date un'occhiata quì:
http://igor.chudov.com/manuals/Servo-Tuning/PID-without-a-PhD.pdf

PID.h
Code: [Select]

#ifndef PID_h
#define PID_h

class PID{
 public:
 PID(int);
 float update(float, float);
 void setP(int);
 private:
 int P;
};
#endif


PID.cpp
Code: [Select]

#include "PID.h"

PID::PID(int p){
 P=p;
}

float PID::update(float angle, float setPoint){
 return P*(setPoint-angle);
}

void PID::setP(int p){
 P=p;
}
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy