* 原始文章地址可能暂时无法访问,仅展示文章的摘要信息
「PID控制算法的C语言实现」的摘要信息
前言 最近给客户开发了一款关于控温的冲洗机项目,正好来记录下PID算法实现的过程 原理 学术概念网上很多,一查一大把。简单来说就是通过误差来控制被控量。控制器就是比例,积分,微分三个环节的加和。公式和流程图如下: 流程图待补充 公式待补充 比例系数Kp 积分系数Ki 微分系数Kd 误差err(t) 输出量u(t) 为了便于理解流程,我把参数直接带入到具体环境。 输入量是预设定温度; 输出量为实际温度; 传感器为高精度NTC探头; 执行器是可控硅 所以得出结论:误差就是输入值和输出值的差值,输入的是预期要达到的水温,输出量为实际水温,实际水温由探头获取。 那么,u(x)作为公式的输出量,和执行器输出的电压又是什么关系?执行器输出电压和温度又有什么关系?可控硅的控制原理不再赘述,网上也有很多,只要知道G极有电流流过,可控硅就导通。无电流,过零时,可控硅关断。 第一个问题:公式输出量其实就是一个占空比,可控硅斩波输出的电压和电网电压的比值等于这个占空比。有了输出电压的变化,可控硅就可以控制加热丝的功率,自然水温的温度上升速率就可以控制。 另外,PID还分为位置型和增量型,本项目使用的是位置型。 位置型顾名思义就是输出值和当前位置(时间)对应,适用于舵机,控温系统等。位置型由于存在累计误差,所以输出量u(x)和过去所有状态有关。公式和上面推到的公式相同,需要积分限幅和输出限幅。 增量型适用于步进电机这类控制单元。每次执行器的输入信号决定本次执行动作终点位置相对于上一次动作重点位置的改变量。所以增量型不需要累加误差,控制量只与最近三次采样值有关。只需输出限幅。 公式待补充 实现 变量 typedef struct { float Kp, Ki, Kd; // 三个比例系数 float setVal, targetVal; // 设定值和目...