步进电机的驱动

步进电机的驱动

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 // 包含AVR 头文件

#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出更多更好的作品出来。

相关推荐

盛的五笔:DNNL
365体育提现多久到账

盛的五笔:DNNL

📅 09-04 👁️ 9116
一键启动的钥匙孔在哪里?一键启动怎么用钥匙发动车子
希腊男篮vs美国男篮录像
beat365体育亚洲

希腊男篮vs美国男篮录像

📅 10-06 👁️ 8218
延时开关十大品牌排行榜
beat365体育亚洲

延时开关十大品牌排行榜

📅 12-22 👁️ 4077
重庆酒店,重庆酒店预订查询,重庆宾馆住宿【携程酒店】
Save 15% on 你能活到第几集 on Steam
365体育提现多久到账

Save 15% on 你能活到第几集 on Steam

📅 11-29 👁️ 3870
火焰之地
365bet娱乐登录

火焰之地

📅 12-30 👁️ 4826
兄弟结婚包多少红包
beat365体育亚洲

兄弟结婚包多少红包

📅 02-09 👁️ 9244
靠临摹成功上位的大画家们
beat365体育亚洲

靠临摹成功上位的大画家们

📅 09-29 👁️ 339