pid温度调节
/温度控制
typedef struct
{
u8 HeatEnable; //加热使能
float SetPoint; //设定值
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
float PrevError; //最后第二次误差数Er[-2]
float LastError; //最后 一次误差数Er[-1]
float SumError; //误差积分
float dError; //微分项
u16 Result;
u8 HeatState; //加热状态
u8 SkipHeat37Bit; //跳过预温
u8 ConstTempBit; //进入恒温状态
u16 PWM_Result; //最终PWM占空比
u16 TimeS; //时间(秒)
}PIDType;
PIDType PID;
void Init_PIDData(u8 En1Dis0) { //根据调试结果确认的变量(除非加热曲线异常,否则不改) PID.SetPoint = 设定值;// 2 PID.Kp = 3.9; PID.Ki = 0; PID.Kd = 0;//PID过程变量清0 PID.PrevError = 0; // 6 PID.LastError = 0; // 7 PID.SumError = 0; // 8 PID.dError = 0; // 9 PID.Result = 0; // 10 PID.HeatState = 0; // 11 PID.PWM_Result = 0; // 12 PID.TimeS = 0; // 13 } u8 PIDCalc(PIDType *pp, float CurrentPoint) { float Error; //偏差 float Calc_Result; Error = pp->SetPoint - CurrentPoint; //偏差值 = 设定值-输入值(当前值) pp->SumError += Error; //积分 = 积分+偏差 --偏差的累加 pp->dError = pp->LastError - pp->PrevError;//当前微分 = 最后误差 - 之前误差 pp->PrevError = pp->LastError; //更新“之前误差” pp->LastError = Error; //更新“最后误差” Calc_Result = pp->Kp * pp->LastError //比例项 = 比例常数 * 偏差 +pp->Ki * pp->SumError //积分项 = 积分常数 * 误差积分 +pp->Kd * pp->dError; //微分项 = 微分常数 * 当前微分 pp->Result = Calc_Result; //超限处理 if(Calc_Result < 0 ) Calc_Result = 0; if(Calc_Result > 100) Calc_Result = 100; return Calc_Result; }
void PWM_Control
{
Jmp = PIDCalc(&PID, 实际温度);
if(Jmp >= 100)
{
TIMx->CCR3 = arr*0.5;//50%
}
if(Jmp <= 0)
{
TIMx->CCR3 = arr*0.99;
}
if((Jmp>0)&&(Jmp<100))
{
TIMx->CCR3 = arr*((100-Jmp*0.5)/100);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用