首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
2024国际航空电子大会
2024国际 AIoT 生态发展大会
3D IC 设计和Chiplet资料下载
车载总线测试和解码方案
新能源汽车三电测试技术中心
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商资源中心
论坛
博文
电子工程专辑
电子技术设计
国际电子商情
资料
白皮书
研讨会
芯语
文库
登录|注册
登录
最新发表
推荐阅读
明星博主
原创博文
年度排行
博文排行
博文评论
FPGA/CPLD
MCU/ 嵌入式
模拟
电源/新能源
测试测量
通信
智能手机
处理器与DSP
PCB
汽车电子
消费电子
智能硬件
物联网
软件与OS
采购与分销
供应链管理
工程师职场
EDA/ IP/ 设计与制造
无人机
机器人/ AI
医疗电子
工业电子
管理
写博文
用户1688835
修改
文章:
16
阅读:
32107
评论:
29
赞:
209
好友
私信
个人主页
文章
16
原创
0
阅读
32107
评论
29
赞
209
原创
使用C51实现PID算法
2011-3-8 21:26
1898
9
10
分类:
MCU/ 嵌入式
真正要用
PID
算 法的时候,发现书上的代码在我们51上来实现还不是那么容易的事情。简单的说来,就是不能直接调用。仔细分析你可以发现,教材上的、网上现行的PID实现 的C语言代码几乎都是用浮点型的数据来做的,可以想象,如果我们的计算使用浮点数据,那我们的51
单片机
来运行的话会有多痛苦。
所以,本人自己琢磨着弄了一个整型变量来实现了PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了。关于系数 和采样电压全部是放大10倍处理的。所以精度不是很高,但是也不是那么低,大部分的场合都够用了。实在觉得精度不够,可以再放大10倍或者100倍处理, 但是要注意不超出整个数据类型的范围就可以了。
本人做的是带死区控制的PID算法。
具体的参考代码参见下面:
typedef
struct
PIDValue
{
uint32 Ek_Uint32[3];
//差值保存,给定和反馈的差值
uint8 EkFlag_Uint8[3];
//符号,1则对应的Ek
为负数,0为对应的Ek
为正数
uint8 KP_Uint8;
uint8 KI_Uint8;
uint8 KD_Uint8;
uint8 B_Uint8;
//死区电压
uint8 KP;
//显示修改的时候用
uint8 KI;
//
uint8 KD;
//
uint8 B;
//
uint16 Uk_Uint16;
//上一时刻的控制电压
}PIDValueStr;
PIDValueStr xdata PID;
/*******************************
**PID = Uk + (KP*E(k) - KI*E(k-1) + KD*E(k-2));
********************************/
void
PIDProcess(
void
)
{
uint32 idata Temp[3];
//
uint32 idata PostSum;
//正数和
uint32 idata NegSum;
//负数和
Temp[0] = 0;
Temp[1] = 0;
Temp[2] = 0;
PostSum = 0;
NegSum = 0;
if
( ADPool.Value_Uint16[UINADCH] > ADPool.Value_Uint16[UFADCH] )
//给定大于反馈,则EK为正数
{
Temp[0] = ADPool.Value_Uint16[UINADCH] - ADPool.Value_Uint16[UFADCH];
//计算Ek[0]
if
( Temp[0] > PID.B_Uint8 )
{
//数值移位
PID.Ek_Uint32[2] = PID.Ek_Uint32[1];
PID.Ek_Uint32[1] = PID.Ek_Uint32[0];
PID.Ek_Uint32[0] = Temp[0];
//符号移位
PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];
PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];
PID.EkFlag_Uint8[0] = 0;
//当前EK为正数
Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0];
// KP*EK0
Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1];
// KI*EK1
Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2];
// KD*EK2
}
}
else
//反馈大于给定
{
Temp[0] = ADPool.Value_Uint16[UFADCH] - ADPool.Value_Uint16[UINADCH];
//计算Ek[0]
if
( Temp[0] > PID.B_Uint8 )
{
//数值移位
PID.Ek_Uint32[2] = PID.Ek_Uint32[1];
PID.Ek_Uint32[1] = PID.Ek_Uint32[0];
PID.Ek_Uint32[0] = Temp[0];
//符号移位
PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];
PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];
PID.EkFlag_Uint8[0] = 1;
//当前EK为负数
Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0];
// KP*EK0
Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1];
// KI*EK1
Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2];
// KD*EK2
}
}
/*以下部分代码是讲所有的正数项叠加,负数项叠加*/
if
(PID.EkFlag_Uint8[0]==0)
{
PostSum += Temp[0];
//正数和
}
else
{
NegSum += Temp[0];
//负数和
}
// KP*EK0
if
(PID.EkFlag_Uint8[1]!=0)
{
PostSum += Temp[1];
//正数和
}
else
{
NegSum += Temp[1];
//负数和
}
// - kI * EK1
if
(PID.EkFlag_Uint8[2]==0)
{
PostSum += Temp[2];
//正数和
}
else
{
NegSum += Temp[2];
//负数和
}
// KD * EK2
PostSum += (uint32)PID.Uk_Uint16;
//
if
( PostSum > NegSum )
// 是否控制量为正数
{
Temp[0] = PostSum - NegSum;
if
( Temp[0] < (uint32)ADPool.Value_Uint16[UMAXADCH] )
//小于限幅值则为计算值输出
{
PID.Uk_Uint16 = (uint16)Temp[0];
}
else
{
PID.Uk_Uint16 = ADPool.Value_Uint16[UMAXADCH];
//否则为限幅值输出
}
}
else
//控制量输出为负数,则输出0
{
PID.Uk_Uint16 = 0;
}
}
写原创有奖励!2024面包板原创奖励正在进行中
点赞(
9
)
收藏
分享到:
上一篇:
ARM中外学习网站大全
下一篇:
吴坚鸿谈学单片机有前途还是嵌入式系统有前途
PARTNER CONTENT
换一换>
更多>
新蓝牙6.0协议扩展应用范围
Silicon Labs(芯科科技)蓝牙产品经理Parker Dorris
2024-12-16
概伦电子:以开放心态共绘EDA产业新蓝图
概伦电子
2024-12-30
SK海力士开发出适用于AI数据中心的高容量固态硬盘‘PS1012 U.2’
SK海力士
2024-12-18
SK海力士将在CES2025亮相‘全方位面向AI的存储器供应商’的新蓝图
SK海力士
2025-01-03
新一代MCU向着边缘AI和实时控制发展
赵明灿
2024-12-11
文章评论
(
1
条评论)
登录
后参与讨论
您需要登录后才可以评论
登录
|
立即注册
发布
用户518079
2011-3-9 23:06
好东西,支持!
回复
查看更多评论
相关推荐阅读
用户1688835
2014-10-30 16:34
【博客大赛】求职者再说
首先华为果然是很看重学校出身的,在杭州基本只会招浙大和杭电的(这是我同学打电话到人力资源总监亲口说的)。还有远方的也没有结果,看来是被刷了,虽然我也不怎么想去,看网上评论都是说管理很严格的,而且也...
用户1688835
2014-10-30 16:34
【博客大赛】求职者说
终于到了自己的求职季,昨晚了看了一师兄的帖子挺有感触的,由于学校的原因迟迟没能找到工作。虽然最后凭着自己的能力就职于ABB,但过程还是异常艰辛的。所以自己也想写点一来是记录自己找工作...
用户1688835
2013-09-18 11:12
评论:@书写点滴 博客中提到的“各大IT/IC公司offer比较”
够详细...
用户1688835
2013-07-11 14:12
如何看懂模拟电路图
所谓“读图”,即是看懂一个电路的原理图,它是电路分析的基础。只有凄懂电路的原理图,才能知道它的各组成部分的作用及各部分的相互关系,并进一步估算其性能指标,科学地运用器件;也只有凄懂电路的原理图,才能改...
用户1688835
2012-08-28 10:18
简易电感电容测量
前段时间有经常用到电感元件,于是制作了一个测量电感电容的电路。电路原理采用LC串联谐振产生一振荡信号,经过比较器整形为一矩形信号。测出矩形波的频率,再根据原有的LC值,则可求出添加上的L值。电...
用户1688835
2012-08-09 20:55
开启实验室生涯-技术篇
来到实验室先是看了一个月的文献,对采用磁致伸缩法来检测磁环裂纹有了个感性的认识。说到文献我还没有找到有效的管理方案,科研要求我们查阅大量的文献,必要时还要进行文献跟踪。然而我们总是会看到电脑中的文...
用户1688835
修改
文章:
16
阅读:
32107
评论:
29
赞:
209
好友
私信
个人主页
文章
16
原创
0
阅读
32107
评论
29
赞
209
个人文集
面试
(1)
求职经验
(2)
最新评论
更多
物也有命
自做自受 ...
评论博文
2025-1-9
富士通环保行为准则之切身感受 ...
行情不坏,手机火,写的好
开发工匠 ...
评论博文
2025-1-9
2024年全球智能手机面板出货量突破22亿片, ...
查到的原文,图3图片不是文中图。 https://www.semanticscholar.org/paper/A-Technical-View-of-Bokeh-Hawk/b0bd7787fd3e799a8e2 ...
Xutg
评论博文
2025-1-9
用三角形的镜头光圈会怎样?聊聊焦外的弥散 ...
最新
博文
POS机连接中断问题如何改善? ...
HDMI规范2.2版即将登场, 96Gbps开启新 ...
晶圆的环吸方案相比其他吸附方案,对 ...
资料下载
本周热帖
Processing-processing3.5.4
ESP32TFT常用字体库.zip
自动增益控制放大器设计与实现 ...
无线传能充电器设计与实现论文 ...
基于单片机自动电阻测试仪设计论文 ...
《极简图解 半导体技术基本原理》+半 ...
【工程师故事】+2024年:资深嵌入式工 ...
浪拓电子小课堂:TVS与TSS的工作原理 ...
锡须生长现象
电气安全测试项目详解
最新资讯
芯语最新
来看看在这个电源,能通过单个PWM输出 ...
IGBT 模块在颇具挑战性的逆变器应用 ...
外媒:Arm 正考虑收购服务器CPU企业Am ...
一个月内收购两家公司!恩智浦豪掷9亿 ...
英国CMA暂时接受补救措施,新思科技35 ...
英伟达旗舰GPU使用液态金属取代硅脂 ...
中国科技初创企业成为CES亮色 ...
“寒王”领衔!一众A股公司入选胡润中 ...
MediaTek携手Cocos,推动端侧生成式AI ...
美团外卖的“送礼”玩法,成为当代年 ...
EE直播间
更多
第三代功率半导体器件测试解决方案
直播时间: 03月06日 10:00
在线研讨会
更多
重塑机器人未来:揭秘创新芯片解决方案的颠覆力量
多路有光·精准不凡——KSW-SGM01模拟信号源发布会
迈来芯Triaxis® 3D磁传感器:汽车安全应用的优选方案
适用于安全连接的新一代PIC32CK SG/GC系列单片机
热门
推荐
【TI资料】专为高压系统设计的新型MCU
【应用手册】TI 全新MCU及C29内核的能源设施应用方案
构建AI未来,Arm计算平台无处不在
【免注册下载】创新MCU提升高压系统的实时性能
我要评论
1
9
分享到微信
分享到微博
分享到QQ
点击右上角,分享到朋友圈
我知道啦
请使用浏览器分享功能
我知道啦
关闭
站长推荐
/3
工程师写总结,送示波器、稳压电源、螺丝刀!
分享你的:职业生涯中故事、2024年年终总结、工作中的小故事,丰富多样的礼品等你哦!
面包板社区有奖活动汇总楼
1. DIY赢大奖!2. 写原创,有奖励!3.参与话题,奖励E币!4. 免费申领:开发板试用、书籍试读...
电子工程师DIY来分享,赢大疆无人机、小米手机、NAS存储、万用表 ...
展示您的 DIY 电子设计作品,社区将有丰富奖励送给您!
首页
论坛
电子技术基础
模拟技术
可编程器件
嵌入式系统与MCU
工程师职场
最新帖子
问答
版主申请
每月抽奖
商城免费换礼
社区有奖活动
博客
下载
评测
视频
文库
芯语
资源
2024国际航空电子大会
2024国际 AIoT 生态发展大会
3D IC 设计和Chiplet资料下载
车载总线测试和解码方案
新能源汽车三电测试技术中心
在线研讨会
EE直播间
小测验
白皮书
行业及技术活动
杂志免费订阅
免费在线工具
厂商资源中心
帖子
博文
返回顶部
×
用户518079 2011-3-9 23:06