求一个如何编写单片机程序C语言编写的PID控制程序。谢谢!!

PID控制算法的C语言实现(完整版)
最近两天在考虑一般控制算法的 C 语言实现问题,发现网络上尚没有一套 完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。对于控制类非常重要,有需要可以拿走。
PID控制算法的C语言实现(完整版)下载
下载资料需要,并消耗一定积分。
下载此资料的人还喜欢:
技术交流、我要发言! 发表评论可获取积分! 请遵守相关规定。
本周热点资料
电子资料热门词
上传者其它资料
单片机下载排行posts - 127,&
comments - 0,&
trackbacks - 0
&在这里暂且将其归为模拟技术吧!
&& 前一段时间由于开关电源的控制,做了一下PID的控制算法,和之前自己的方法对比了一下,感觉效果确实要好不好,关键是参数调好了之后就会很稳定,电压波动比较小,因此有一定的使用价值和实用价值!由于没有学过自动控制原理,所以很多的东西还是从网上看到的,理解起来还是比较生硬,昨天晚上遇到一个问题,现在想拿出来和大家一起思考一下,望大家批评指正!
&&&&& 首先还是拿出公式:
&&&& (1)式为PID控制的离散公式,其中e(k)为目标值和输出反馈值的误差。
&&&& 由(1)式可以得到(2)式,然后将两者想减,得到(3)式。
&&& 其次,对公式进行简单的介绍。PID控制在实际应用广泛主要分为两种控制方式:位置式和增量式。
(1)式是简单的求和公式的使用方式,这个也是位置式的控制依据,(3)式为对(1)式的变形,是增量式的控制依据。由于依据的公式的形式不一样,所以具体的实现形势不一样。
&&&&& 由公式(1)的实现形式可以看到,其中有求和项,也就是积分项,而公式(3)则没有求和项。但是注意 一点,后者的得出的是相邻的两者的差值,所以这个不是实际的控制量,实际的控制量是对(u(k)-u(k-1))进行求和得到的。由公式可知,(1)式是能够直接给出控制量的,而(3)式需要多次控制量的累加得到的,这样就导致了我们实现的时间相对长一些,响应速度也就慢一些。
&&&&&& 两者实现各有优点,位置式相当于是一个指南针吧,始终向着设定的目标值,而增量式就是一点点想着目标值靠近。前者实现的过程中要求反馈量比较精确,或是说你的采样量比较干净,反馈比例误差小,否则指南针就会指偏了方向。而增量式则是相当于一个死缠难打求婚的男士,一点点向你靠近,不是直接达到,先是靠近你朋友,然后未来的丈母娘,搞渗透,最后才慢慢达到目标。这个原因很简单,因为现在他现在没有信息的反馈渠道,也就是反馈量不准确,他必须要先去获得反馈量,想一蹴而就,要是反馈量不准确,那肯定就会超调,就会吃闭门羹的。所以说增量式还是适合反馈量不准确,反馈噪声大,或是要求输出尽可能比较稳定的情况下面。
&&&&&& 现在拿出程序,看看吧!
先看位置式。&&& *==================================================================================================== PID计算部分 =====================================================================================================*/ unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) { unsigned int dError,E Error = pp-&SetPoint - NextP // 偏差 pp-&SumError += E // 积分 dError = pp-&LastError - pp-&PrevE // 当前微分 pp-&PrevError = pp-&LastE pp-&LastError = E return (pp-&Proportion * Error//比例 + pp-&Integral * pp-&SumError& //积分项 + pp-&Derivative * dError); //&& 微分项 } /*********************************************************** 位置式在实现的过程中,一目了然,清楚明白,看一下公式就能知道实现过程。因此没有什么好说的。还是先看看增量式。(以下是我的一个搞智能汽车的同学帮我修改的增量式的程序,但是我一直觉得有点问题,虽然也能实现控制,但是和公式对着看了一下还是不对应,而在进行累加的时候,我发现那样根本就不行,因为累加得到的结果一直是负值,这个是不能直接给我的pwm控制寄存器的。然后我人为修改为进行累减,然后就可以进行控制了)。我不知道问题是不是出在这里,所以还是拿出来和大家讨论讨论。
先看程序:
float PIDCalc( struct PID *pp, unsigned int NextPoint ) { float dError,Error, temp=(NextPoint*3.3/.5;//将采样电压值转换位输出电压值
pp-&SumError = pp-&SetPoint-temp& ; //积分&& Error = pp-&SumError-pp-&LastE // 偏差 dError = Error - pp-&PrevE // 当前微分 pp-&PrevError = E pp-&LastError = pp-&SumE temp=(pp-&Proportion * Error//比例 + pp-&Integral * pp-&SumError& //积分项 + pp-&Derivative * dError); //&& 微分项 }
现在我们对应这个公式和微分项看看,由于增量式中微分项为e(k)-e(k-1)-(e(k-1)-e(k-2)=e(k)-2e(k-1)+e(k-2);
那么在我的这个程序实现的过程中,这是直接将e(k)-e(k-1)作为微分项,显然这个公式的差距很大,即便是工程应用上有很大的简约或是其他处理,但是这个已经严重超出等效的范围。
&&&&&& 另外昨天晚上转载了一文章,在空间里面,也就将PID的增量控制的,但是实现方式和这个却不大相同,大家也参考一下,这个在理解的时候可能要简单一些,但是初期的跳出合理的参数会更难一点,因为简化后和简化前的关系并不是线性关系。因为有更加线性条件下,适当使用二分法还是能迅速找到最佳参数的位置。
&& 希望大家批评指正哈!
阅读(...) 评论()求程序,单片机控制步进电机的转动角度的程序,C语言??各位大神帮帮忙,急用 求;用51单片机编写最简单的程序,C语言,使步进电机转...
你正在浏览: & >
求程序,单片机控制步进电机的转动角度的程序,C语言??各位大神帮帮忙,急用
求程序,单片机控制步进电机的转动角度的程序,C语言??各位大神帮帮忙,急用
非常感谢,各位大神,高手些望多指点指点
步进角和步进方式都有关的,我这里有一些资料,因为IO口驱动电流太弱。需要可以加我,都是需要驱动的,通常用单片机控制的话,还有看你是用几相的步进电机,可以交流一下,多谢
先了解步进电机是几相的。比如四相的就分别给ABCD给电平。你再通过转一圈所需几个for循环,就可以算出转动角度了
#include&reg51.h& unsigned char i[]={0x00,0x01,0x0...~~~
你上网搜搜一大把,几乎每个学习板的配套源代码都有啊~~~
现在控制步进电机方便的方法用步进电机驱动器。步进电机驱动器控制电机运转的信号有3个;使能、转向、时钟...~~~
#include &reg51.h& //51芯片管脚定义头文件 #include &intrins...~~~
/*************************************************...~~~
#include &reg52.h& #define uchar unsigned char #de...~~~
1、首先看看步进驱动器的细分设定,找出转动一圈需要的脉冲个数,再计算出转动90°需要的脉冲个数N; ...~~~
驱动器有两种,一种是直接控制各个绕组的,如有4个绕组,就要4个IO引脚信号,驱动只是功率放大 另一种...~~~
这个很简单 用一个输出端口输出一个角度的方波 只不过加一个按键的问题 步进电机在转的过程中,按下按键...
你可能感兴趣的内容?PID 1单片机 控制直流电机转速 PID算法+C语言程序+Proteus仿真
采用PID SCM 开发 256万源代码下载-
&文件名称: PID& & [
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 54 KB
&&上传时间:
&&下载次数: 242
&&提 供 者:
&详细说明:1单片机 控制直流电机转速 PID算法+C语言程序+Proteus仿真
采用PID控制算法控制电机转速,使得电机实际转速与设定转速保持一致。-1 MCU control DC motor speed PID algorithm+C language program+Proteus simulation using PID control algorithm to control motor speed, so that the actual motor speed and the set speed consistent.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&PID自动控制电机转速\C程序\pid&&...................\.....\PID.C&&...................\.....\pid.hex&&...................\.....\pid.lnp&&...................\.....\PID.LST&&...................\.....\pid.M51&&...................\.....\PID.OBJ&&...................\.....\pid.opt.bak&&...................\.....\pid.plg&&...................\.....\pid.Uv2.bak&&...................\.....\pid.uvopt&&...................\.....\pid.uvproj&&...................\.....\pid_Opt.Bak&&...................\.....\pid_Uv2.Bak&&...................\.....\pid_uvopt.bak&&...................\仿真文件\pid仿真.DSN&&...................\C程序&&...................\仿真文件&&PID自动控制电机转速
&[]:纯粹是垃圾&[]:纯粹是垃圾&[]:很好,推荐下载
&近期下载过的用户:
&&&&&&&&&&&&&&&&&&&&&[]
&相关搜索:
&输入关键字,在本站256万海量源码库中尽情搜索:
&[] - 实现stm32中FMSC功能,可以读写挂载在stm32上的SRAM器件的存储内容。
&[] - SIFT算法的改进加速版本SURF算法,matlab源代码,有测试图片
&[] - 51单片机的PID测电机速度,数码管显示的proteus仿真
&[] - 这是单片机控制直流电机转速的程序内含仿真图和程序源代码,可以参考实用
&[] - c51程序,单片机实现计算器的仿真,protues文件,可直接在protues内打开
&[] - proteus 旋转编码器仿真演示代码,含单片机程序
&[] - 实现PID算法的C语言程序,加上proteus的图形界面显示,很值得学习。、。
&[] - proteus
c 语言pid算法控制pwm实现直流电机调速
&[] - 这是一个专门用来以PID算法为基础的调节步进电机转角,以此来表示阀门开度的程序。
&[] - 利用51单片机PID算法控制pwm的占空比实现水温控制

我要回帖

更多关于 c语言编写单片机程序 的文章

 

随机推荐