造价通

反馈
取消

热门搜词

造价通

取消 发送 反馈意见

步进电机的M16驱动简介

2022/07/16144 作者:佚名
导读:此程序可驱动五引线步进电机,通过按键可控制步进电机的转速、方向、三种驱动方式,三种驱动方式分别为:单四拍驱动、双四拍驱动、单双八拍驱动,其中以单双八拍驱动转速最慢。具体联接方式在程序中有说明。 /************************************ * 步进电机的M16驱动程序 * * 功 能:用M16驱动步进电机 * * 实现三种驱动方式 * * 单四拍驱动、双四拍驱动 *

此程序可驱动五引线步进电机,通过按键可控制步进电机的转速、方向、三种驱动方式,三种驱动方式分别为:单四拍驱动、双四拍驱动、单双八拍驱动,其中以单双八拍驱动转速最慢。具体联接方式在程序中有说明。

/************************************

* 步进电机的M16驱动程序 *

* 功 能:用M16驱动步进电机 *

* 实现三种驱动方式 *

* 单四拍驱动、双四拍驱动 *

* 单双八拍驱动 *

* 联接方式:PC0-3分别通过2803接A-D *

* 步进电机公共端接 5V电源 *

* 建立日期:2008年04月05日 *

* 修改日期:2008年04月06日 *

* 主控芯片:M16 *

* 时钟频率:外部晶体 7.3728MHZ *

* 编 译 器:ICCAVR 6.31A *

************************************/

#include

#include

#include "delay.h"

#define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7

unsigned char i=0; //转动计数

unsigned char m=1; //驱动方式参数

unsigned char n=0; //转动方向参数

unsigned int zhuansu=61500; //转速数据

/****************************

* 端口配置函数 *

****************************/

void port_init(void)

{

PORTA = 0x40;

DDRA = 0x40;

PORTB = 0x00;

DDRB = 0x00;

PORTC = 0xF0;

DDRC = 0x0F;

PORTD = 0x00;

DDRD = 0x00;

}

/****************************

* 正转操作函数 *

* 入 口:a 三种工作方式 *

****************************/

void bj_fs(unsigned char a)

{

switch(a)

{

case 1: //单四拍方式驱动

PORTC |= 1<

if(i>=4)i=0;

break;

case 2: //双四拍方式驱动

if(i!=4) //AB、BC、CD、DA驱动

PORTC |= (1<

PORTC |= (1<<(i-1))|1;

i ;

if(i>=5)i=1;

break;

case 3: //单双八拍方式驱动

if(i%2) //A、AB、B、BC、C、CD、D、DA驱动

{

if(i!=7)

PORTC |= (1<<(i/2))|(1<<(i/2 1));

else

PORTC |= (1<<(i/2))|1;

}

else

{

PORTC |= 1<<(i/2);

}

i ;

if(i>=8)i=0;

break;

default:break;

}

}

/****************************

* 反转操作函数 *

* 入 口:a 三种工作方式 *

****************************/

void bj_fsf(unsigned char a)

{

switch(a)

{

case 1: //单四拍方式驱动

PORTC |= 1<<(3-i); //D、C、B、A驱动

i ;

if(i>=4)i=0;

break;

case 2: //双四拍方式驱动

if(i!=4) //AD、CD、BC、AB驱动

PORTC |= (1<<(3-i))|(1<<(4-i));

else

PORTC |= (1<<(i-1))|1;

i ;

if(i>=5)i=1;

break;

case 3: //单双八拍方式驱动

if(i%2) //DA、D、CD、C、BC、B、AB、A驱动

{

PORTC |= 1<<(3-i/2);

}

else

{

if(i)

PORTC |= (1<<(3-i/2))|(1<<(4-i/2));

else

PORTC |= (1<<(3-i/2))|1;

}

i ;

if(i>=8)i=0;

break;

case 4:

default:break;

}

}

/****************************

* 定时器1配置函数 *

* 工作模式:普通模式 *

* 工作方式:溢出中断 *

* 预 分 频:64 *

* 时钟频率:外部7.3728MHZ *

****************************/

void timer1_init(void)

{

TCCR1B = 0x00;

TCNT1H = zhuansu>>8;

TCNT1L = zhuansu&0xFF;

TCCR1A = 0x00;

TCCR1B = 0x02;

}

/****************************

* 定时器1中断函数 *

****************************/

#pragma interrupt_handler timer1_ovf_isr:9

void timer1_ovf_isr(void)

{

TCNT1H = zhuansu>>8;

TCNT1L = zhuansu&0xFF;

PORTC &= 0xF0;

if(n)

bj_fsf(m); //反转

else

bj_fs(m); //正转

}

/****************************

* 器件初始化函数 *

****************************/

void init_devices(void)

{

CLI();

port_init();

timer1_init();

MCUCR = 0x00;

GICR = 0x00;

TIMSK = 0x04;

SEI();

}

/****************************

* 主函数 *

****************************/

void main(void)

{

unsigned char key,key1;

init_devices();

while(1)

{

key=RD_KEY(); //按键扫描

if(key)

{

delay_ms(20);

key1=RD_KEY();

if(key==key1)

{

switch(key) //按键有效,相应处理

{

case 0x01: //S1键处理:转速增加

zhuansu = 100;

if(zhuansu>62000)zhuansu=62000;

break;

case 0x02: //S2键处理:转速降低

zhuansu -= 100;

if(zhuansu<5000)zhuansu=5000;

break;

case 0x04: //S3键处理:转换驱动方式

m ;

if(m>=4)m=1;

break;

case 0x08: //S4键处理:正反转控制

if(n)

n=0;

else

n=1;

break;

default:break;

}

}

while(key) //等待按键释放

{

delay_ms(10);

key=RD_KEY();

}

}

}

}

完整的工程项目文件如下,此工程已通过验证。2100433B

*文章为作者独立观点,不代表造价通立场,除来源是“造价通”外。
关注微信公众号造价通(zjtcn_Largedata),获取建设行业第一手资讯

热门推荐

相关阅读