当前位置:文档之家› 单片机控制步进电机转动程序

单片机控制步进电机转动程序

单片机控制步进电机转动程序
单片机控制步进电机转动程序

xxxxxxxxxxxxxxxxxxx

#include "reg52.h"

#include "INTRINS.H"

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define ACC_LEVEL 42

#define DEC_LEVEL 42

#define STOP_LEVEL 42

#define UP_LEVEL (ACC_LEVEL-2)

#define DOWN_LEVEL 1

uchar code slave_addr[4]={00, 01, 02, 255};

uchar code c1[10]={0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xA0,0xA2};

uchar code c2[10]={0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0xB0,0xB2};

/*加速过程各档速度定时器初值,用16位的T2实现*/

uint code acc_pulse_T2_const[ACC_LEVEL]=

{64170,64170,64841,65065,65176,65243,65288,65320,65344,65362,65377,65389,65399,65407,6 5415,65421,65426,65431,65435,65439,65443,65446,65448,65451,65453,65455,65457,65459,654 61,65462,65464,65465,65466,65467,65468,65469,65470,65471,65472,65473,65474,65474};

/*加速过程各档速度加速持续时间(用脉冲数表示),用16位的T0计数,计数器初值*/

uint code acc_time_T0_const[ACC_LEVEL]=

{65463,65463,65460,65458,65455,65452,65449,65446,65443,65440,65436,65433,65429,65425,6 5421,65417,65413,65409,65404,65399,65395,65389,65384,65379,65373,65368,65362,65355,653 49,65342,65335,65328,65321,65313,65305,65297,65289,65280,65271,65261,65251,65251};

/*减速过程各档速度定时器初值,用16位的T2实现*/

uint code dec_pulse_T2_const[DEC_LEVEL]=

{64170,64170,64841,65065,65176,65243,65288,65320,65344,65362,65377,65389,65399,65407,6 5415,65421,65426,65431,65435,65439,65443,65446,65448,65451,65453,65455,65457,65459,654 61,65462,65464,65465,65466,65467,65468,65469,65470,65471,65472,65473,65474,65474};

/*减速过程各档速度减速持续时间(用脉冲数表示),用16位的T0计数,计数器初值*/

uint code dec_time_T0_const[DEC_LEVEL]=

{65463,65463,65460,65458,65455,65452,65449,65446,65443,65440,65436,65433,65429,65425,6 5421,65417,65413,65409,65404,65399,65395,65389,65384,65379,65373,65368,65362,65355,653 49,65342,65335,65328,65321,65313,65305,65297,65289,65280,65271,65261,65251,65251};

/*停机过程各档速度定时器初值,用16位的T2实现*/

uint code stop_pulse_T2_const[STOP_LEVEL]=

{64170,64170,64841,65065,65176,65243,65288,65320,65344,65362,65377,65389,65399,65407,6 5415,65421,65426,65431,65435,65439,65443,65446,65448,65451,65453,65455,65457,65459,654 61,65462,65464,65465,65466,65467,65468,65469,65470,65471,65472,65473,65474,65474};

/*停机过程各档速度减速持续时间(用脉冲数表示),用16位的T0计数,计数器初值*/

uint code stop_time_T0_const[STOP_LEVEL]=

{65463,65463,65460,65458,65455,65452,65449,65446,65443,65440,65436,65433,65429,65425,6 5421,65417,65413,65409,65404,65399,65395,65389,65384,65379,65373,65368,65362,65355,653 49,65342,65335,65328,65321,65313,65305,65297,65289,65280,65271,65261,65251,65251};

uchar idata acc_count, dec_count, input_count, temp_count, done_no,input_order;

uchar idata T0low, T0high, T2low, T2high, key_in;

uint idata interval, pulse_counter, common_count;

/*common_count记录当前T2定时器初值数组序号,即当前转速,不用到处寻找*/

/*关键在那里获得common_count的值,应该在输出速度脉冲定时器的启动程序里找到*/ /*当前转速,在哪里获得?在本程序,应该为T2定时器当前初值,在T0中断服务程序里获得*/

/*加速\减速\停机函数经过处理可以合并为一个函数,但分为独立函数效率高一点*/

uchar bdata sign0,sign1,test_s0, test_s1;

sbit new_speed_in=sign0^0; /*新速度数据从串口输入标志位*/

sbit acc_run_permit=sign0^1; /*允许电机加速标志位*/

sbit dec_run_permit=sign0^2; /*允许电机减速标志位*/

sbit carry_acc=sign0^3; /*执行加速函数标志位*/

sbit carry_dec=sign0^4; /*执行减速函数标志位*/

sbit carry_stop=sign0^5; /*执行停机函数标志位*/

sbit normal_stop=sign0^6; /*调用停机函数标志位*/

sbit test_p=sign0^7; /*串口输入停机指令标志位*/

/*------------------------------------------*/

sbit check_input_spd=sign1^0; /*当前输入转速级别处理函数完毕标志位*/

sbit first_startup=sign1^1; /*电机启动过的标志位*/

sbit address_true=sign1^2; /*从机地址正确标志位*/

sbit print_permit=sign1^3; /*允许输出标志位*/

sbit cmd_in_permit=sign1^4; /*允许主机命令输入标志位*/

/*------------------------------------------*/

sbit P2_0=P2^0; /*作输入步进电机的脉冲信号发送口*/

sbit P2_2=P2^2; /*作输入步进电机的旋转方向信号发送口*/

sbit P1_0=P1^0; /*开机时需要关断串口发送功能,需要时再接通*/

/*作串口输出信号的使能口, P1_0=0时接通串口,输出信号*/

sbit P1_2=P1^2; /*现在作检测位,用仿真机仿真时用该接口*/

sbit P1_5=P1^5; /*作脉冲信号输入T0的发送口*/

sbit P1_6=P1^6; /*作脉冲信号输入T0的使能口*/

sbit WD=P1^7; /*看门狗*/

void ini_down(void); /*初始化硬件函数*/

uchar decide_AccDecStop(void); /*确定加速或减速处理函数*/

void acc_run(void); /*步进电机加速处理函数*/

void dec_run(void); /*步进电机减速处理函数*/

void stop_stepper(void); /*步进电机停机处理函数*/

void check_addr(void); /*地址核对*/

void send_data(void); /*发送数据函数*/

/*======================================================*/

/*定时器任务分配:T2负责输出所需频率脉冲(因T2具有16位自动重装功能),T1负责产生波特率,T0负责输出脉冲数计数*/

/*在硬件上p1_5经过与非门后与P3_4连接,然后把与非门输出脉冲输入T0计数*/

/*这样P3_4的脉冲输入是可控的,需要用MCS 52芯片*/

/*或者用软件定时,但不准确,且占用CPU时间*/

/*定时器2中断的产生取决与TF2 和EXF2的逻辑或。当定时器2 溢出或是遇到捕捉/重装事件时这些标志位会置位。当系统执行定时器2中断服务程序时,这些标志位不会

被硬件清除。软件应当解析定时器2中断的类型并清除相应的标志位。*/

/*======================================================*/

main()

