Page 1 of 1

Une Lib de régulation PID en micropython ?

Posted: Mon 19 Apr 2021 15:07
by sensor56
Salut,

est-ce que vous connaissez une bonne lib' de régulation PID en micropython ?

Pour l'instant, j'ai çà :

Première chose, l'existant en Micropython :

* pour la Pyboard : <https://github.com/jibonaronno/uPy-PID_Class>

Mais à priori, on devrait pouvoir utiliser du pur Python ici finalement :

* <https://pypi.org/project/simple-pid/>
* ou même ici encore plus simple : <https://github.com/ivmech/ivPID/blob/master/PID.py>

Toute suggestion bienvenue.

Re: Une Lib de régulation PID en micropython ?

Posted: Mon 19 Apr 2021 17:54
by Dominique
@Sensor56

Il y a aussi Control dc motor speed - PID controller.

J'aime assez bien la simplicité... il est aussi basé sur un article de Wikipedia.
Je dirais que tout le fil de discussion est assez intéressant

Dominique

Re: Une Lib de régulation PID en micropython ?

Posted: Tue 20 Apr 2021 12:45
by sensor56
@Dominique

OK, j'avais vu çà. Bon du coup, je copie la classe en question ici à des fins de mémo :

Code: Select all

class PID:
 
    def __init__(self, Kp, Ki, Kd, dt, setpoint, measure_func, output_func, output_min, output_max):
       
        self.Kp = Kp
        self.Ki = Ki
        self.Kd = Kd
        self.dt = int(round(dt / 1000)) # Convert from ms
        self.setpoint = setpoint
        self.measure_func = measure_func
        self.output_func = output_func
        self.output_min = output_min
        self.output_max = output_max
       
        self.error = setpoint - measure_func()
        self.integral = 0
       
        self.timer = Timer(-1) # Virtual timer
        self.timer.init(mode=Timer.PERIODIC, period=dt, callback=self.control)
   
    def control(self, timer):
        
        error = self.setpoint - self.measure_func()
        proportional = self.Kp * error
        self.integral = self.integral + error * self.dt
        
        # Prevent integral windup
        if (proportional > self.output_max) or (proportional < self.output_min):
            self.integral = 0
        
        self.derivative = (error - self.error) / self.dt
        output = proportional + self.Ki * self.integral + self.Kd * self.derivative
        self.error = error

        output = max(self.output_min, output)
        output = min(self.output_max, output)
        self.output_func(output)
        
    def setpoint(value):
        self.setpoint = value

    def stop(self):
        
        self.timer.deinit()

Re: Une Lib de régulation PID en micropython ?

Posted: Mon 31 May 2021 12:41
by Dominique
As tu eu l'occasion de tester la classe ?

Re: Une Lib de régulation PID en micropython ?

Posted: Tue 1 Jun 2021 07:20
by sensor56
Non, mais elle a l'air à peu près propre.

Re: Une Lib de régulation PID en micropython ?

Posted: Fri 3 Dec 2021 15:33
by Dominique
J'ai eu l'occasion de tester la bibliothèque sur le projet Plancha-CMS.
Elle fonctionne bien.... le plus compliqué reste de trouver la valeur des paramètres Proportionnel, Derivé, Integrale