c语言sint16,算法篇(PID详解).pdf

本文档详细介绍了PID控制算法,包括比例、积分、微分的作用,并提供了数字PID的C语言编程实现。通过生活实例和理论分析,帮助读者快速理解PID原理,适用于初学者。着重讲解了数字PID的离散表达式,为实际应用提供指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言说明

控制的方法远远不止PID这一招,在许多场合也未必是最佳的控制算法 对于学习能力较好的师弟也可以再去寻

求一种更优秀的控制算法 PID的分类多如牛毛,例如:模糊PID、数字PID、神经元PID等等 另外,本文档是参考

几十个PID相关文档资料整合而成 由于个人能力等原因,从策划、编辑、排版等花了一个多月的时间才完成此次PID

算法的整合

为了更有针对性和有效性,本文档主要讲解数字PID及其变种 (改进式PID):位置式和增量式 以及这两种PID

的C语言编程实现、参数的调整确定和PID控制的应用

我们为什么要用PID算法呢?原因很简单:

其一,PID是一种比较成熟的控制算法,而且还有许多基于PID的变种算法(简称改进式PID)

其二,资料多,学习难度降低,入门快

其三,多届师兄实践过,感觉效果还不错!但每年资料成指数增长,从上届师兄那拷贝了好几G资料,讲PID

控制的文档可以夸张的说跟天上的 “星星”一样,看了之后眼花缭乱,而且有很多重复的

为了让更多人能快速上手使用PID控制算法,结合个人经验和相关文档将它浓缩如下:

一、什么是PID控制?

由易到难、从简到繁、结合现实和理论带你入门PID算法。以下从两个方面进行介绍:

1.1用生活实例谈PID,让你有个感性的认识:

1)比方说桌子上放个物体,样子像块金属,巴掌大小。你心里会觉得这个物体比较重,就用较大力量

去拿,

知道了 `StatisticsInfo_tmp.coreTemp[0]` 的类型为 `sint16` 后,我们可以更准确地评估之前的那段代码是否存在潜在问题。 ### 分析已知信息 - 变量 `SocDiagInfo_CoreTemp_16tmp` 被声明为 `uint16` 类型。 - 表达式 `(StatisticsInfo_tmp.coreTemp[0] + (uint16)FD40_SOCDIAGINFO_CORETEMP_OFST)` 中包含了一个 `sint16` 类型 (`coreTemp[0]`) 和一个强制转换为 `uint16` 类型的常量或宏值。 #### 主要关注点 1. **加法运算过程中的数据类型提升** - 根据C语言的标准规则,在算术操作过程中较窄的数据类型会自动晋升到能容纳所有可能值宽度的最大类型。这里因为存在 unsigned 数据所以最终结果会被当成unsigned来进行计算。 - 这意味着即使`sint16`是一个负数也可能被解释成非常大的正数从而导致不正确的求和效果。 2. **溢出的风险** - 即使两者之和理论上还在合理的范围内,但如果中间某个时刻超出了所使用的临时存储容器(通常是最大允许的操作数长度如32位整数等)则仍然会发生不可预见的情况。 ### 解决方案建议 为了避免这些问题的发生,可以采取以下几个措施: 1. 显式控制整个表达式的符号性(sign),确保不会无意间混合 signed 与 unsigned 计算; ```c++ // 先转成统一的形式再做进一步处理 sint32 intermediateResult = (sint32)StatisticsInfo_tmp.coreTemp[0]; intermediateResult += FD40_SOCDIAGINFO_CORETEMP_OFST; if ((intermediateResult >=0 ) && (intermediateResult <= UINT16_MAX)){ SocDiagInfo_CoreTemp_16tmp = (uint16)intermediateResult ; }else{ // Error handling for out-of-range condition... } ``` 这样做不仅可以保证每个环节都在可控区间内运作同时也提高了程序的整体可靠性减少边界条件引发崩溃的概率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值