{

test_s0=0;

test_s1=0;

test_s1=0x80;

test_s0=0x0f;

/*=====================================================*/ interval=0;

done_no=0;

pulse_counter=0;

common_count=0;

acc_count=0;

dec_count=0;

temp_count=0;

T0low=0;

T0high=0;

T2low=0;

T2high=0;

new_speed_in=0;

acc_run_permit=0;

dec_run_permit=0;

carry_acc=0;

carry_dec=0;

carry_stop=0;

normal_stop=0;

test_p=0;

check_input_spd=0;

first_startup=0;

print_permit=0;

cmd_in_permit=0;

input_order=0;

P2_0=0;

P2_2=0; /*步进电机的旋转方向待试验后确定*/

P1_0=1; /*开机时需要关断串口发送功能,需要时再接通,作串口输出信号的使能口,P1_0=0时接通串口,输出信号*/

P1_2=0; /*现在作检测位,用仿真机仿真时用该接口*/

P1_5=0;

P1_6=0; /*开机时需要关闭脉冲信号输入T0,需要时再接通,P1_6=1时脉冲信号可以输入T0*/

WD=1; /*看门狗*/

ini_down();

TF2=0; /*T2溢出中断需软件清0*/

/*------------------------------------------------------*/

do{

if(address_true==1)

{

address_true=0;

check_addr();

}

if (print_permit==1)

{

print_permit=0;

send_data();

/*完成数据传送后,才恢复为恢复为多机模式,SM2=1*/

SM2=1;

}

if(normal_stop==1)

{

normal_stop=0;

if(first_startup==1) {stop_stepper();}

}

else if(new_speed_in==1)

{

new_speed_in=0;

/*假定电机从0转速开始运动,开机后电机第一次启动的common_count=1*/ if (check_input_spd==1)

{

check_input_spd=0;

input_count=interval;

/*取得开机后电机第一次启动时,common_count的值*/

if(first_startup==0) {common_count=1;}

}

if ((common_count>=1)||((common_count==1)&&(input_count>=1)))

{

decide_AccDecStop();

/*decide_AccDecStop()承担太多任务,可能返不回来,导成嵌套过多死机*/ /*这是单片机C语言与PC机C语言的区别之一*/

/*decide_AccDecStop()改为“返回执行标志位”*/

}

if(acc_run_permit==1)

{

acc_run_permit=0;

acc_run();

}

if(dec_run_permit==1)

{

dec_run_permit=0;

if(first_startup==1) {dec_run();}

}

}

WD=!WD; /*看门狗喂狗*/

}while(1);

}

/*======================================================*/

void ini_down(void)

