炉温控制(Keil代码+Proteus仿真+Matlab仿真)

Keil For 51 编程入门教学(以本次试验为例):

写代码这个活,必须是日常的积累,不是看一篇或者两篇教学就能掌握的,所以建议初学的同学直接拿代码修改修改,理解一下各个代码段和函数的作用。理解了再尝试自己写写。可以说,会改代码的人就已经算是入门了,哪怕平时做电赛做飞思卡尔做一些小项目的时候。

另外初学代码的人,一定要注意代码规范化。代码堆放的美观性,代码的可读性,代码的注释,都是一段优秀代码必不可缺少的。网上对此有非常多的讲解,建议大家有空好好看看。

这次的代码有两个关键点,解决这两个关键点自然毫无难处可言了。

第一:PID

//PID Calculateby Litempchange();get_temp();f_temp_new = f_temp;// °f_temp_err = f_temp_new – f_temp_old;// ° 升温 大于 0 降温 小于 0f_temp_rate = f_temp_err / 0.25;// °/sf_temp_old = f_temp_new;// °// /********PID Calculate Hot Time************/void PID(){hot_time = Canshu_P * (Set_Temp – f_temp_new * 10) + Canshu_D * f_temp_rate * 10;}

第二:PWM

原理:51的PWM输出。自然要用到定时器操作,首先我们要确定周期,既然中断服务函数的进入时间是50ms,那么我们选择1s为一个周期,在这个周期内我们可以进行20次的翻转电平操作,也就是说我们可以生成1/20 2/20 3/20 4/20 ………………..20/20的PWM方波。而这个占空比的入口参数,就是PID算法的结果。即为:hot_time;

void Timer0_ISR(void) interrupt 1/*50ms中断服务程序*/{TH0 = (65536 – 50000) / 256;TL0 = (65536 – 50000) % 256;/*重装初值*//******************PID闭环控制******************************/time ++ ; //time x 50ms if(hot_time > 0){hot_time –;RELAY = 0;//继电器工作LED_YELLOW = 0; //黄亮}if(hot_time <= 0){RELAY = 1;//继电器停止LED_YELLOW = 1; //黄灭hot_time = 0;}if(time == 20){//1秒一次time = 0;now_time ++;//单片机内部计时if(Flag == 2){if(set_time > 0){set_time –;}}if(now_time == 999){now_time = 0;}//PID Calculateby Litempchange();get_temp();f_temp_new = f_temp;// °f_temp_err = f_temp_new – f_temp_old;// ° 升温 大于 0 降温 小于 0f_temp_rate = f_temp_err / 0.25;// °/sf_temp_old = f_temp_new;// °//PID();}/**********************************************************//**********************检测按键****************************/if(SET == 0 && (Flag == 0 || Flag == 2)){Flag = 1;delay(180);}if(Flag == 1){//温度定好 运行if(ADD == 0){Set_Temp += 10;delay(180);}if(CUT == 0){if(Set_Temp >= 10)Set_Temp -= 10;delay(180);}if(END == 0){Flag = 0;//预定温度运行delay(180);}}if(ADD == 0 && (Flag == 0 || Flag == 2)){Flag = 3;delay(180);}if(Flag == 2){if(set_time > 0){RELAY = 0;//继电器工作LED_YELLOW = 0; //黄亮} else {RELAY = 1;//继电器停止LED_YELLOW = 1; //黄灭}}if(Flag == 3){//时间定好 运行if(ADD == 0){set_time += 5;delay(180);}if(CUT == 0){if(set_time >= 5)set_time -= 5;delay(180);}if(END == 0){Flag = 2;//预定时间运行delay(180);}}/**********************************************************/}至于其他的控制都不是什么难事。比如LED,蜂鸣器,继电器。都是很简单的高低电平控制了。具体操作代码可以参考压缩包内的keil文件,有很详细的注释。

至于一些接线的硬件上的连接,比如PNP,DS18B20等的电路,可以参考Proteus里的仿真,原理等下次有空再写吧。不是什么难点,百度一下就有了。

triple kill:Simulink仿真

调试代码中的PID参数,其实我是一直没有做Simulink仿真的习惯,不过老师说不做不行,所以入门了一下,简单的做了一个仿真,,但是关于这个的传递函数我不会求,求指导~

Malab Simulink的使用还是非常简单的,模块化编程,这一点和Dream Weaver很像,模块化编程真的是把编程这个很烦的事情大众化,简单化了。给发明这个的神点个赞。

Matlab 7 下载地址:

Matlab7.0安装教程

要配置环境变量,如下:右键我的电脑(计算机)——属性——高级系统设置——在高级选项卡中,点环境变量——在系统变量中,吧TEMP、TMP的路径改为C:\temp

在C盘下建一个临时文件夹(安装时用)3.直接双击压缩包中的setup(注意不用解压缩)

所示在红线内属于序列号。有以下序列号可供选择:Matlab 7 (R14) 注册码1:14-13299-56369-16360-32789-51027-35530-39910-50517-56079-43171-43696-14148-64597-46518-35191-10070-58980-25665-36629-51033-46438-01127-52395-28569-20030-38795-14563-11876-23292-58825-37547-05827-26397Matlab 7 (R14) 注册码2:14-58204-39252-07634-11570-16849-09455-22809-05445-13616-29058-08276-06885-12215-41987-21894-60423-57622-18647-58411-24238-20443-59027-07209-27706-28292-14609-15393-48293-13036-12293-43713-57876-43362Matlab 7 (R14) 注册码3:14-44889-04614-04275-46147-23559-43066-41714-23083-65272-04997-17469-27919-17226-59862-27901-53983-56217-20094-53460-62647-58166-24499-35558-19511-44882-53016-25658-61109-03776-34505-00776-15813-07183接下来就可以使用matlab了。

看自家总在期待,不知将来好歹,新乐吧总在不断等待,

炉温控制(Keil代码+Proteus仿真+Matlab仿真)

相关文章:

你感兴趣的文章:

标签云: