搜索
bottom↓
回复: 41

关于PID的一个问题,想了几个小时,没想通。。救救我吧

[复制链接]

出0入0汤圆

发表于 2015-4-1 00:38:03 | 显示全部楼层 |阅读模式
用单片机实现pid做buck反馈的问题,采集ad输出的电压控制pwm的占空比实现反馈。问题如下
AD采集了一个电压,假设是10位AD(1024),AD的参考电压是3V,这个被采集电压转化成了一个 “3V对应1024” 下这个等级的数,比如说是1.5V=1.5/3*1024=512
然后设定一个预给定电压是2V,也是在AD的那个电压等级下进行模数转换,2V=683
然后进行PID计算,这个时候pid输出的一个值,不应该是一个电压的值么,(当然是数字化的),这个数字化的模数转换也是在AD的模数转换规则下的
那我这个时候想要的应该是能控制pwm占空比的那个比较寄存器的值,但是怎么能把pid输出的值转化成这个寄存器的值呢?这两个数字都不是在一个规则下进行量化的啊
我不知道我说没说明白,感觉我陷入进去了,想了两三个小时都没想明白

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2015-4-1 07:43:16 | 显示全部楼层

看不懂你在说啥。你还是先看看pid的运行框图吧。
不要为了用pid而去用pid

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-1 08:01:25 | 显示全部楼层
buck是线性变压,D和Vo是有比例关系的,你先那这个做基本的比例系数,然后拼凑I,数字电源一般不需要D。或者看一下PIC或TI的数字环路类似计算,系数是直接计算出来的。

出0入0汤圆

发表于 2015-4-1 08:03:22 | 显示全部楼层
就直接加减啊,但是比例系数慢慢调整就好。

出0入0汤圆

发表于 2015-4-1 08:12:17 | 显示全部楼层
了解楼主的意思了,就是如何把PID计算后的输出控制值和PWM波联系起来,达到控制电压的效果。不过劝楼主还是自己慢慢去试吧,这里很难得到你的答案的,因为当年我搞也问了N多人,N久资料,没有一个是干干脆脆回答这个问题的,多数是在回答如何计算PID的参数。期望坛内高手出现。

出0入0汤圆

发表于 2015-4-1 08:15:20 | 显示全部楼层
jacky_yhy 发表于 2015-4-1 07:43
看不懂你在说啥。你还是先看看pid的运行框图吧。
不要为了用pid而去用pid

你好,你的头像是舍意思,咋看不懂,能分析一下吗

出0入0汤圆

发表于 2015-4-1 08:33:40 | 显示全部楼层
xurenhui 发表于 2015-4-1 08:15
你好,你的头像是舍意思,咋看不懂,能分析一下吗

不要想歪了

出0入96汤圆

发表于 2015-4-1 08:40:39 | 显示全部楼层
LZ不明白的是怎么进行输出的标度转换!
首先你要知道PID运行输出的范围,0~100等等。然后用这个值换算到实际的输出去,例如你说的0~1024

出20入26汤圆

发表于 2015-4-1 09:35:26 | 显示全部楼层
5楼就是楼主想问的问题。
计算出PID值后,怎么样转换后将PID输出的值赋给寄存器?

我也卡在这里,这个转换关系究竟是怎么样的。

出0入24汤圆

发表于 2015-4-1 09:54:08 | 显示全部楼层
好久没弄数字PID调压了。以前做的时候都是直接调整Ki Kp这两个系数的,PID出来的数值直接送进PWM寄存器就行了。没必要纠结PID输出和PWM寄存器直接的转换系数了...也就是说这个系数等于1

出0入0汤圆

 楼主| 发表于 2015-4-1 12:46:33 | 显示全部楼层
zhiwei 发表于 2015-4-1 08:01
buck是线性变压,D和Vo是有比例关系的,你先那这个做基本的比例系数,然后拼凑I,数字电源一般不需要D。或 ...

我不是说怎么调pid的参数,我是说pid输出的值和控制pwm占空比寄存器的值怎么联系起来,因为pid输出的值不能直接用作调制波的值(pwm占空比寄存器的值)啊,他们不再一个标度里面,就像是不是一个世界的东西似的

出0入0汤圆

 楼主| 发表于 2015-4-1 12:49:07 | 显示全部楼层
