3.3
步进电机编程实例
按照图16-4所示的原理搭建硬件电路,使用AVR单片机的PD4–PD7端口驱动步进电机的四根相线。本书为简化过程,使用了由ULN2003构成的步进电机驱动模块来实现对步进电机的驱动,但其工作原理与图16-4所示电路完全相同。打开Atmel Studio 6.1软件,新建名为STEPMOTOR的项目,保存在chapter16文件夹中,软件会自动添加源文件STEPMOTOR.c到所建项目中,编辑STEPMOTOR.c源文件,具体代码详见代码清单16-1。程序的目的是通过AVR系统板上的两个按键控制步进电机的正反转,步进电机的转速可以由软件设定。
代码清单16-1
步进电机驱动
/** STEPMOTOR.c
* PD4 -PD7 步进电机驱动 S1 、S2 控制方向
* Created: 2013/10/28 20:11:25
* Author: GAO
*/
#include
#define F_CPU 16000000UL // 定义系统时钟
#include
#define beep_SET (PORTB|=0x01) // 置位PB0 (蜂鸣器)
#define beep_CLR (PORTB&=0xFE) // 清零PB0
#define uchar unsigned char
#define uint unsigned int uchar LRCTRL; // 左右控制
const uchar table_l[]={0x90,0x80,0xc0,0x40, 0x60,0x20,0x30,0x10}; // 半步工作(顺时针)
const uchar table_r[]={0x10,0x30,0x20,0x60, 0x40,0xc0,0x80,0x90}; // 半步工作(逆时针)
void beep_init(void); // 蜂鸣器初始化函数声明
void step_motor_init(void); // 步进电机驱动初始化函数声明
void step_motor_diver(void); // 步进电机驱动函数声明
void single_key_init(void); // 独立按键初始化函数声明
void key_scan(void); // 独立按键扫描函数声明
/********** 主函数**********/
int main(void)
{
beep_init();
single_key_init();
step_motor_init();
while(1)
{
step_motor_diver(); // 驱动步进电机
key_scan(); // 扫描按键
beep_CLR; // 按键终止后停止按键音
}
}
/********** 蜂鸣器初始化函数**********/
void beep_init(void)
{
DDRB|=0x01;
}
/********** 步进电机驱动初始化函数**********/
void step_motor_init(void)
{
DDRD|=0xF0;
LRCTRL=1; // 设定方向,1 为顺时针
}
/********** 步进电机驱动函数**********/
void step_motor_diver(void)
{
uchar x; if(LRCTRL==1)
{
for(x=0;x<8;x++)
{
PORTD=table_l[x];
_delay_ms(1); // 改变延时时间软件设定转速
}
}
if(LRCTRL==0)
{
for(x=0;x<8;x++)
{
PORTD=table_r[x];
_delay_ms(1); // 改变延时时间软件设定转速
}
}
}
/********** 按键初始化函数**********/
void single_key_init(void)
{
DDRD&=0xFC; // 将PD0 、PD1 设为输入
}
/********** 按键扫描函数**********/
void key_scan(void)
{
unsigned char KEYNUM;
KEYNUM=PIND; // 读PORTD 端口
KEYNUM&=0x03; // 保留PORTD 低两位
if(KEYNUM==0x02) //S1 按下
{
beep_SET; // 启动按键音
_delay_ms(10);
if(KEYNUM==0x02)
{
LRCTRL=0; // 逆时针转动
}
}
if(KEYNUM==0x01) //S2 按下
{
beep_SET; // 启动按键音
_delay_ms(10);
if(KEYNUM==0x01)
{
LRCTRL=1; // 顺时针转动
}
}
}
/********** 结束**********/
以上代码经编译后下载到AVR系统板上的单片机中,正确连接硬件电路,软件运行后可以看到步进电机已经开始转动,按S1、S2键即可以改变电机转动方向。AVR系统板驱动步进电机的情况如图16-5所示,本例中对步进电机的控制非常简单,如果你有更多的按键资源,也可以继续拓展功能,比如使用另外的按键来调整转速、用AVR系统板上的数码管显示步进电机当前的运行状态等。总之,尽可能地发挥你的想象力,你就会DIY出更多更好的作品出来。