开始 读ADC0804 保存角度 返回 图9 角度测量子程序流程图
3.3角度控制子程序流程图
单片机读入设定值X和测量值Y后进行比较,调节占空比改变直流电机电压调节转速,控制帆板角度。如图10所示。
开始读测量值X按键处理读设定值YX=YNX〉YYN减小占空比DPWM 输出 返回增大占空比D 图10角度控制子程序流程图
4.系统测试
基于设计要求,本系统采用WDD35DC角度传感器采集风板的角度并通过LCD1602显示,还
10 / 27
可通过键盘预设转角值。
4.1 测试仪器与方法
测试仪器:量角器1把、秒表1块、直尺1把。 测试方法:
1、测试基本要求(1)项时,用量角器量出风板角度并与LCD上显示的角度值进行比较,看角度传感器测得的角度是否准确。
2、测试基本要求(1)项,用量角器量出风板实际角度并与LCD上显示的角度值和按键设定的角度值进行比较,并用秒表记录调节时间,评判其控制性能。
4.2 角度测量
(1)用手转动帆板,其测量结果如表1所示:
表1 角度测量数据比较(单位:度)
实际角度 50 65 75 80 85 90 105 110 显示角度 52 绝对误差 2 66 1 74 -1 80 0 87 2 90 0 106 1 113 3 125 127 2 130 130 0 (2)在无其它风源的环境下测量,用按键预设角度值,其测量结果如表2、表3所示:
表2角度测量数据比较 设定角度(°) 60 90 110 125 130 显示角度(°) 绝对误差(°) 调节时间(s) 63 3 3 92 2 5 110 0 6 130 5 6 133 3 5 表3角度测量数据比较 设定角度(°) 显示角度(°) 绝对误差调节时(°) 间(s) 60 120 58 117 3 9 50 130 47 125 4 10 70 110 72 112 2 8 90 120 89 122 2 5 80 125 83 127 3 9
4.3 测试结果分析
通过表2测试结果可以看出,随着风板设定角度值的增大,风板的调节时间和误差也随之
11 / 27
增加,调节参数符合设计要求;通过表3测试结果可以看出,设定两个角度值后,调节时间明显增加,误差控制的还比较理想,调节参数也满足了设计要求。
5.结论
通过测试可知:本系统能较好的完成风板控制系统的要求。具体完成工作如下: 1、完成了基本要求的(1),(2)精确度达到?以上。 2、采用LCD实时显示角度,并能实时显示设定值。
3、系统在完成基本要求(1)时,调节时间大大优于基本要求的时间。
参考文献
[1] 郭天祥.51单片机C语言教程.电子工业出版社.2009.
[2] 张新强.点阵LCD驱动显控原理与实践.北京航空航天大学出版社.2010. [3] 黄志伟等.全国大学生电子设计竞赛训练教程(修订版).2010.
12 / 27
附录 程序清单
#include
#define uchar unsigned char #define uint unsigned int
sbit lcdrs=P2^5;//液晶 sbit lcdrw=P2^6;//液晶 sbit lcden=P2^7;//液晶
sbit left=P3^3;//右边 sbit right=P3^4;//左边 sbit left1=P2^4;//左边副 sbit right1=P3^2;//右边副 sbit adrd=P3^7;//ADC0804 sbit adwr=P3^6;//ADC0804 sbit adcs=P3^5;//ADC0804
sbit jia=P2^0;//自加1 sbit jian=P2^1;//自减1
sbit qdks=P3^0;//确定开始运行 sbit weixuan=P3^1;//选位
uchar code j[3]=\
uchar code table[10]=%uchar jiannum[9];
uint disnum,a,jdnum;
uchar
pwm,num,pwm1,num1,pwm2,num2,l,r,dsq,shuru,shuru1,shuru2,shuru3,jdxx,jd,jd1,wxnum,jnum,ksnum,k1num,zq;
void delay(uint ms)//延时程序 {
uchar i; while(ms--) {
for(i=0;i<120;i++); } }
void com(uchar com)//写指令 {
lcden=0;
13 / 27
lcdrs=0; lcdrw=0; delay(5); P0=com; lcden=1; delay(5); lcden=0; }
void date(uchar com)//写数据 {
lcden=0; lcdrs=1; lcdrw=0; delay(5); P0=com; lcden=1; delay(5); lcden=0; }
void lcdinit()//液晶初始化程序 {
com(0x38);//设置1602
com(0x0c);//显示光标但不闪烁 com(0x06);//地址指针加1 com(0x01);//清屏 com(0x80);//显示JD:
for(jd=0;jdxx<3;jdxx++)//显示JD: date(j[jdxx]); }
void display(uchar add,uint dat)//显示{
uchar bai,shi,ge;
com(0x80+add);
bai=dat/100; shi=dat0/10; ge=dat0;
date(table[bai]);
14 / 27