generalad 发表于 2015-4-1 09:54
好久没弄数字PID调压了。以前做的时候都是直接调整Ki Kp这两个系数的,PID出来的数值直接送进PWM寄存器就行 ...

怎么能直接给呢,pid输出的是根据AD转换的电压的数字量的标度产生的,pwm波是自己的载波(计数器)用调制波(控制pwm占空比的值)产生的,也不能直接就相等了啊

出0入0汤圆

 楼主| 发表于 2015-4-1 12:50:09 | 显示全部楼层
niaojingxin 发表于 2015-4-1 08:12
了解楼主的意思了,就是如何把PID计算后的输出控制值和PWM波联系起来,达到控制电压的效果。不过劝楼主还是 ...

真的懂我了,但是到底怎么解决啊,是不是我的思路就错了

出0入0汤圆

 楼主| 发表于 2015-4-1 12:51:03 | 显示全部楼层
jufr12315 发表于 2015-4-1 09:35
5楼就是楼主想问的问题。
计算出PID值后,怎么样转换后将PID输出的值赋给寄存器?

对啊,真的就是这个问题,讨论一下吧,加qq?

出0入0汤圆

 楼主| 发表于 2015-4-1 12:54:12 | 显示全部楼层
gallle 发表于 2015-4-1 08:40
LZ不明白的是怎么进行输出的标度转换!
首先你要知道PID运行输出的范围,0~100等等。然后用这个值换算到实 ...

恩,pid输出的范围,不就是AD采集的数字量标度么,另一个参考电压的标度也是AD的标度,那pid输出的不也是这个标度么,是这个往后的话,pid输出的要变成pwm占空比,怎么实现这个转化

出0入24汤圆

发表于 2015-4-1 14:07:26 | 显示全部楼层
huaidan1628 发表于 2015-4-1 12:49
怎么能直接给呢,pid输出的是根据AD转换的电压的数字量的标度产生的,pwm波是自己的载波(计数器)用调制 ...

直接给不代表他们的含义是一样或者单位是一样的,只是一种处理方法而已。

最终的目标都是让PID控制能够稳定,为了达到这种效果,你调节Kp Ki就能实现,为什么还要去纠结PID输出跟PWM寄存器之间的关系了呢?直接让这个系数等于1不就可以了吗。
我指的都是用尝试和拼凑的方法去调节,先有个大概的经验值,在这个经验值的基础上进行调节。
PWM=K*[f(kp)+f(ki)],你要的是这个”K“吧?不如让K=1,然后PWM=f(kp)+f(ki)。调节kp Ki就可以了。如果你让K=2也是可以的,只是这时候最佳的kp ki 跟K=1时候肯定是不一样的。但是不是两倍的关系我也不敢说。大神们可以分析一下。

如果要从理论上回答你这个问题,我觉得这个问题其实可以等价于“怎么计算PID控制的Kp Ki系数"。这个就要建立传递函数,然后再做各种计算和分析了。


出20入26汤圆

发表于 2015-4-1 15:28:05 | 显示全部楼层
huaidan1628 发表于 2015-4-1 12:51
对啊,真的就是这个问题,讨论一下吧,加qq?

没QQ呢。
哈哈哈,在这里讨论呀

出0入0汤圆

发表于 2015-4-1 19:17:32 | 显示全部楼层
PID可以不考虑转换,因为PID算出只是一个数值,你算出来的值直接输出到寄存器中,只是你要知道PID算出来的值的量程是对应0-3V的

出0入0汤圆

发表于 2015-4-1 19:18:14 | 显示全部楼层
PID可以不考虑转换,因为PID算出只是一个数值,你算出来的值直接输出到寄存器中,只是你要知道PID算出来的值的量程是对应0-3V的

出0入0汤圆

 楼主| 发表于 2015-4-1 19:20:04 | 显示全部楼层
generalad 发表于 2015-4-1 14:07
直接给不代表他们的含义是一样或者单位是一样的,只是一种处理方法而已。

最终的目标都是让PID控制能够 ...

好像,好像稍微有点明白了你的意思,但是我的pid不是用的试凑法,我是先计算主电路传递函数,然后设计的反馈补偿网络,再把补偿网络离散化,难道这样不能么,按你说的不是就只能试凑了么

出0入0汤圆

 楼主| 发表于 2015-4-1 19:22:38 | 显示全部楼层