{

EA=1; /*开放总中断*/

ES=1; /*开放serial_0中断*/

/*PCON 电源控制,SMOD=0, 串口0波特率不加倍(只对用T1产生波特率时有效)*/ PCON=0x00;

/*SCON = 0xd0;*/ /*SCON 工作方式3, 允许发送,11位,可发送第9位1;与主机通信*/

SCON = 0xd0;

/*多机通信,初始化时,需设置从机的SM2=l,根据运行要求在程序子函数中设置SM2=0*/

/*SM2=0;*/ /*暂时设置从机的SM2=0,与PC机通信必须SM2=0*/

SM2=1; /*设置从机的SM2=1,与主机通信必须SM2=1*/

/*T0在方式1,16位,作外部事件计数器(下降沿触发)*/

/*T1在方式2,8位,常数自动装入*/

TMOD=0x25;

/*TL1=0xfa;*/ /*给serial_0产生波特率,波特率为4.8K, 加倍为9.6K*/

/*TH1=0xfa;*/

TL1=0xfd; /*给serial_0产生波特率,波特率为9.6K, 加倍为19.2K*/

TH1=0xfd;

/*T2MOD=00;*/ /*定时器2:T2OE=0 输出使能位无效;DCEN=0 向上计数器*/ T2MOD=00;

/*T2CON中的C/T2=0,T2作内部定时器*/

/*CP/RL2=0,RCLK=0, TCLK=0,16位自动重装初始值*/

T2CON=0x00;

EX0=0; /*允许INT0中断*/

IT0=1; /*INT0为边沿触发*/

EX1=0; /*允许INT1中断*/

IT1=1; /*INT1为边沿触发*/

PS=1; /*PS(IP.4)(----BCH)串口中断优先级别控制位,PS=1串口中断为高优先级别*/

/*注:主程序需要定时器中断服务,所以开放定时器中断*/

ET0=0; /*关闭T/C0中断*/

ET2=0; /*关闭T/C2中断*/

TR1=1; /* TCON 启动定时器1*/

/*T0作步进电机步数计数器,启动T/C0在主程序里设置*/

TR0=0; /*停止T/C0*/

/*T2作步进电机脉冲发生器,启动T/C2在主程序里设置*/

TR2=0; /*停止T/C2*/

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/

void inte_SERIAL() interrupt 4 using 1 /*串口0中断服务子程序*/

/*接收主机地址,核对,才接受指令*/

/*调试期间先简化程序,不核对地址,直接接收指令*/

{

uchar idata i ;

key_in=0;i=0;

if(RI)

{

key_in=SBUF;

RI=0;

if (SM2==1)

{ /*SM2=1,必须有RB8=1串口才中断*/

/*SM2=1,为多机模式, 接收主机地址*/

/*接收到的字节为地址*/

/*接收的地址与本机地址比较,判断是否一致*/

if(key_in==slave_addr[2])

{ /*确认地址完毕,设置SM2=0,进入单机模式*/

SM2=0;

address_true=1;

}

}

if ((SM2==0)&& (RB8==0))

{ /*SM2=0,RB8=1或RB8=0串口都中断*/

/*SM2=0,为单机模式, 接收主机数据*/

/*接收到的字节为数据*/

/*接收主机指令完毕,必须在从机完成任务后,才恢复为多机模式,设置SM2=1*/

if(key_in==0xff){SM2=1;} /*接收主机命令,使从机设置为多机模式*/

if(key_in==0xfe)

{ /*接收主机命令引导字节,准备接收主机命令*/

cmd_in_permit=1;

}

if(cmd_in_permit==1)

{

input_order=input_order+1;

}

if (input_order==2)

{ /*接收主机命令,使从机开始调节电机*/

cmd_in_permit=0;

input_order=0;

/*interval代表控制器发给电机的转速期望值*/

interval= key_in ;

if(interval==0) {normal_stop=1; }

/*太多开关量,会有问题*/

new_speed_in=1;

check_input_spd=1;

print_permit=1;

}

}

}

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/

uchar decide_AccDecStop(void)

{

/*当前转速,在哪里获得?(应该为T2定时器当前初值)*/

/*应该在输出速度脉冲定时器的启动程序里找到*/

if(input_count>=1)

{

temp_count=common_count;

/*开机第一次运行时的处理??*/

if (input_count==common_count)

{

/*开机第一次运行时,会有问题吗?经过试验,没有*/

dec_run_permit=0;

acc_run_permit=0;

}

else if(input_count >=common_count)

{

acc_count=input_count-common_count; /*加速时,需要增加T2初值*/

acc_run_permit=1;

}

else {

if (input_count <=common_count)

{

/*由于当前输入转速级别的判别用加速序列求出,但加速序列与减速序列不同*/

/*所以dec_count的计算应有所不同*/

dec_count=common_count-input_count;

dec_run_permit=1;

}

}

}

if(((input_count==1)&&(first_startup==1))||((input_count==1)&&(common_count>1))) {

normal_stop=1;

}

WD=!WD; /*看门狗喂狗*/

return 0;

}

/*======================================================*/

void acc_run(void) /*步进电机加速处理函数*/

{

uint y1,y2;

y1=acc_pulse_T2_const[common_count];

/*设置脉冲周期定时器T2初值,确定每档步进电机转速*/

T2high = (uchar)(y1>>8) ; /*取y1的高8位*/

T2low = (uchar)(y1&0x00ff); /*取y1的低8位*/

TR2 = 0 ;

ET2=0; /*关闭T/C2中断*/

TH2=T2high; /*高8位T2high送定时器2的TH2*/

TL2=T2low; /*低8位T2low送定时器2的TL2*/

RCAP2H=T2high; /*高8位T2high送定时器2的RCAP2H*/

RCAP2L=T2low; /*低8位T2low 送定时器2的RCAP2L*/

/*设置脉冲周期定时器T0初值,确定每档转速步进电机步数*/

y2=acc_time_T0_const[common_count];

T0high = (uchar)(y2>>8) ; /*取y2的高8位*/

T0low = (uchar)(y2&0x00ff); /*取y2的低8位*/

TR0 = 0;

ET0 = 0; /*关闭T/C0中断*/

TH0=T0high; /*高8位T0high送定时器0的TH0*/

TL0=T0low; /*低8位T0low送定时器0的TL0*/

/*由acc_run()启动T2一次,余下由T0中断服务子启动T2*/

TR2 = 1;

ET2=1; /*允许T/C2中断*/

/*由acc_run()启动T0一次,余下由T0中断服务子启动T0*/

TR0 = 1;

ET0=1; /*允许T/C0中断*/

P1_6=1;

common_count++;

acc_count--;

carry_acc=1;carry_dec=0; carry_stop=0;

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/ void dec_run(void) /*步进电机减速处理函数*/

{

uint y1, y2;

y1=dec_pulse_T2_const[common_count];

/*设置脉冲周期定时器T2初值,确定步进电机转速*/

T2high = (uchar)(y1>>8) ; /*取y1的高8位*/

T2low = (uchar)(y1&0x00ff); /*取y1的低8位*/

TR2 = 0 ;

ET2=0; /*关闭T/C2中断*/

TH2=T2high; /*高8位T2high送定时器2的TH2*/

TL2=T2low; /*低8位T2low送定时器2的TL2*/

RCAP2H=T2high; /*高8位T2high送定时器2的RCAP2H*/

RCAP2L=T2low; /*低8位T2low 送定时器2的RCAP2L*/

y2=dec_time_T0_const[common_count];

T0high = (uchar)(y2>>8) ; /*取y2的高8位*/

T0low = (uchar)(y2&0x00ff); /*取y2的低8位*/

TR0 = 0;

ET0=0; /*关闭T/C0中断*/

TH0=T0high; /*高8位T0high送定时器0的TH0*/

TL0=T0low; /*低8位T0low送定时器0的TL0*/

/*由dec_run()启动T2一次,余下由T0中断服务子启动T2*/

TR2 = 1;

ET2=1; /*允许T/C2中断*/

/*由dec_run()启动T0一次,余下由T0中断服务子启动T2*/

TR0 = 1;

ET0=1; /*允许T/C0中断*/

P1_6=1;

common_count--;

dec_count--;

carry_acc=0; carry_dec=1; carry_stop=0;

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/ void stop_stepper(void) /*步进电机停机处理函数*/

{

uint y1, y2;

y1=stop_pulse_T2_const[common_count];

/*设置脉冲周期定时器T2初值,确定步进电机转速*/

T2high =(uchar)(y1>>8) ; /*取y1的高8位*/

T2low =(uchar)(y1&0x00ff); /*取y1的低8位*/

TR2 = 0 ;

ET2=0; /*关闭T/C2中断*/

TH2=T2high; /*高8位T2high送定时器2的TH2*/

TL2=T2low; /*低8位T2low送定时器2的TL2*/

RCAP2H=T2high; /*高8位T2high送定时器2的RCAP2H*/

RCAP2L=T2low; /*低8位T2low 送定时器2的RCAP2L*/

y2=stop_time_T0_const[common_count];

T0high = (uchar)(y2>>8) ; /*取y2的高8位*/

T0low = (uchar)(y2&0x00ff); /*取y2的低8位*/

TR0 = 0;

ET0=0; /*关闭T/C0中断*/

TH0=T0high; /*高8位T0high送定时器0的TH0*/

TL0=T0low; /*低8位T0low送定时器0的TL0*/

/*由stop_stepper()启动T2一次,余下由T0中断服务子启动T2*/

TR2 = 1;

ET2=1; /*允许T/C2中断*/

/*由stop_stepper()启动T0一次,余下由T0中断服务子启动T2*/

TR0 = 1 ;

ET0=1; /*允许T/C0中断*/

P1_6=1;

common_count--;

carry_acc=0; carry_dec=0; carry_stop=1;

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/

void timer0(void) interrupt 1 using 3 /*定时计数器0中断服务子程序*/

/*T0负责对输出脉冲数进行计数,确定每级加(减)速的时间(用脉冲步数计算)*/

/*这段程序是最关键的*/

{

uint y1, y2, y3, y4;

pulse_counter=0;

if(carry_acc==1)

{

if(acc_count>=1)

{

/*common_count记录当前T2定时器初值数组序号,即当前转速*/

/*加速时,要求common_count<=T2定时器初值数组序号最大有效值,即

UP_LEVEL*/

/*C语言数组编号从0开始*/

acc_count--; /*这里考虑了要加速的级数*/

common_count++;

if(common_count>=UP_LEVEL)

{

common_count=UP_LEVEL;

}

if(acc_count==0) { P1_6=0;}

}

else {

if (acc_count==0) {P1_6=0;}

} /*用于只加速一档的情况*/

y3=acc_pulse_T2_const[common_count];

/*设置脉冲周期定时器T2初值,确定步进电机转速*/

T2high = (uchar)(y3>>8) ; /*取y3的高8位*/

T2low = (uchar)(y3&0x00ff); /*取y3的低8位*/

TR2=0;

ET2=0; /*关闭T/C2中断*/

TH2=T2high; /*高8位T2high送定时器2的TH2*/

TL2=T2low; /*低8位T2low送定时器2的TL2*/

RCAP2H=T2high; /*高8位T2high送定时器2的RCAP2H*/

RCAP2L=T2low; /*低8位T2low 送定时器2的RCAP2L*/

TR2=1;

ET2=1; /*允许T/C2中断*/

y1=acc_time_T0_const[common_count];

T0high = (uchar)(y1>>8) ; /*取y1的高8位*/

T0low = (uchar)(y1&0x00ff); /*取y1的低8位*/

TR0 = 0;

ET0=0; /*关闭T/C0中断*/

TH0=T0high; /*高8位T0high送定时器0的TH0*/

TL0=T0low; /*低8位T0low送定时器0的TL0*/

TR0 = 1;

ET0=1; /*允许T/C0中断*/

}

if(carry_dec==1)

{

if(dec_count>=1)

{

/*common_count记录当前T2定时器初值数组序号,即当前转速*/

/*减速时,要求common_count>=T2定时器初值数组序号最小有效值,即1*/

common_count--;

dec_count--; /*这里考虑了要减速的级数*/

if(common_count<=DOWN_LEVEL) {common_count=DOWN_LEVEL; }

if(dec_count==0) { P1_6=0; }

}

else { if (dec_count==0) {P1_6=0;}} /*用于只减速一档的情况*/

y4=dec_pulse_T2_const[common_count];

/*设置脉冲周期定时器T2初值,确定步进电机转速*/

T2high = (uchar)(y4>>8) ; /*取y4的高8位*/

T2low = (uchar)(y4&0x00ff); /*取y4的低8位*/

TR2=0;

ET2=0; /*关闭T/C2中断*/

TH2=T2high; /*高8位T2high送定时器2的TH2*/

TL2=T2low; /*低8位T2low送定时器2的TL2*/

RCAP2H=T2high; /*高8位T2high送定时器2的RCAP2H*/

RCAP2L=T2low; /*低8位T2low 送定时器2的RCAP2L*/

TR2=1;

ET2=1; /*允许T/C2中断*/

y2=dec_time_T0_const[common_count];

T0high = (uchar)(y2>>8) ; /*取y2的高8位*/

T0low = (uchar)(y2&0x00ff); /*取y2的低8位*/

TR0 = 0 ;

ET0=0; /*关闭T/C0中断*/

TH0=T0high; /*高8位T0high送定时器0的TH0*/

TL0=T0low; /*低8位T0low送定时器0的TL0*/

TR0 = 1 ;

ET0=1; /*允许T/C0中断*/

}

if(carry_stop==1)

{

if(common_count>=1)

{

common_count--;

y1=stop_pulse_T2_const[common_count];

/*设置脉冲周期定时器T2初值,确定步进电机转速*/

T2high =(uchar)(y1>>8) ; /*取y1的高8位*/

T2low =(uchar)(y1&0x00ff); /*取y1的低8位*/

TR2 = 0 ;

ET2=0; /*关闭T/C2中断*/

TH2=T2high; /*高8位T2high送定时器2的TH2*/

TL2=T2low; /*低8位T2low送定时器2的TL2*/

RCAP2H=T2high; /*高8位T2high送定时器2的RCAP2H*/

RCAP2L=T2low; /*低8位T2low 送定时器2的RCAP2L*/

TR2 = 1 ;

ET2=1; /*允许T/C2中断*/

y2=stop_time_T0_const[common_count];

T0high = (uchar)(y2>>8) ; /*取y2的高8位*/

T0low = (uchar)(y2&0x00ff); /*取y2的低8位*/

TR0 = 0 ;

ET0=0; /*关闭T/C0中断*/

TH0=T0high; /*高8位T0high送定时器0的TH0*/

TL0=T0low; /*低8位T0low送定时器0的TL0*/

TR0 = 1 ;

ET0=1; /*允许T/C0中断*/

}

if(common_count<=1)

{

common_count=1;

TR0 = 0; ET0=0; /*关闭T/C0中断*/

TR2 = 0; ET2=0; /*关闭T/C2中断*/

carry_acc=0; carry_dec=0; carry_stop=0;

P1_6=0;

}

}

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/ void timer2(void) interrupt 5 using 2 /*定时计数器2中断服务子程序*/

/*T2负责输出所需频率脉冲,但不对输出脉冲数进行计数*/

/*定时计数器2中断编号=5*/

{

TF2=0; /*T2溢出中断需软件清0*/

P2_0=~P2_0; /*脉冲发送步进电机*/

P1_5=~P1_5; /*脉冲发送T0*/

first_startup=1;

/*---------------用软件计算加减速的步数-------------*/

/*T0每两次中断,才是一个脉冲,pulse_counter作输出脉冲计数*/

/*if(p2_0==1) {pulse_counter++;} /*不需考虑用T0作脉冲计数时*/

/*---------------用软件计算加减速的步数-------------*/

/*以下改用定时器T0计算加减速的步数,在每次T0中断时,置pulse_counter=0*/ if(P1_5==1) {pulse_counter++;} /*不需考虑用T0作脉冲计数时*/

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/

void interint1(void) interrupt 2 /*外部中断1服务子程序*/

/*电机故障,需要停机与反馈信息给主机,由INT0中断输入*/

/*需要解决从机主动与主机通信的问题,也可以对主机设置相应的地址解决*/

/*这样不存在谁是主机、从机的问题?*/

{

uchar i;

/*紧急停机*/

TR0=0; ET0=0; /*关闭T/C0中断*/

TR2=0; ET2=0; /*关闭T/C2中断*/

/*反馈信息给主机*/

P1_0=0;

/*这里需要加入延时,否则没有足够时间打开模拟开关*/

/*各从机的延时要一致*/

for(i=0;i<=25;i++) {_nop_();}

SBUF=0xff;

do{} while(TI==0); TI=0;

SBUF=0xff;

do{} while(TI==0); TI=0;

SBUF=0xff;

do{} while(TI==0); TI=0;

P1_0=1;

/*这里需要加入延时,否则没有足够时间关闭模拟开关*/

/*各从机的延时要一致*/

for(i=0;i<=25;i++) {_nop_();}

WD=!WD; /*看门狗喂狗*/

}

/*======================================================*/

void check_addr(void)

{ /*地址核对成功,发送从机地址给主机*/

uchar i=0;

TB8=1;

RB8=0;

P1_0=0;

/*这里需要加入延时,否则没有足够时间打开模拟开关*/

/*各从机的延时要一致*/

for(i=0;i<=25;i++) {_nop_();}

SBUF=slave_addr[2]; /*发送地址核对成功,发送从机地址给主机*/

do{} while(TI==0); TI=0;

P1_0=1;

/*这里需要加入延时,否则没有足够时间关闭模拟开关*/

/*各从机的延时要一致*/

for(i=0;i<=25;i++) {_nop_();}

TB8=0;

WD=!WD; /*看门狗喂狗*/

}

/*数据发送用子函数处理,不会造成中断嵌套*/

/*======================================================*/ void send_data(void)

{

uchar i;

P1_0=0;

/*这里需要加入延时,否则没有足够时间打开模拟开关*/

/*各从机的延时要一致*/

for(i=0;i<=25;i++) {_nop_();}

for(i=0;i<=1;i++)

{

TI=0; SBUF=c2[i];

while(TI==0);TI=0;

}

P1_0=1;

/*这里需要加入延时,否则没有足够时间关闭模拟开关*/

/*各从机的延时要一致*/

for(i=0;i<=25;i++) {_nop_();}

P1_2=~P1_2;

WD=!WD; /*看门狗喂狗*/

/*只能发送两个数据给主机,否则主机程序要修改*/

}

步进电机角度控制设计

目录 摘要 (1) 1设计任务与要求 (2) 1.1设计目的 (2) 1.2设计要求和设计指标 (2) 2方案分析 (3) 3系统硬件部分 (4) 3.1主控模块 (4) 3.2键盘输入模块 (7) 3.3电机模块 (8) 3.4显示模块 (11) 4系统软件部分 (13) 4.1整体流程图及主程序 (13) 4.2按键流程图及程序 (14) 4.3显示模块程序 (19) 4.4电动机模块流程图及程序 (20) 4.5中断程序 (22) 5仿真运行 (24) 6心得体会 (25) 参考文献 (26) 附录一:Protues硬件仿真图 (27) 附录二:系统程序 (27)

摘要 步进电机在控制系统中具有很广泛的应用。它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器或角位移发生器等。 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 此次设计使用C语言作为编程语言。C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件、三维、二维图形和动画,具体应用例如单片机以及嵌入式系统开发。 硬件部分使用89C51作为主控芯片,并使用ULN2003A将单片机的信号放大以控制步进电机,同时使用4位数码管显示转动角度及次数。 关键词:步进电机C语言AT89C51 ULN2003A 转动角度

单片机控制步进电机和数码管显示

一、设计任务书 设计内容:用80C51单片机设计一个步进电机控制器 设计要求: 1.用8015设计一个四相步进电机。 2.可控制步进电机的启动与停止,正转与反转。 3.10档速度调节。 4.点动控制。 5.可显示电机运行参数。 二、设计总体方案 (一)控制方式的选择 控制主要用于电机速度和方向的转换。控制方式有按键控制和开关控制两种。按键较开关而言,操作更加简便,故选按键控制。 方案一:独立按键。独立按键可自由连接,线路简单。 方案二:编码式键盘。编码式键盘的按键接触点接于74LS148芯片。当键盘上没有闭合时,所有按键都断开,当某一键闭合时,该键对应的编码由74LS148输出。 本次设计所需按键不多,不需要采用复杂编码,考虑硬件条件、线路连接和经济性等方面,选择方案一。 (二)电机电路设计方案的选择 由于条件的限制,对于电机的选择只能是实验台上最小步距角18°的电机,其中已包含了驱动电路。 (三)单片机的选择 方案一:AT89C51高性能8位单片机,内部集成CPU、存储器、寄存器、I/O接口,从而构成较为完整的计算机,价格便宜。 方案二:C8051F005单片机,该单片机是完全集成的混合信号系统及芯片,具有8051兼容的微控制器内核,与MCS-51指令集完全兼容。除了具有标准8052的数字外设部件,片内还继承了数据采集和控制系统中常用的模拟部件和其他数字外设及功能部件,执行速度快,但价格较贵。 本次课程设计是在仿真环境下进行,没有太过考虑单片机选择的问题,但就设计本身来讲,从物美价廉的角度考虑,选择方案一较合适。 (四)显示方案的选择 方案一:采用LED数码管。LED数码管是轮流现实的,其利用人烟的视觉暂留特性,使人感觉不到数码管闪动,看到每只数码管都常亮。利用其显示必须不停给数码管数据输入口循环赋值,显示内容较多,编程和接线较为复杂。 方案二:采用LCD1602液晶显示器。LCD1602具有功率小,效果明显,变成容易等优点,且它最多能显示2×16个字符,可以轻松满足设计要求。 由上可知,LCD1602液晶显示器的优点突出,故选择方案二。 (五)软件部分的选择 软件部分的选择主要是指编程语言的选择,编译调试工具根据设计平台选择伟福软件。编程语言主要有以下两种方案。

微机原理课程设计 步进电机的正反转及调速控制分解

课程设计报告 题目步进电机正反转及调速 控制系统的设计 课程名称微机原理及应用 院部名称机电工程学院 专业电气工程及其自动化班级10电气1班 学生姓名管志成 学号1004103027 课程设计地点C304 课程设计学时20 指导教师李国利 金陵科技学院教务处制

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件,具有快速启动能力,定位精度高,能够直接接受数字量,因此被广泛地应用于数字控制系统中,如数模转换装置、精确定位、计算机外围设备等,在现代控制领域起着非常重要的作用。 本设计基于Proteus 7.8设计环境,运用了8086 CPU芯片以及74273芯片、74244芯片和步进电机以及7位小功率驱动芯片ULN2003A、按钮、指示灯等辅助硬件电路,设计了步进电机正反转及调速系统。绘制软件流程图,进行了软件设计并编写了源程序,最后对软硬件系统进行联合调试。该步进电机的正反转及调速系统具有控制步进电机正反转的功能,还可以对步进电机进行调速,不同的按钮对应不同的速度,并且在没有速度按钮按下的时候,步进电机自动切换到停止状态。 关键词:步进电机;正反转;调速控制;ULN2003A芯片;8086微机系统

一、概述 1.1 课程设计的目的 (4) 1.2课程设计的要求 (4) 二、总体设计方案及说明 2.1 系统总体设计方案 (5) 2.2系统工作框图 (5) 三、系统硬件电路设计 3.1 Intel 8086 微处理器的简介 (6) 3.2 步进电机的原理 (7) 3.3 ULN2003A的简介 (8) 3.4 74154芯片简介 (9) 3.5 74LS273芯片简介 (10) 3.6 8086最小系统的设计 (11) 3.7 步进电机及其驱动电路的设计 (12) 3.8 电机状态显示电路的设计 (12) 3.9 输入采样电路的设计 (13) 3.10系统总电路图 (14) 四、系统软件部分设计 4.1 系统流程图 (15) 4.2 系统软件源程序 (16) 4.2.1电机绕组通电顺序设定 (16) 4.2.2 延时子程序设计 (16) 4.2.3 汇编源程序及说明 (16) 五、总结 5.1 系统软硬件的联合调试 (21) 5.2 问题分析和解决方案 (23) 5.3 心得与体会 (23) 六、参考文献 (23) 附录:总电路图 (25)

基于51系列单片机控制步进电机调速实验 (自动保存的)

基于51系列单片机控制步进电机调速实验 实验指导书 仇国庆编写 重庆邮电大学自动化学院 自动化专业实验中心 2009年2月

基于51系列单片机控制步进电机调速实验 实验目的及要求: 1、熟悉步进电机的工作原理 2、熟悉51系列单片机的工作原理及调试方法 3、设计基于51系列单片机控制的步进电机调速原理图(要求实现电机的速度反馈测量,测量方式:数字测量) 4、实现51系列单片机对步进电机的速度控制(步进电机由实验中心提供,具体型号42BYG )由按钮控制步进电机的启动与停止;实现加速、匀速、和减速控制。速度设定由键盘设定,步进电机的反馈速度由LED 数码管显示。 实验原理: 步进电机控制原理 一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机。步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。因此步进电动机是一种把脉冲变为角度位移(或直线位移)的执行元件。步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。由于输入的是脉冲信号,输出的角位移是断续的,所 以又称为脉冲电动机。随着数字控制系统的发展,步进电动机的应用将 逐渐扩大。 步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来 进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由 脉冲信号频率决定。步进电机的驱动电路根据控制信号工作,控制信号 可以由单片机产生。 电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几 何轴线依次分别与转子齿轴线错开。0、1/3て、2/3て,(相邻 两转子齿轴线间的距离为齿距以て表示),即A与齿1相对齐, B与齿2向右错开1/3て,C与齿3向右错开2/3て,A'与齿5相对齐,(A'就是A,齿5就是齿1)下面是定转子的展开图:(图2所示)

步进电机控制电路设计

黄冈职业技术院 系别:04 机电工程系 专业: 应用电子 班级:二班 设计者:戴久志、邓修海、徐凯 指导老师: 温锦辉 设计课题: 液晶8279步进电机系统 设计时间: 二00七年六月二十号

步进电机控制电路设计 1、系统基本方案 根据设计要求,步进电机控制电路可以分为控制模块、显示模块、电源模块、键盘模块、电机驱动模块、步进电机部分。步进电机控制电路基本模块方框图如图1.1所示。 2、系统硬件设计与实现 2.1、步进电机介绍 随着工业技术的不断进步,在自动化控制、精密机械加工、航空航天技术及所有要求高精度定位等高新技术领域,步进电机的得到了广泛的应用。步进电机是一种将脉冲信号转化为角位移的执行机构。若在其输入端加入有规律的脉冲信号,就能驱动步进电机按设定的方向移动一定的距离或转动一个角度(称为“步距角”)。从结构上步进电机分为单相、双相、三相、四相、五相、六相等多种。本次设计使用步进电机分为A、B、C、D四相绕组,每相通电一次称为一拍。四相步进电机根据不同的通电规律可分为几种工作模式: ⑴、四相单四拍:A-B-C-D; ⑵、四相双四拍:AB-BC-CD-DA; ⑶、四相单八拍:A-AB-B-BC-C-CD-D-DA; ⑷、四相双八拍:AB-ABC-BC-BCD-CD-CDA-DA-DAB。 步进电机的正反转与电机每相的通电顺序有关,可以改变相序来改变电机的正反转。步进电机每步所旋转角度的大小,称为步距角(βB)。它是由电机本身转子的齿数(Z R)。

一个通电循环内通电节拍数(M Q)决定的。即βB=360/ Z R M Q。电机出厂的步距角是固定的。四相步进电机的步距角为0.90/1.80(表示半步工作时为0.90,整步工作时为1.80)。步进电机转速的高低与控制脉冲频率有关。改变控制脉冲频率,可改变电机转速。 2.2、步进电机驱动模块 步进电机的驱动电路采用常用的电动机驱动芯片L298,它能够接受标准的TTL电平控制信号,驱动电机。L298操作时能提供的电压能达到46V,直流电流4A,具有过热保护功能,逻辑“0”的输入电压达到1.5V。L298在控制器的控制下驱动一个步进电动机,控制器产生L298年需的控制信号,以控制步进电机的运动状态。为了防止定子绕组的电感作用,使得电流切换时产生过电压,步进电机每相绕组两端都须并联一个用天在换相时起续流作用的肖基特二极管。步进电机驱动电路原理图如图2.2.1所示。

基于单片机的步进电机控制系统

编号: 综合智能电子 实训 (论文)说明书题目: 院(系):使用科技学院 专业:电子信息工程 学生姓名: 学号: 指导教师: 2010年 1 月 6 日

目录 引言 第1章简介 1.1 步进电机 第2章步进电机原理 2.1 步进电机的工作原理 2.1.1结构及基本原理 2.1.2 电机的步进顺序 第3章系统的硬件设计 3.1 系统设计方案 3.2 主从机硬件部件介绍 3.2.1A T89S51简介 3.2.2 TGI2864E简介 3.2.3MAX485 串行通信 3.2.4TIP122 3.2.5 MOC70T2 3.3 LCD显示电路设计 3.4 电机驱动模块设计 第4章系统的软件实现 4.1 系统软件主流程图 4.2 系统初始化流程图 4.3 部分子程序 第五章总结 致谢 参考文献 摘要:本文使用单片机、步进电机驱动芯片、字符型LCD和键盘阵列,构建了集步进电机控制器和驱动器为一体的步进电机控制系统。二维工作台作为被控对象通过步进电机驱动滚珠丝杆在X/Y轴方向联动。文中讨论了一种以最少参数确定一条圆弧轨迹的插补方法和步进电机变频调速的方法。步进电机控制系统的开发采用了软硬件协同仿真的方法,可以有效地减少系统开发的周期和成本。最后给出了步进电机控制系统的使用实例。

关键词:步进电机控制系统,插补算法,变频调速,软硬件协同仿真 In this paper, microcontroller, stepper motor driver chips, character LCD and keypad array, build a set of stepper motor controller and driver as one of the stepping motor control system. Two-dimensional table as a charged object by stepper motor drive ball screw in X / Y axis linkage. This paper discusses a minimum of parameters to determine the trajectory of a circular interpolation method and the method of frequency control stepper motor. Stepper motor control system has been developed using the software and hardware co-simulation method, can effectively reduce the system development cycle and cost. Finally, the stepper motor control system application examples.

基于单片机的步进电机驱动控制

基于单片机的步进电机驱动控制 一、步进电机概述 1.步进电机的定义 步进电机指的是以数字脉冲信号作为电机线或教位移的控制信号,并以数字脉冲频率对电机的转速进行控制的动力控制系统。 在负载正常范围的情况下,步进电机的运行状态只和数字脉冲发生器提供的信号的频率和脉冲占空比有关,一般情况下,电机的状态不受负载的影响。电机的运行角度只和每次所给予的脉冲信号强度有关,而电机的运行速度也只和脉冲信号的频率有直接关 系。这种采用弱点控制强电的控制方式使得步进电机在速度、位移等控制领域有着普通电机不能比拟的优势。 2.驱动控制系统框图 步进电机控制系统有着精确控制、运行稳定的特性,这一其他电机不能比拟的优势使得步进电机得到了广泛的应用。而一般对步进电机控制系统的驱动必须要包含脉冲信 号发生部分,功放部分和驱动控制部分等几个模块电路,我们根据这些通过的模块电路,可将步进电机控制系统的通用框图绘制如下: 在上图的步进电机驱动控制系统方框图中,控制步进电机运行状态的脉冲信号一 般由集成芯片产生,可以是单片机、等智能芯片,也可以是一般的数字电路集成芯片。信号分配环节则要根据步进电机的型号来选择,如四相步进电机有四相四拍和四相 八拍种信号分配的方式;两相步进电机有两相四拍和八拍等脉冲加载形式。功放部分 在驱动环节上显得尤为重要。动态平均电流是步进电机转矩大小的决定因素,前提条件 是电机的速度。电机力矩与平均电流成正比,驱动系统对电机的反电势消弱越多,则平 均电流就越大。 我们一般可以用恒压和恒压串电阻的方法来驱动,或者在条件允许的情况下我们可以用高低压驱动、恒流和细分数等方法来驱动实际的应用过程种,多采用数字集成驱 动芯片作为步进电机的驱动手段。 二、现阶段国内外步进电机驱动的常用方式 1.变频器控制方式 使用变频器对步进电机进行驱动控制时,可以很好的解决步进电机在启动和停止时 容易失步的问题,提高了系统的控制精度。但是变频器的应用成本较高,结构和操作也 比较复杂,无形中提高步进电机的控制难度。 2.PLC控制方式 使用ABB、西门子、欧姆龙等国际知名生产制造商研发的系列产品可以 实现对步进电机的理想化控制,但是基于核心的步进电机控制系统成本高昂,且 难以实现精确控制,在本系统中不太适合。 3.单片机控制方式 随着嵌入式系统在工业控制领域中的广泛应用,以单片机特别是系列单片机 作为控制核心的步进电机控制电路在生产生活领域得到了普及,单片机有着大规模数字

完整的单片机控制步进电机程序

#include "reg52.h" #include "INTRINS.H" #include #include #define uint unsigned int #define uchar unsigned char void check_addr(void); /*地址核对*/ uchar code slave_addr[4]={00, 01, 02, 255}; /*从机地址*/ uchar idata T0low, T0high,common_count,input_order,cmd_in_permit,interval; uchar sent_ok,speed_change,start_up,start_end,address_true,i; uint y1; uint code add[100]={60006,62771,63693,64154,64430,64614,64746,64845,64922,64983,65033,65075,651 11,65141,65167,65190,65211,65229,65245,65260,65273,65285,65296,65306,65315,65323,65331 ,65339,65345,65352,65358,65363,65368,65373,65378,65382,65387,65390,65394,65398,65401,6 5404,65407,65410,65413,65416,65418,65421,65423,65425,65428,65430,65432,65434,65435,654 37,65439,65441,65442,65444,65445,65447,65448,65450,65451,65452,65453,65455,65456,65457 ,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65469,65470,6 5471,65472,65472,65473,65474,65475,65475,65476,65477,65477,65478,65478,65479,65480,654 80,65481}; sbit P2_0=P2^0; /*作输入步进电机的脉冲信号发送口*/ sbit P2_2=P2^2; /*作输入步进电机的旋转方向信号发送口*/ sbit P1_0=P1^0; /*作串口输出信号的使能口, P1_0=0时接通串口,输出信号*/ sbit WD=P1^7; /*看门狗*/ main() { P2_0=0; P2_2=0; /*步进电机的旋转方向待试验后确定*/ P1_0=1; /*开机时需要关断,串口发送功能,需要时再接通*/ WD=1; /*看门狗先为1,电平翻转为喂狗*/ i=0; common_count=0; cmd_in_permit=0; input_order=0; interval=0; address_true=1; speed_change=0; start_up=0;

步进电机控制系统设计

文理学院芙蓉学院课程设计报告 课程名称:专业综合课程设计 专业班级:自动化1001班学号:40 学生:志航 指导教师:建英 完成时间: 2013年 6月13 日 报告成绩: 芙蓉学院教学工作部制

摘要 本文先介绍了混合式步进电机的结构和工作原理,分析了细分驱动对于改善步进电机运行性能的作用,论述了正弦波细分驱动可以实现等步距角、等力矩均匀细分驱动的原理,提出了一种基于H桥和其他分立元件分配脉冲的驱动技术,该方案可实现步进电机的单拍、半拍、双拍三种工作方式。本文采用控制电路主要由AT89C51单片机、晶振电路、地址锁存器、译码器、液晶显示电路组成,单片机是控制系统的核心。文中对整个系统的架构及硬件电路和驱动软件的实现都做了详细的介绍。 关键词:单片机;正弦脉宽调制;混合式步进电机;细分驱动

Abstract In this paper, the working principle and configuration of three-phase hybrid Stepper are introduced, then based on technologies such as stepper motor controller, PWM inverter and microcontroller. In the thesis, we develop a single chip computer -based digital controlling system for a three-phase hybrid stepper motor that is mainly constructed from a AT89C51 single chip computer and ST7920IC which is used as the core of control parts. The system's whole architecture, the design of hardware and software are introduced in detail. KEY WORDS: Microcontroller,SPWM,Hybrid stepper motor,Micro-stepping driver

51单片机控制四相步进电机解析

51单片机控制四相步进电机 2009年07月21日星期二 12:44 51单片机控制四相步进电机 2009-03-01 18:53 接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任务就是搞定步进电机的单片机控制。以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下 图所示: 详细内容: https://www.doczj.com/doc/b113227657.html,/31907887_d.h tml

拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。地线与四线接触的顺序相反,电机的转向也相反。 如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四

线脉冲电流的顺序,则可实现对转向的控制。所以,设计了如下电路图: C51程序代码为: 代码一 #include static unsigned int count; static unsigned int endcount; void delay(); void main(void)

步进电机控制系统设计.

毕业设计论文 论文题目:基于单片机的步进电机控制电路板设计 摘要 随着微电子和计算机技术的发展,步进电机的需求量与日俱增,它广泛用于打印机、电动玩具等消费类产品以及数控机床、工业机器人、医疗器械等机电产品中,其在各个国民经济领域都有应用。研究步进电机的控制系统,对提高控制精度和响应速度、节约能源等都具有重要意义。 步进电机是一种能将电脉冲信号转换成角位移或线位移的机电元件,步进电机控制系统主要由步进控制器,功率放大器及步进电机等组成。采用单片机控制,用软件代替上述步进控制器,使得线路简单,成本低,可靠性大大增加。软件编程可灵活产生不同类型步进电机励磁序列来控制各种步进电机的运行方式。 本设计是采用AT89C51单片机对步进电机的控制,通过IO口输出的时序方波作为步进电机的控制信号,信号经过芯片ULN2003驱动步进电机;同时,用 4个按键来对电机的状态进行控制,并用数码管动态显示电机的转速。 系统由硬件设计和软件设计两部分组成。其中,硬件设计包括AT89C51单片机的最小系统、电源模块、键盘控制模块、步进电机驱动(集成达林顿ULN2003)模块、数码显示(SM420361K数码管)模块、测速模块(含霍尔片UGN3020)6个功能模块的设计,以及各模块在电路板上的有机结合而实现。软件设计包括键盘控制、步进电机脉冲、数码管动态显示以及转速信号采集模块的控制程序,最终实现对步进电机转动方向及转动速度的控制,并将步进电机的转动速度动态显示在LED数码管上,对速度进行实时监控显示。软件采用在Keil软件环境下编辑

************* 第1章绪论 1.1 课题背景 当今社会,电动机在工农业生产、人们日常生活中起着十分重要的作用。步进电机是最常见的一种控制电机,在各领域中得到广泛应用。步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。 随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,其优点是结构简单、运行可靠、控制方便。尤其是步距值不受电压、温度的变化的影响、误差不会长期积累的特点,给实际的应用带来了很大的方便。它广泛用于消费类产品(打印机、照相机、雕刻机)、工业控制(数控机床、工业机器人)、医疗器械等机电产品中。研究步进电机的控制和测量方法,对提高控制精度和响应速度、节约能源等都具有重要意义。控制核心采用C51芯片,它以其独特的低成本,小体积广受欢迎,当然其易编程也是不可多得的优点为此,本文设计了一个单片机控制步进电机的控制系统,可以实现对步进电机转动速度和转动方向的高效控制。 1.2 设计目的及系统功能 本设计的目的是以单片机为核心设计出一个单片机控制步进电机的控制系统。本系统采用AT89C51作为控制单元,通过键盘实现对步进电机转动方向及转动速度的控制,并且将步进电机的转动速度动态显示在LED数码管上。 1

51单片机控制步进电机程序及硬件电路图

#include static unsigned int count; //计数 static int step_index; //步进索引数,值为0-7 static bit turn; //步进电机转动方向 static bit stop_flag; //步进电机停止标志 static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; //步进电机转速参数计数 void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒 void gorun(); //步进电机控制步进函数 void main(void) { count = 0; step_index = 0; spcount = 0; stop_flag = 0; P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; EA = 1; //允许CPU中断 TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许 TH0 = 0xFE;

TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数 turn = 0; speedlevel = 2; delay(10000); speedlevel = 1; do{ speedlevel = 2; delay(10000); speedlevel = 1; delay(10000); stop_flag=1; delay(10000); stop_flag=0; }while(1); } //定时器0中断处理 void timeint(void) interrupt 1 { TH0=0xFE; TL0=0x0C; //设定时每隔0.5ms中断一次count++; spcount--; if(spcount<=0) { spcount = speedlevel; gorun(); } } void delay(unsigned int endcount) { count=0; do{}while(count

51单片机驱动步进电机的方法(详解)

51单片机驱动步进电机的方法2019.02 这款步进电机的驱动电压12V,步进角为7.5度. 一圈360 度, 需要48 个脉冲完成!!! 该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。 采用51驱动ULN2003的方法进行驱动。 ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。 ;****************************************************************************** ;*************************步进电机的驱动*************************************** ; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19

;--------------------------------------------------------------------------------- ; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ; 本步进电机步进角为7.5度. 一圈360 度, 需要48 个脉冲完成!!! ;--------------------------------------------------------------------------------- ; A组线圈对应P2.4 ; B组线圈对应P2.5 ; C组线圈对应P2.6 ; D组线圈对应P2.7 ; 正转次序: AB组--BC组--CD组--DA组(即一个脉冲,正转7.5 度) ;---------------------------------------------------------------------------------- ;----------------------------正转-------------------------- ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R3,#144 正转3 圈共144 脉冲 START: MOV R0,#00H START1: MOV P2,#00H MOV A,R0 MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START 对A 的判断,当A = 0 时则转到START MOV P2,A LCALL DELAY INC R0 DJNZ R3,START1 MOV P2,#00H LCALL DELAY1 ;-----------------------------反转------------------------ MOV R3,#144 反转一圈共144 个脉冲 START2: MOV P2,#00H

步进电机运行系统控制设计

步进电机运行系统控制设计 一、设计的性质与目的:性质:该设计是在学生学完《单片机原理与应用》和电子学相关课程的基础上,结合测控技术与仪器和机电工程专业的特点进行的具有一定难度和覆盖面的综合性实践环节。 目的:综合运用所学的《单片机原理与应用》理论知识,通过实践加强对所学知识的理解,具备设计单片机应用系统的能力。 二、设计内容与要求: 1、根据设计任务,设计该单片机应用系统的硬件电路图,软件流程图并编制相应的软件,实现硬件和软件的调试。 2、按下不同的键,分别使步进电机实现顺时针和逆时针旋转一步,连续按键,不仅电机连续运转,显示器显示步进电机的状态。 3、按下不同的键作步进电机速度及转向的控制并显示步进电机的状态。 A) 电机正向或逆向运转的切换 B) 电机加速运转 C) 电机减速运转 D) 电机按给定速度匀速运转 三、实验注意事项: 1、实验中所用仪器及设备均应按操作规程操作,实验前应仔细阅读指导书。 2、实验应独立思考,发现问题尽量自己解决。 3、实验结果需经老师检查后方算完成。 四、设计方案: 1、步进电机工作原理及硬件连线图:步进电机驱动原理是通过对它每相线圈中的电流的顺序切换使电机作步进式旋转,驱动电路有脉冲信号来控制,所以调解脉冲信号的频率变可以改变步进电机的转速,因此微电脑控制步进电机最合适。 如下图所示,实验使用的不仅电机用直流+5V电压,每相电流为0.16A,电机线圈由4相组成。即①1 (A);①2 (B);①3 (C);①4 (D); 驱动方式为二相激磁方式各线圈通通电顺序如下表:

相 顺序 1 2 3 4 0 1 1 0 0 1 0 1 1 0 2 0 0 1 1 3 1 0 0 1 二相激磁通电次序表中首先向①1线圈-①2线圈输入驱动电流,接着①2-①3,①3-①4,又返回到①1-①2,按这种顺序切换,点击按顺时针方向旋转。这时的相序位0, 1,2, 3;如果使电机逆时针方向旋转,相序为3, 2, 1, 0。 步进电机的驱动电路如右图所示, 微电脑向步进电机输入端传送 1 或0 信息,则可实现上述操作。 实验可通过不同长度的延时来得到不同频率的步进电机输入脉冲, 从而得到多种步进速度。 连线方式: A 74LS273的011-014分别接步进电机BA-BD 74LS273片选端CS2接08-1F. B) 步进电机插头接J8。 2、程序设计思路:根据题目要求,程序应具备以下几个功能:可通过键盘控制步进电机的转速,方向 可通过LED数码管显示电机运行状态 电机运转状态可以是正反转,加速减速,五种不同速度的各种组合 3、硬件电路图: 4、软件流程图: 五、子程序调试: 1 、显示子程序调试显示子程序清单: ORG 4000H

