Void lcd init表示让LCD开始工作,并且处于输入状态,将数据输入,再进行下一项。LCD_RS表示将要对内部进行置换,并不是显示数据,因为输入的是配置数据。
4.3 PWM发生程序设计
PWM波的发生利用单片机定时器功能实现。其基本原理是设置好单片机的定时器功能,然后根据设定的电机转速,调整不同的PWM占空比,即输出高电平的脉宽,从而模拟出PWM波形。在本系统中,设置PWM波的频率为2000HZ,即每个周期为0.5ms,将电机转速分为五个等级,分别对应0%、20%、40%、60%、80%和100%的占空比。下面是电机控制的程序。
if(sys_dir == 1) {
dianjif =0;
if(time >= sys_speed)
dianjiz = 0;
else if(time < sys_speed)
dianjiz = 1;
} else { dianjiz =0; } time++; if(time==5) time=0;
if(time >= sys_speed)
dianjif = 0;
else if(time < sys_speed)
dianjif = 1;
15
程序中定时器计数周期设置为0.1ms,每0.1ms触发一次中断服务函数。Time变量自加1。当time小于Sys_speed时,dianjiz引脚给高电平。当time达到5时,time又重新置零,这样便形成了一个周期,sys_speed从而表示占空比。而sys_dir用于表示电机转动方向。当sys_dir为1时,dianjiz引脚输出PWM波形,dianjif引脚常为低电平;当sys_dir为0时,dianjif输出PWM波形,dianjiz引脚常为低电平。
4.4按键控制程序
系统中一共设计了三个按键,分别控制电机转速和方向。在程序中用key0、key1和key2表示。当key0被按下时,与单片机相连的管脚检测的低电平发生,于是执行if(key0 == 0)语句。在该语句中,首先进行延时delay_ms(100)操作,此操作是软件消抖。由于按键按下后,程序执行很快,可能会反复多次执行if语句,因此需要进行延时操作。Key0按键的作用是降低电机转速,因此接下来执行sys_speed = sys_speed – 1语句。Sys_speed表示电机转速,执行完该语句,则将电机转速降低一个等级。Key1的原理与key0类似,用于提高电机转速,不再赘述。
Key2是控制电机转动方向的按键。因此当该按键被按下后,执行sys_dir = !sys_dir;语句。sys_dir表示电机转动方向,执行完该语句,在完成了电机方向的转换。
if(key0 == 0){ }
if(key1 == 0){
delay_ms(100);
sys_speed = sys_speed - 1; if(sys_speed < 0)
sys_speed = 0;
delay_ms(100);
sys_speed = sys_speed + 1;
16
if(sys_speed > 5)
sys_speed = 5;
}
if(key2 == 0){ delay_ms(100); sys_dir = !sys_dir;
} 17
4.5系统仿真
图4.2 系统电路图
18
图4.3 速度为2方向为顺时针
19