563872381hai 发表于 2015-4-1 19:18
PID可以不考虑转换,因为PID算出只是一个数值,你算出来的值直接输出到寄存器中,只是你要知道PID算出来的 ...

我就是这个意思,我觉得不能直接给啊,你看单片机里有两个寄存器,一个是控制pwm的频率的那个也是确定的啊,假设输出50Khz时候是1500,那如果pid输出一个2000(对应2V),怎么办?

出0入0汤圆

发表于 2015-4-1 19:33:53 | 显示全部楼层
不用纠结他们之间的联系,按他们的比值赋值就行了,

pid输出有个限幅,
比较器有个最大值,

比如, 你pid输出区间是0-1000
你定时器最大记数值是1500
那就把你pid输出的值乘以1.5送比较器就行

出0入0汤圆

 楼主| 发表于 2015-4-1 19:44:38 | 显示全部楼层
PEcontrol 发表于 2015-4-1 19:33
不用纠结他们之间的联系,按他们的比值赋值就行了,

pid输出有个限幅,

就这样? 那我的pid参数是通过传递函数设计的那还有用么,按你说的是不是只能用试凑法

出0入0汤圆

发表于 2015-4-1 19:59:16 | 显示全部楼层
就是传递函数里面加个比例环节呀,     
占空比到输出的比例环节

占空比为0 输出为0,  比较器值为0
占空比为1输出电压等于输入电压, 比较器值为1500
占空比为0.5 输出二分之一输入电压, 比较器值为750

出0入0汤圆

 楼主| 发表于 2015-4-1 20:07:45 | 显示全部楼层
PEcontrol 发表于 2015-4-1 19:59
就是传递函数里面加个比例环节呀,     
占空比到输出的比例环节


就是这个图里面的,pid输出的是个U,经过pwm变成了d,就是那个U不就是作为了调制波么,pwm里面有一个载波,但是这个调制波,不能直接加载波上,就是你上一条回复的那个意思其实就是我要问的,只是我不明白,直接按比例缩放了之后,那我之前已经计算出来的Gc(PID)里面的KP,Ki还能不能用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-1 20:17:47 | 显示全部楼层
huaidan1628 发表于 2015-4-1 19:22
我就是这个意思,我觉得不能直接给啊,你看单片机里有两个寄存器,一个是控制pwm的频率的那个也是确定的 ...

你要关心的是PID的范围

出0入0汤圆

发表于 2015-4-1 20:31:50 | 显示全部楼层
pid输出的是个电压U,  你把它归一化不就成了占空比????
比如输出范围是0-5, 在你传递函数上乘一个比例系数0.2     你把它归一化到0-1(也就是咱空比0-100%)
你pid输出是1V, 乘以比例系数0.2  得到0.2,  0.2就是20%, 也就是你的占空比,   
你pid输出是4V, 乘以比例系数0.2  得到0.8,  0.8就是80%, 也就是你的占空比,
这里的比例系数0.2,是叠加到你原来的传递函数上来,   比如你原来设计的比例系数是kp=0.7,  为了保持经过调整后你原参数不变,你就需要把你的kp改成3.5 ,即3.5x0.2=0.7

然后 , 假设你的pwm计数周期是1500
当需要20%占空比的时候, 实际就是  1500×20%  变成   300
需要80%占空比的时候,  实际就是  1500×0.8= 1200

我不知道我说清楚没有, 还是我理解有误,
最后问句, 你能保证传递函数很准么

出0入85汤圆

发表于 2015-4-1 20:32:28 | 显示全部楼层
既然是调节PWM也要给出PWM是多少bit的吧,正常的PWM DAC输出电压的计算公式为 占空比*电源,假如你的PWM是16bit,电源电压是2.048V,1LSB=31uV, 只需要把你的PID运算的结果映射到这个占空比上即可,最简单的办法,把你的PID输出值干脆改为最大值65536,这样就能和能直接用于16bit的PWM上

出0入0汤圆

发表于 2015-4-1 20:41:00 来自手机 | 显示全部楼层
PID三个系数就它们之间的关系

出0入0汤圆

发表于 2015-4-1 21:50:59 | 显示全部楼层
PID 只是3个系数 ,3个系数乘以需求量,达到最终的控制量  !

出0入0汤圆

 楼主| 发表于 2015-4-1 22:33:00 | 显示全部楼层
