《(6.3.2)--案例:步进电机驱动模块开发.pdf》由会员分享,可在线阅读,更多相关《(6.3.2)--案例:步进电机驱动模块开发.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、案例:使案例:使步进电机转动步进电机转动1.原理图原理图2.主程序主程序/*头文件区域*/#include#include/*常量定义区*/#define P2_INIT 0 xFF#define P2M1_INIT 0 x00#define P2M0_INIT 0 x00#define P0_INIT 0 x0F#define P0M1_INIT 0 x00#define P0M0_INIT 0 xFF#define IN1 P00#define IN2 P01#define INA P04#define INB P05#define INC P06#define IND P07#defin
2、e ENA P02#define Stevo P03/*变量定义区*/unsigned char Cnt_2ms=0,Cnt_10ms=0,Cnt_1s=0;Second=0;unsigned char Cycle_2ms=10,Duty_2ms=6,Cnt_PWM=0;unsigned char Cycle_Stevo=160;/舵机驱动 PWM 周期 单位 0.125ms实际时长 20msunsigned char Duty_Stevo=0;/舵机驱动 PWM 信号高电平持续时间unsigned char Cnt_Stevo_PWM=0;/舵机驱动 PWM 信号计时器单位 0.125msu
3、nsigned char Cycle_Step=50;/步进电机每个节拍时间unsigned char Duty_Step=10;/步进电机节拍序号unsigned char Cnt_Step_PWM=0;/步进电机节拍计时器unsigned char Motor_State=1;/最后两位00 停转01 正转 10 反转高四位 速度等级/*函数声明区*/void MCU_Init();void Delay(unsigned char);void Timer_init();void MOTOR_Ctrl();void main()/*初始化区*/MCU_Init();/*主循环*/while(
4、1)MOTOR_Ctrl();/初始化函数void MCU_Init()Timer_init();Uart1Init();void Timer_init()/定时器 0 初始化AUXR&=0 x80;/定时器 0 为 12T 模式TMOD=0 x00;/模式 0,16 位自动重载TL0=0 x83;/设置定时初值TH0=0 xFF;/设置定时初值TR0=1;/开始计时ET0=1;/Enable Timer0 interruptIE|=0 x80;/开总中断P0=0 x00;P0M0=P0M0_INIT;P0M1=P0M1_INIT;IN1=1;IN2=0;/中断函数 2ms 200ms 1s
5、平台void INT_Timer0()interrupt 1/中断函数Cnt_2ms+;Cnt_Stevo_PWM+;/舵机驱动 PWM 信号计时器if(Cnt_Stevo_PWM=Cycle_Stevo)Cnt_Stevo_PWM=0;/PWM20 毫秒周期计时if(Cnt_Stevo_PWM=Cycle_2ms)Cnt_PWM=0;Cnt_Step_PWM+;/步进电机节拍计时if(Cnt_Step_PWM=Cycle_Step)/计至单拍时间 更换电机驱动Cnt_Step_PWM=0;Duty_Step+;if(Duty_Step=4)Duty_Step=0;switch(Duty_St
6、ep)/根据节拍 输出控制信号case 0:INA=1;INA=0;INC=0;IND=0;break;case 1:INA=0;INA=1;INC=0;IND=0;break;case 2:INA=0;INA=0;INC=1;IND=0;break;case 3:INA=0;INA=0;INC=0;IND=1;break;if(Cnt_2ms=16)/2ms 平台Cnt_2ms=0;/计时Cnt_10ms+;if(Cnt_10ms=5)/10ms 平台Cnt_10ms=0;Cnt_1s+;if(Cnt_1s=100)/1s 平台Cnt_1s=0;/Cycle_Step+;/if(Cycle_
7、Step=20)Cycle_Step=5;Duty_Stevo+;if(Duty_Stevo=20)Duty_Stevo=0;Second+;if(Second=60)Second=0;void MOTOR_Ctrl()switch(Motor_State&0 x03)case 0:IN1=0;IN2=0;break;case 1:IN1=1;IN2=0;break;case 2:IN1=0;IN2=1;break;switch(Motor_State&0 x30)4)case 0:Duty_2ms=5;break;case 1:Duty_2ms=8;break;case 2:Duty_2ms=9;break;/*/if(Cnt_PWM=Duty_2ms)ENA=1;elseENA=0;if(Cnt_Stevo_PWM=Duty_Stevo)Stevo=1;elseStevo=0;/ENA=1;