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