用单片机控制步进电机

用单片机控制步进电机 步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 一、步进电机常识 常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为 0.72度。这种步进电机的应用最为广泛。 二、永磁式步进电机的控制 下面以电子爱好者业余制作中常用的永磁式步进电机为例,来介绍如何用单片机控制步进电机。 图1是35BY型永磁步进电机的外形图,图2是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将COM端标识为C,只要AC、 C、BC、 C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM端接正电源,那么只要用开关元件(如三极管),将A、、B、轮流接地。 下表列出了该电机的一些典型参数: 表1 35BY48S03型步机电机参数 型号步距角相数电压电流电阻最大静转距定位转距转动惯量 35BY48S03 7.5 4 12 0.26 47 180 65 2.5 有了这些参数,不难设计出控制电路,因其工作电压为12V,最大电流为0.26A,因此用一块开路输出达林顿驱动器(ULN2003)来作为驱动,通过P1.4~P1.7来控制各线圈的接通与切断,电路如图3所示。开机时,P1.4~P1.7均为高电平,依次将P1.4~P1.7切换为低电平即可驱动步进电机运行,注意在切换之前将前一个输出引脚变为高电平。如果要改变电机的

最新51单片机控制四相步进电机电路图汇总

51单片机控制四相步进电机电路图

51单片机控制四相步进电机 接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任务就是搞定步进电机的单片机控制。以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所 示: 拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。地线与四线接触的顺序相反,电机的转向也相反。 如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。所以,设计了如下电路图:

C51程序代码为: 代码一 #include static unsigned int count; static unsigned int endcount; void delay(); void main(void) { count = 0; P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0;

EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFC; TL0 = 0x18; //设定时每隔1ms中断一次 TR0 = 1; //开始计数 startrun: P1_3 = 0; P1_0 = 1; delay(); P1_0 = 0; P1_1 = 1; delay(); P1_1 = 0; P1_2 = 1; delay(); P1_2 = 0; P1_3 = 1; delay(); goto startrun; } //定时器0中断处理 void timeint(void) interrupt 1

基于单片机的步进电机转速控制全解

电子器件市场调研与系统设计实践 专 业: *** 班 级: 姓 名: 学 号: 指导教师: ****大学****学院 **** 年 **月**日

基于单片机的步进电机调速与正反转控制系统 1 系统要求 步进电动机是用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机,它最突出的优点是可以在宽广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,并且用其组成的开环系统既简单、廉价,又非常可行,因此在打印机等办公自动化设备以及各种控制装置等众多领域有着极其广泛的应用。随着微电子和计算机技术的发展,步进电动机的需求量与日俱增,研制步进电机驱动器及其控制系统具有十分重要的意义。本设计基于单片机控制的步进电机设计课题是以单片机为主控制模块,从而实现电机的启停、正反转和调速的目的的一个设计课题。在课题设计之前,通过互联网了解到了当前步进电机的发展状况及发展前景。同时也了解了当今最先进的步进电机所具备的功能,方便为课题设计提供参考和借鉴;最后,通过画原理框图的形式,以最直观的方式为整个课题设计制定了流程及要求。 1.1 设计目的 《电子器件市场调研与系统设计实践》是本专业的重要实践教学环节,强调实际应用技能训练。结合自动化专业系列课程的学习,培养我们对电子器件的认知,锻炼我们的市场调研能力,加深我们对自动化专业系列课程知识的掌握。通过课程设计环节培养学生与人交往、独立思考和处理问题的能力。 1.2 设计内容及要求 本次课程设计所选的步进电机是四相步进电机,采用的方法是利用单片机控制步进电机的驱动。步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。本次课程设计就是通过改变脉冲频率来调节步进电机的速度的,并且通过数码管显示其转速的级别。另外通过单片机实现它的正反转,步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。 2 系统方案及原理 2.1 系统设计方案 该步进电机调速系统主要具有电机启停、调速、正反转控制和显示功能,现

