1265|9

315

帖子

1

资源

一粒金砂(高级)

过零开关的功率控制精度与时间延迟精度的悖论 [复制链接]

本帖最后由 shipeng 于 2020-7-22 11:04 编辑

使用PID控温差不多有4年了,有一个问题一直困扰我至今。曾经以为这个问题是个悖论只能寻找此消彼长的微妙平衡再无任何解决方案,但其实我错了就在前不久一个灵光乍现的清晨我在睡梦中居然找到了答案。具体问题是这样的:“有一个可调温控温装置(其实是热风拆焊台)调温范围:100~500摄氏度,要求控温精度±1℃以内。”

根据以上问题描述,由于控制温度高低的唯一办法是控制单位时间T内的平均加热功率P,假定供电电压不变加热占空比D的大小决定恒温的温度值。这就可以得到温度和加热占空比D呈一一对应关系。100~500度就需要至少400分之一的功率控制精度,但实际上由于市电的频率只有50Hz还要做到过零开关,最小功率控制精度是半个市电周期th=10ms,根据 “P=D*发热丝饱和功率/400” 得400分之一的精度对应占空比周期为:400*10ms=4秒,这对于控制热风这种比热小的介质来说是根本无法容忍的,你会发现无论你怎么调整PID的参数都始终不能实现恒温。当然如果采集温度的AD分辨率足够高你可以不需要如此高的功率分辨率,你可以在温度还在1度以内变化时提前做出功率补偿使温度始终在1度以内上下浮动这样也能满足要求。经过实验我发现功率精度最低可以降到1/50,此时的加热周期T=50*10ms=0.5秒,但此时肉眼还是可以明显的看到发热丝的红暗交替,可能是由于采温热电偶的滞后性导致实际AD却是平稳的,如用热电偶测温仪实测温度也是稳定的。以上就是我四年前的解决方案,只是发热丝的红暗交替问题让我不太舒服。

    直到我看到了某大厂做的热风控温产品,在保证控温精度的前提下肉眼几乎看不出发热丝的红暗交替现象。我便知道这个问题另有出路,于是我便开始一直在寻求这个终极解决方案也就有了前文所提到的灵光乍现的瞬间。这个思路说来也简单:如下图假如占空比周期T为10个市电半周,占空比D=5,按照通常的控制思路是这样的:

集中PWM

集中PWM


每次打开5个半周后会有5个半周关闭,如果按照1/50的功率控制精度就有:250ms开加热,250ms关加热这样做当然会造成热风温度的短时波动。终极解决方案是这样的:将上图中的ON和OFF打散再让他们充分混合得到你中有我我中有你的效果:

分散PWM

分散PWM
这样整体效果还是5个市电半周开5个市电半周关,也就是占空比依然是5/10.当然5/10是个特例,如果1/50的功率精度占空比为27/50应该怎么办呢?可理解为27个开和23个关,将27/23等于1余4,即为开和关为1:1余4,也就是一次开后就有一次关但23个开关周期后还多余4个开没有打开,这应该怎么办呢?办法就是把这4个开再分散到那23个开关周期中去:也就是23/4=5余3,现在可以把余数忽略了,最后输出结果是每5个ONOFF周期多插入一个ON这样就可以得到最大限度分散的27/50的占空比了。当然口说无凭为了直观的验证这个方案特引入一个验证算法的好方法:利用微软的Visual Studio验证并打印出实验结果:

实验代码:

实现1/100功率分辨率的分散占空比控制效果:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(void)
{
	for (uint8_t heat_duty = 0; heat_duty <= 100; heat_duty++)
	{
		uint8_t i, j, k, l, m, sub_t, pos_nag,on_cycles=0,off_cycles=0; _Bool HEAT1ON_A;
		i = heat_duty;
		if (i > 50) { j = 100 - i; pos_nag = 1; }
		else { j = i; i = 100 - j; pos_nag = 0; }
		sub_t = i == 0 || j == 0 ? 100 : i / j + 1; 
		l = j != 0 ? i % j : 1; if (l == 0)l = 1;
		for (uint8_t period = 0; period < 100; period++)
		{
			k = period; m = k / (j / l * sub_t + 1); 
			m = j==0 ? 0 : m > l ? k - l : k - m;
			HEAT1ON_A = m % sub_t == sub_t >> 1 ? !pos_nag : pos_nag;//k < j* sub_t && k % sub_t == sub_t >> 1 ? !pos_nag : pos_nag;//
			if (HEAT1ON_A)on_cycles++;
			else off_cycles++;
			printf(HEAT1ON_A!=0?"*":"-");
		}
		if (heat_duty!=on_cycles || on_cycles+off_cycles!=100)printf("%d,%d/%d\n", heat_duty,on_cycles,off_cycles);
		else printf("\n");
	}
	return 0;
}

运行结果:( ‘ * ’ 表示开,‘ - ’表示关)

                                                                   占空比0~50

