Chinaunix首页 | 论坛 | 博客
  • 博客访问: 654508
  • 博文数量: 516
  • 博客积分: 4119
  • 博客等级: 上校
  • 技术积分: 4288
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 17:29
文章分类

全部博文(516)

文章存档

2014年(4)

2013年(160)

2012年(352)

分类: C/C++

2013-04-14 22:13:20

温控程序部分报告——基于msp430g2553
  Created on: 2012-9-14
      Author: zhang bin
 
学习笔记
for msp430g2553
redesigned by zhang bin
2012-09-14
versions:12_09_01
All Rights Reserved




 
    程序是整个系统中很重要的一个组成部分,它在硬件的基础上协调着整个系统各个硬件部分的一同工作,控制着整个温控系统的一举一动。软件的主要功能包括有:
(1)传感器信号的采集、处理
(2)加热丝的PWM输出
(3)加热的温度和速度控制
(4)温控系统运行流程控制:程序初始化、温控的启动与结束、液晶显示模块控制
(5)温控信息显示与参数设定:状态显示、控制算法参数设定等
    
上面的几个能中,除了程序的初始化在主函数中执行,其他的各个部分都是在中断函数中执行的,其中键盘检测和数据输入是在键盘中断中执行,其他的数据采集、处理、控制等都是在定时器5ms中断中执行的。单片机平时处于低功耗模式,降低功耗。
程序的流程图如下:


本文主要采用两种算法实现题目要求:
第一个是PID算法的改进,由于温度控制是一个只能加热不能制冷的控制,所以我们只用了PI。首先通过P让温度加到一个离设定温度较近的温度,然后利用I逼近设定温度。
程序如下:
 
void pid()
{
 
   if (set_t-now_t>13)
  e2=0;
 
e1=set_t-now_t;   //设定值和实际值之间的误差
uk=kp*e1+ki*e2+kd*e3;
// wr_float(0,1,e2);
e2=e1+e2;
e3=e1-e4;
e4=e1;
if(uk>speed)   //防止升温过快
uk=speed;
if(uk<0)
uk=0;
 
control_value=1-uk;   //pid输出的控制量  即PWM的占空比
}
 
 
第二个是时间控制的线性算法
在时间控制中要求温度从40°均匀加热到60°,并且时间任意可设。
本程序实现的方法是:设定时间set_time是以s为单位,把40°到60°的这20°温差平均分成set_time份。然后在控制周期中,每一个周期让时间段time_m自加1,然后根据平均的公式算出该时间段应该达到的温度,公式如下:


因为控制时间输入set_time是以s为单位,而控制周期是100ms,所以上面要除以10。
具体的实现代码如下:
 
control_m_value=(float)time_m/set_time;
control_m_value=control_m_value/10;  //时间的控制以100ms为单位,时间的设定是以1s为单位
control_m_value=40+20*control_m_value;
set_t=control_m_value; 
pid();
 
CCR1=control_value*12000;      //调节PWM的占空比    12000为PWM周期
阅读(1396) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~