基于51单片机的步进电机控制-

基于51单片机的步进电机控制 [摘要]本课程设计的内容是利用51单片机,达到控制步进电机的启动、 停止、正转、反转、两档速度和状态显示的目的,使步进电机控制更加灵活。步进电机驱动芯片采用ULN2803,ULN2803具有大电流、高电压,外电路简单等优点。利用四位数码管增设电机状态显示功能,各项数据更直观。实测结果表明,该控制系统达到了设计的要求。 关键字:步进电机、数码管、51单片机、ULN2803 一步进电机与驱动电路 1.1 什么是步进电机 步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 1.2 步进电机的种类 步进电机分永磁式(PM)、反应式(VR)、和混合式(HB)三种。永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为0.72度。这种步进电机的应用最为广泛。 1.3 步进电机的特点 1.精度高一般的步进电机的精度为步进角的3-5%,且不累积。可在宽广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,这是步进电动机最突出的优点 2.过载性好其转速不受负载大小的影响,不像普通电机,当负载加大时就会出现速度下降的情况,所以步进电机使用在对速度和位置都有严格要求的场合; 3.控制方便步进电机是以“步”为单位旋转的,数字特征比较明显,这样就给计算机控制带来了很大的方便,反过来,计算机的出现也为步进电机开辟了更为广阔的使用市场;

相关主题
文本预览
相关文档 最新文档