PEcontrol 发表于 2015-4-1 20:31
pid输出的是个电压U,  你把它归一化不就成了占空比????
比如输出范围是0-5, 在你传递函数上乘一个比 ...

我理解你意思了,按你说的我先试试吧,传递函数当然不可能完全准了,但是总比完全没有依据去调要快一些吧,而且这么设计也不费事,最后说句谢谢了

出0入0汤圆

发表于 2015-4-1 22:56:26 | 显示全部楼层
假设PWM占空比50%对应的输出电压为0,100%对应最大正输出电压是Vm,0%对应最大负输出电压-Vm,而可输入PWM寄存器的数字值是0~Dm,且Dm对应占空比100%,Dm/2对应占空比50%,0对应占空比0%,那么传函就是Vm/(Dm/2),这样理解就对了。

出0入0汤圆

发表于 2015-4-2 09:06:46 | 显示全部楼层
有传递函数可以用matlab仿真确定大概的数字 很方便实用

出0入0汤圆

 楼主| 发表于 2015-4-3 14:10:55 | 显示全部楼层
foxcase 发表于 2015-4-2 09:06
有传递函数可以用matlab仿真确定大概的数字 很方便实用

我就是这么做的,只是我说的那个部分不是很明白而已,算了,我先做吧

出0入0汤圆

发表于 2015-4-3 14:43:20 | 显示全部楼层
xurenhui 发表于 2015-4-1 08:15
你好,你的头像是舍意思,咋看不懂,能分析一下吗

你的头像呢 是你本人吗 太漂亮了

出0入0汤圆

发表于 2015-4-3 20:31:25 | 显示全部楼层
御风 发表于 2015-4-3 14:43
你的头像呢 是你本人吗 太漂亮了

你猜。。。。。。

出0入0汤圆

发表于 2015-7-2 00:49:45 | 显示全部楼层
同求这个问题,谢谢

出0入0汤圆

 楼主| 发表于 2015-7-3 00:22:23 | 显示全部楼层
wyudcl 发表于 2015-7-2 00:49
同求这个问题,谢谢

不要想,调一调你就懂了

出0入0汤圆

发表于 2015-7-3 09:18:17 | 显示全部楼层
huaidan1628 发表于 2015-7-3 00:22
不要想,调一调你就懂了

建议给一个例子什么的,你是怎么样把PID函数的输出值,与PWM或者AD值关系起来,中间经过了什么转换;也算是结个贴;
要不然,后面肯定还会陆陆续续的有人问;


出0入0汤圆

 楼主| 发表于 2015-7-9 13:17:50 | 显示全部楼层
kinsno 发表于 2015-7-3 09:18
建议给一个例子什么的,你是怎么样把PID函数的输出值,与PWM或者AD值关系起来,中间经过了什么转换;也算是结 ...

这两个都是数字量,你只要让他们在最后这个给到pwm比较寄存器的数字量在小于pwm周期寄存器的值(即在他的范围内,别完全接近)就可以了,最近没什么时间总结,等过几天吧,在汇总一下

出0入0汤圆

 楼主| 发表于 2015-7-9 13:18:48 | 显示全部楼层
kinsno 发表于 2015-7-3 09:18
建议给一个例子什么的,你是怎么样把PID函数的输出值,与PWM或者AD值关系起来,中间经过了什么转换;也算是结 ...

这两个都是数字量,你只要让他们在最后这个给到pwm比较寄存器的数字量在小于pwm周期寄存器的值(即在他的范围内,别完全接近)就可以了,最近没什么时间总结,等过几天吧,在汇总一下

出0入0汤圆

 楼主| 发表于 2015-7-9 13:19:55 | 显示全部楼层
kinsno 发表于 2015-7-3 09:18
建议给一个例子什么的,你是怎么样把PID函数的输出值,与PWM或者AD值关系起来,中间经过了什么转换;也算是结 ...

这两个都是数字量,你只要让他们在最后这个给到pwm比较寄存器的数字量在小于pwm周期寄存器的值(即在他的范围内,别完全接近)就可以了,最近没什么时间总结,等过几天吧,在汇总一下

出0入0汤圆

发表于 2020-6-30 11:11:01 | 显示全部楼层
我现在碰到跟你一样问题的测试,能回复一下我吗qq284265382
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-28 11:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表