0_50占空比

0_50占空比                                                              占空比51-100

51_100占空比

51_100占空比

经过以上验证后发现逻辑上是没有问题的可以实现0-100内任意占空比的分散混合开关效果,但实际控温效果却差强人意,温度居然还没有原来不分散的稳定。这个脸实在打的让人猝不及防,本着严谨的求知态度步步为营却依然被现实打脸。哪位高人过来解释一下问题究竟出在哪里?在这里我也给出一个我的解释:可能是由于我的占空比控制是实时更新的,我并不会等到整个占空比周期结束后再更新占空比值,而是每次过零我都会根据当前的温度AD值重新计算占空比,我认为这样才能保证快速的反应能力,否则加热时负载的变化就不能及时的做出反应。但是在分散开关占空比控制中由于开和关是错开的,在一个占空比周期中占空比的邻近抖动可能会得到意想不到的效果:本来是降低加热功率反而会得到更高的功率,因此就会导致温度的不稳定。

此帖出自单片机论坛
个人签名模电临时工

回复

5530

帖子

18

资源

五彩晶圆(中级)

想法有点意思,有点类似占空比有效电压用在加热里,不太懂,帮顶。

个人签名

默认摸鱼


回复

51

帖子

0

资源

一粒金砂(中级)

很佩服楼主的态度!
个人一点点看法(也许不专业,无怪)功率和温度并不是线性关系。
和环境温差越大,散热越快,加热功率也许需要越大。
400度温度内1度的控制精度,在低温度区域也许可以控制在1度内,在高温区内1/400 控制精度也许不够

点评

你说的这个问题属于静态温漂,其实由于环境的变化而引起的温度波动是难免的。我说的控温精度1度,主要是说设定目标温度要能分辨±1℃,否则设定温加减1度后实测温度却没有变化。  详情 回复 发表于 2020-7-22 08:37

回复

321

帖子

2

资源

一粒金砂(中级)

比较赞同二楼的看法


回复

315

帖子

1

资源

一粒金砂(高级)

本帖最后由 shipeng 于 2020-7-22 10:23 编辑
aallian 发表于 2020-7-21 21:10 很佩服楼主的态度! 个人一点点看法(也许不专业,无怪)功率和温度并不是线性关系。 和环境温差越大,散 ...

你说的这个问题属于静态温漂,其实由于环境的变化而引起的温度波动是难免的。我说的控温精度1度,主要是说设定目标温度要能分辨±1℃,否则设定温加减1度后实测温度却没有变化这就是控温精度不够的表现。

个人签名模电临时工

回复

51

帖子

0

资源

一粒金砂(中级)

关于红暗交替问题,达到目的温度后,如果楼主固定功率输出,控制占空比均匀分散。 是否有帮助?

点评

使用“占空比均匀分散”后是可以解决我所提到的“发热丝红暗交替”的问题的,只是实际AD值抖动比“集中占空比”的更大  详情 回复 发表于 2020-7-22 12:00

回复

315

帖子

1

资源

一粒金砂(高级)

aallian 发表于 2020-7-22 11:36 关于红暗交替问题,达到目的温度后,如果楼主固定功率输出,控制占空比均匀分散。 是否有帮助?

使用“占空比均匀分散”后是可以解决我所提到的“发热丝红暗交替”的问题的,只是实际AD值抖动比“集中占空比”的更大

个人签名模电临时工

回复

1万

帖子

143

资源

版主

感觉应该是“分散”和“快速性”算法冲突了,导致超调所致。另外,尽量以交流整周期为单位分散,对电网更友好些。

点评

不错,我也确实也考虑过这个问题,但考虑到这会进一步牺牲功率分辨率或加剧发热丝红暗交替问题时我还是犹豫了,不过最终因为这个方案实际测试控温效果不佳最终并没有采用。  详情 回复 发表于 2020-7-22 15:30
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

315

帖子

1

资源

一粒金砂(高级)

chunyang 发表于 2020-7-22 15:00 感觉应该是“分散”和“快速性”算法冲突了,导致超调所致。另外,尽量以交流整周期为 ...

不错,我也确实也考虑过这个问题,但考虑到这会进一步牺牲功率分辨率或加剧发热丝红暗交替问题时我还是犹豫了,不过最终因为这个方案实际测试控温效果不佳最终并没有采用。

个人签名模电临时工

回复

315

帖子

1

资源

一粒金砂(高级)

事情到了这里似乎又产生了一个新的“悖论”,太分散和太快速又是一个矛盾。最终我的做法是分散性做出妥协,但快速性未做让步。具体解决方案是:分散值为一个固定值,拿1/100的功率分辨率来说将占空比固定分散为10份,如不够10则遵循左对齐原则,余数插入也遵循左对齐。最终控温效果可以解决“红暗交替”和控温不稳的问题。

个人签名模电临时工

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表