为Teensy Atmega 32u4实施PI控制

问题描述 投票:0回答:2

我正在使用Teensy Atmega32u4的标准库实现PID控制。我的控制变量是PWM信号。我的过程变量是直流电机的当前角位置,该电机与10kohm电位器连接,其代码以0到270度的刻度读取位置ADC输入。设定点是激光切割操纵杆,其手柄也连接到10kohm电位计,该电位计以与过程变量相同的方式读取角度位置。

我的问题是如何实现控制方案的组成部分。积分项由下式给出:

Error = Set Point – Process Variable

Integral = Integral + Error

Control Variable = (Kp * Error) + (Ki * Integral)

但我不确定如何计算积分部分。我们是否需要考虑样本之间经过的时间量或仅累积误差并将积分部分初始化为零,以使其真正离散化?由于我使用C,积分项可以只是一个全局变量?

我是在正确的轨道上吗?

c pid atmega integral teensy
2个回答
0
投票

由于采样时间(计算PID之后的时间)总是相同的,因此无论是否将积分项除以采样时间都无关紧要,因为此采样时间仅作为Ki常数,但最好将积分项除以样本时间,以便如果你改变采样时间,PID随采样时间而变化但不是强制性的。

这是我为python中的Drone Robotics竞赛编写的PID_Calc函数。忽略“[index]”这是我制作的数组,使我的代码通用。

def pid_calculator(self, index):

    #calculate current residual error, the drone will reach the desired point when this become zero
    self.Current_error[index] = self.setpoint[index] - self.drone_position[index]      

    #calculating values req for finding P,I,D terms. looptime is the time Sample_Time(dt).
    self.errors_sum[index] = self.errors_sum[index] + self.Current_error[index] * self.loop_time 
    self.errDiff = (self.Current_error[index] - self.previous_error[index]) / self.loop_time

    #calculating individual controller terms - P, I, D.
    self.Proportional_term = self.Kp[index] * self.Current_error[index]
    self.Derivative_term = self.Kd[index] * self.errDiff
    self.Intergral_term = self.Ki[index] * self.errors_sum[index] 

    #computing pid by adding all indiviual terms
    self.Computed_pid = self.Proportional_term + self.Derivative_term + self.Intergral_term 

    #storing current error in previous error after calculation so that it become previous error next time
    self.previous_error[index] = self.Current_error[index]

    #returning Computed pid
    return self.Computed_pid

这里如果链接到我在git hub中的整个PID脚本。看看是否有帮助你。按下向上按钮ig = f u喜欢这个答案,并为我的Github存储库加注星标我喜欢github中的脚本。谢谢。


0
投票

要添加到上一个答案,还要考虑代码中积分的情况。如果发生饱和,应该有一些机制来重置积分项。同时选择最大可用数据类型以保持integram(sum)项,以避免积分溢出(通常为long long)。还要注意积分溢出。

如果您选择足够高的采样频率,则可以避免除法以减少所涉及的计算。但是,如果您想尝试采样时间,请将采样时间保持为2的幂的倍数,以便可以通过移位操作完成除法。例如,假设选择的采样时间为100ms,50ms,25ms,12.5ms。那么除法因子可以是1,1 << 1,1 -1 << 2,1 << 4。

将PID控制器的所有相关变量保存在单个struct中很方便,然后使用此struct作为在该PID上运行的函数中的参数。这样,代码将是模块化的,并且许多PID循环可以同时在微控制器上运行,使用相同的代码和struct的不同实例。这种方法在大型机器人项目中特别有用,在这些项目中,您有许多循环可以使用单个CPU进行控制。

© www.soinside.com 2019 - 2024. All rights reserved.