【microbit】使用micropython实现增量式PID算法

闭环控制系统

image-20210529114021697

PID算法

image-20210529113838355

增量式PID

E(t) = 设定值-t时刻采样值

增量d计算公式

  • d = KP*[E(t)-E(t-1)]+KI*E(t)+KD*[E(t)-2E(t-1)+E(t-2)]

micropython程序实现

参考2011年电子设计大赛 风板控制系统(F题)

image-20210529151719918

角度检测采用精密导电塑料电位器

image-20210529151835649

使用microbit作为主控系统,仅用做PID程序测试。

1、风板垂直时,ADC采样值为730.

2、例程中设置目标值为760,约25~30度

程序实现:

# 在这里写上你的代码 :-)
from microbit import *

class PID_Inc:
    """增量式PID"""
    def __init__(self, KP=1, KI=1, KD=0.5):
        self.Kp = KP
        self.Ki = KI
        self.Kd = KD

        self.PreError = 0   
        self.PreDerror = 0
        self.error = 0
        self.d_drror = 0
        self.dd_error = 0
        self.dcalc = 0
        
    def setKp(self,KP):
        self.Kp=KP
        
    def setKi(self,KI):
        self.Ki=KI
        
    def setKd(self,KD):
        self.Kd=KD
    
    def update(self, Target, Current):
        self.error = Target - Current
        self.d_error = self.error - self.PreError
        self.dd_error = self.d_error - self.PreDerror
        self.PreError = self.error
        self.PreDerror = self.d_error
        self.dcalc = (
            self.Kp * self.d_error + self.Ki * self.error + self.Kd * self.dd_error
        )
        return self.dcalc


if __name__ == "__main__":
    pid = PID_Inc()
    pwm = 0
    adc_set = 770
    while True:
        if button_a.was_pressed():
            while True:
                sample = pin0.read_analog()
                d = pid.update(adc_set, sample)
                pwm = int(pwm + d)
                if pwm > 1023:
                    pwm = 1023
                if pwm < 0:
                    pwm = 0
                pin1.write_analog(int(pwm))
                print("{},{},{}".format(adc_set, sample, pwm))
                sleep(100)

打印函数主要用于SerialPlot软件绘制曲线观察。

适当调整kp ki kd的值,可以实现系统稳定。

Micropython PID是一种用于控制系统的算法,它可以根据系统的反馈信号来调整输出信号,以达到期望的控制效果。下面是Micropython PID使用方法和说明: 一、代码使用方法 1.1 Python3 版本 ```python from pid import PID pid = PID(1.0, 0.4, 1.2) pid.SetPoint=0.0 while True: pid.update(measurement_value) output = pid.output ``` 1.2 MicroPython - OpenMV版本 ```python from pyb import millis class PID: def __init__(self, Kp, Ki, Kd): self.Kp = Kp self.Ki = Ki self.Kd = Kd self.SetPoint = 0.0 self.PTerm = 0.0 self.ITerm = 0.0 self.DTerm = 0.0 self.last_error = 0.0 self.last_time = millis() def update(self, feedback_value): error = self.SetPoint - feedback_value delta_time = millis() - self.last_time delta_error = error - self.last_error self.PTerm = self.Kp * error self.ITerm += error * delta_time if delta_time > 0: self.DTerm = delta_error / delta_time else: self.DTerm = 0.0 self.last_time = millis() self.last_error = error return self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm) ``` 1.3 MicroPython - K210版本 ```python from machine import Timer class PID: def __init__(self, Kp, Ki, Kd): self.Kp = Kp self.Ki = Ki self.Kd = Kd self.SetPoint = 0.0 self.PTerm = 0.0 self.ITerm = 0.0 self.DTerm = 0.0 self.last_error = 0.0 self.last_time = Timer.current_time() def update(self, feedback_value): error = self.SetPoint - feedback_value delta_time = Timer.current_time() - self.last_time delta_error = error - self.last_error self.PTerm = self.Kp * error self.ITerm += error * delta_time if delta_time > 0: self.DTerm = delta_error / delta_time else: self.DTerm = 0.0 self.last_time = Timer.current_time() self.last_error = error return self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm) 二、说明 Micropython PID算法的参数包括比例系数Kp、积分系数Ki和微分系数Kd,这些参数需要根据具体的控制系统进行调整。PID算法的核心是根据反馈信号计算误差,并根据误差调整输出信号,以达到期望的控制效果。 三、参考资料 1. Micropython PID代码:https://github.com/micropython/micropython-lib/tree/master/pid 2. PID控制器 - 维基百科:https://zh.wikipedia.org/wiki/PID%E6%8E%A7%E5%88%B6%E5%99%A8 --相关问题--:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值