tag 标签: 温度控制

相关博文
  • 热度 14
    2013-11-28 21:57
    1952 次阅读|
    0 个评论
           记得在做测温仪校准台的时候,在做到用 PID 算法控制温度的时候,对于 PID 算法的理解的过程很难受也很纠结,尽管有凤舞天和 tomsu 两位大师在旁边指导还是费了不少时间和精力去理解、领悟和调试。后来另外一个同事需要做高频加热设备的温度控制,也需要用到 PID 算法对温度的控制,因为这位同事是今年刚毕业的大学生,在学校主要是学软件,基本上没有什么硬件基础,所以她对整个温度控制很难理解和领悟,对 PWM 的理解刚开始总是很难精确,所以在她做温控的过程更加的纠结和痛苦,同事耗费的时间、精力和人力(需要在旁边指导的同事)也更大。并且她的经历跟我的经历是重复的,在我经历过一遍之后她又按照我走过的经历再经历一遍,这种重复的工作对公司来说是一种很严重的人力资源的浪费。对于一个公司来说,人力资源是最宝贵的一种资源。        而在工控行业, PID 算法是软件控制所常用的一种算法,所以对于我们嵌入式组来说,基本上是需要每个人都会用的。那么我们就必须要找到一种方法既能降低学习成本,又能统一软件,降低维护成本,而且还简单、易学、易用。所以,凤舞天建议我先在 msOS 的基础上添加一个 PID 算法库的试用实例,面向对象的,把算法都封装在底层,用户只需要调节相对应的门限值和系数就行。        那么我们来介绍一下 PID 算法库的分层。        msOS 是采用分层的,整个系统分为 App 和 System 两个目录: 而 System 是系统库。我们把 PID 库添加在 System 目录下,以实现真正的库封装。 在 PID 目录下,包含 Pid.c 和 Pid.h 两个文件。 首先我们从 PID 库的应用开始入手。我们把用户根据实际情况需要调整的参数做成界面菜单放在 event.c 文件中。用户可以根据特定需求来更改目标值 TargetPointer 和获取当前值 CurrentPointer ;也可以根据控制过程所需要的控制曲线来定 P 、 I 、 D 引入的门限值;还可以设置运算过程中 P 、 I 、 D 的系数和积分处理的模式,用户只需要对此进行注册即可。同时需要对在底层运算后传上来的结果进行怎样的处理在 static void Mycallback( int data) 中进行控制。 那么该怎样去调节这些参数就得需要我们了解 PID 的原理和物理意义了。 其实关于 PID 算法的文章网上很多,可基本上都是基于数学模型讲解的,很难理解也很难运用,后来凤舞天也写了一篇《 PID 算法》,深入浅出,比较通俗易懂。而作者结合具体项目的实践,和对 PID 算法理论的理解,简单总结了一下: P 是根据测量值和目标值的误差来决定的负反馈的大小。 P 的取得公式: P= 系数 * (目标值 - 当前值)。但是如果一开始就引入负反馈,很有可能达不到目标值,所以需要设定引入负反馈的门限值。而在引入负反馈门限值之前,如果(目标值 - 当前值)大于负反馈引入门限值应当全速加热;如果(目标值 - 当前值)小于负反馈引入门限值应当全速减。 I 就是积分,也就是极限误差。当目标值和当前值很接近的时候,如果继续只根据负反馈来调节,那么有可能与目标值产生误差值,而达不到目标值,所以这时候需要引入一个趋势与负反馈相同的期望值来消除这个误差。把这些误差累加起来正向反馈给结果来抑制负反馈,在正负反馈的共同作用下当前值逐渐逼近目标值。 D 是为了防止在当前值在 P 和 I 的正负反馈作用下出现过冲或者还没达到目标值的情况下更快速的稳定下来而引入的。所以 D 的门限值不宜太高,应该取比较接近目标值的门限,这样可以减小当前值的振荡,使其更快速的稳定。 接下来我们来分析分析 PID 算法库的底层。 首先是定义一个 PID 的结构体: 然后通过注册方式来获取应用层给不同参数的赋值。 在获取了参数之后,就开始 PID 运算。 PID 的运算原理就是前面我们所提到的。在这里我们使用 systemtick 每个 10ms 调用一次,来确保实时、稳定的控温。   在这个 PID 运算中,我们为了让计算结果更能符合控制逻辑的曲线分布,提供了三种积分模式: LineMode (线性模式)、 TwoRootMode (开二次方根号模式)、 ThreeRootMode (开三次方根号模式)。 关于这三种积分模式,作者以测温仪校准台为基础(校准台的发热体是氮化硅)做了三组测试并获取了数据绘制成曲线图来做分析。 在这三组测试中,我们设目标温度都为 800 度,负反馈门限、负反馈系数、积分门限、微分门限都相同,取积分模式和积分系数不相同。在积分线性模式下积分系数为 0.02 ,二次根号和三次根号积分模式下,积分系数为 1 。 在线性积分系数远小于开根号的积分系数的情况下,其稳定的波形还是没有开根号的平滑,稳定。 此图为线性积分模式在引入积分和微分后的温度趋于稳定过程的 PWM 输出。可以看到,在 PWM 输出稳定之前还会有一个小的波峰。这个波峰的幅度大小就取决于积分系数的大小。                                   而这两个图是积分模式取开二次方和三次方根号在引入积分和微分后的温度趋于稳定过程 PWM 的输出。可以看出即使积分系数为 1 ,开根号的次方数越多,在 PWM 输出稳定之前,它的曲线越平滑。
  • 热度 22
    2013-11-17 00:02
    1991 次阅读|
    5 个评论
    虽然网上关于PWM的文章很多,我也看了很多,但是看完之后总感觉似懂非懂,也都不是我想要的。特别是在用msOS做测温仪校准台的时候,我需要用到通过调节PWM的占空比来控制功率输出。因为开始没有用过PWM,于是就在网上和书本上找了一些资料学习,并且根据学习的理解开始控制功率输出。虽然能够控制了,但是精度却达不到我想要的。于是我开始根据印象和测试实验的经验来调节arr和psc的值,来达到我的要求。虽然结果是达到了,但是当时我对PWM的认识还比较浅,整个感觉是比较飘的。         后来另一个同事在用PWM的时候通过实时改变待装入捕获比较寄存器的脉冲值来改变占空比,出现了波形失真。针对这一情况,凤舞天让我们在团队内部讨论,并且解决这一问题。这个时候,我忽然意识到,在做一个产品时,对相关知识点不能完全明白的掌握,是很麻烦也是很危险的。幸运的是,这个同事是在测试中出现了问题,那么问题就会在产品出去之前把问题解决,这样就不会让问题出现在产品的应用当中,也不会对产品的质量和公司的产品品牌造成影响。而我的PWM一直都没有出现过波形失真,那以后会不会在应用中也出现波形失真,这个是个未知数。为了解决同事的这个问题,同时确定我的PWM没有问题,我再一次沉下心来学习研究PWM。        现在来分享一下我的学习理解:        首先是计数器寄存器(TIMx_CR1):计数器寄存器是一个16位的寄存器,其中: 1.ARPE位是自动重装载允许位。 2.DIR位是控制计数方式位。 3.URS位是控制事件更新请求源。 4.UDIS位禁止事件更新。 5.CEN使能计数器。        其次是预分频器(TIMx_PSC):预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。在预分频寄存器对主频率分频后,提供给计数器,作为计数器的时钟。它是基于一个在TIMx_PSC寄存器中的16位寄存器控制的16位计数器。因为这个控制寄存器带有缓冲器,它能够在工作时被改变。但是预分频器的新参数会在下一次更新事件到来时被调用。例如,预分频器的参数从1变到2时,计数器的时序图应该是:         再次是自动重装载寄存器(TIMx_ARR):自动重装载寄存器也是一个16位的寄存器。实际上自动重装载寄存器实际上对应着2个寄存器。一个是程序员可以直接操作的寄存器,一个是程序员看不到的影子寄存器。实际上真正起作用的开始影子寄存器。而这两个寄存器是如何配合工作的,则需要TIMx_CR1寄存器的APRE位设置: 当APRE=0时,预装载寄存器的参数实时的传送给到影子寄存器,并没有实现预装载的功能; 当APRE=1时,在每一次事件更新时,预装载寄存器的参数才会被传送到影子寄存器。         而PWM的频率是通过预分频参数和自动重装载寄存器的参数确定的。预分频的参数确定了计数器的时钟,自动重装载寄存器的参数确定了在这个时钟频率下的计数次数,即周期。举个例子:如果系统主频率是72M,psc=8,那么,计数器的时钟就是72M/(8+1)=8M;arr=2000,那么PWM会在8M的频率下每次计数2000次之后会进入到下一个计数循环。而PWM的占空比精度于预分频参数有关,预分频参数越小,精度越高;反之就越低。          我们从下面的定时器时钟框图可以看出,事件U更新是在预分频后,捕获比较之前,而CC4I是中断和DMA输出。所以PWM在每一个周期之后会有一个中断,在来了中断之后,才会更新事件,这样就保证了PWM的每个周期都能够正常完成,而不会导致波形失真。(这个也是为什么我的PWM没有出现过失真,而我同事的PWM出现了失真的原因。因为我用到了中断更新事件,而他没有使用中断。)                     那么怎么调节PWM的占空比呢?         通过捕获/比较寄存器(TIMx_ CCRx),在TIMx_CR1的APRE位没有选择预装载特性时,写入的值会立即被传送到捕获/比较寄存器中。当TIMx_CR1的APRE位选择了预装载功能特性,只有当更新事件发生时,预装载之才会被传送到捕获/比较寄存器。然后捕获/比较寄存器会拿当前值与计数器TIMx_CNT进行比较,当达到捕获/比较寄存器的值时,PWM的电平会发生一次跳变。        关于PWM的其他基本配置,主要也就是一下几点: 1.计数模式:向上计数(计数器从0计数到自动加载值TIMx_ARR计数器的值);向下计数(计数器从自动装入值TIMx_ARR的值开始向下计数到0);中央对其(计数器从0开始计数到自动加载值TIMx_ARR寄存器-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件,然后再从0开始重新计数)。 2.PWM模式: PWM模式1(OCxM=110,在向上计数时,如果TIMx_CNT TIMx_CCR1时为高电平,否则为低电平);PWM模式2(OCxM=111,在向上计数时,如果TIMx_CNT TIMx_CCR1时为低电平,否则为高电平)。 3.要使用PWM必须要开启其相对应的时钟线。
相关资源