完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、环境介绍
MCU: STM32F103ZET6 编程软件: Keil5 二、硬件介绍 开发板采用STM32F103ZET6 最小系统板 电机驱动板采用的是ULN2003 步进电机采用的是28BYJ4 (5V 4相5线步进电机) 三、驱动代码 3.1 motor.c #include “motor.h” //步进电机正反转数组1 u16 PositiveSequence[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A u16 ReverseOrder[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D. void motor_delay_ms(u32 ms) { u32 i,j; for(i=0;i《ms;i++) for(j=0;j《112;j++); } void motor_stop(void) { MOTOR_1=0; MOTOR_2=0; MOTOR_3=0; MOTOR_4=0; } void motor_init(void) { RCC-》APB2ENR|=1《《4; GPIOC-》CRL&=0x00FFFFFF; GPIOC-》CRL|=0x33000000; GPIOC-》CRH&=0xFFFFFF00; GPIOC-》CRH|=0x00000033; // IN4: PC9 d // IN3: PC8 c // IN2: PC7 b // IN1: PC6 a } void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal) { GPIOx-》ODR = PortVal; } void motor_just(int speed) //一个脉冲 { uint8_t i; for(i=0;i《4;i++) { GPIO_Write(GPIOC,PositiveSequence); motor_delay_ms(speed); } } void motor_back(int speed) { uint8_t i; for(i=0;i《4;i++) { GPIO_Write(GPIOC,ReverseOrder); motor_delay_ms(speed); } } //由于 *一个脉冲* *输出轴* 转0.08789度(电机实转0.08789*64=5.625度),即步进角为5.625度。则转完A-B-C-D为 *8个脉冲* //,即0.08789*8=0.70312度。若称A-B-C-D为一个周期,则j为需要的转完angle角度所需的周期数。 //步进电机正转角度函数 void motor_just_angle(int angle,int speed) { int i,j; j=(int)(angle/0.70312); for(i=0;i《j;i++) { motor_just(speed); } motor_stop(); } //步进电机反转角度函数 void motor_back_angle(int angle,int speed) { int i,j; j=(int)(angle/0.70312); for(i=0;i《j;i++) { motor_back(speed); } motor_stop(); } //步进电机反转圈函数 void motor_back_circle(int ring ,int speed) { int i; for(i=0;i《ring;i++) { motor_back_angle(360,speed); } } //步进电机正转圈函数 void motor_just_circle(int ring,int speed) //步进电机正转角度函数 { int i; for(i=0;i《ring;i++) { motor_just_angle(360,speed); } } 3.2 motor.h #ifndef _MOTOR_H #define _MOTOR_H #include “sys.h” void motor_delay_ms(u32 x);//延时函数 void motor_init(void); //步进电机初始化 void motor_just(int speed); //步进电机正转函数 void motor_back(int speed); //步进电机反转函数 void motor_just_angle(int angle,int speed); //步进电机正转角度函数 void motor_back_angle(int angle,int speed); //步进电机反转角度函数 void motor_stop(void); //步进电机停止函数 void motor_just_circle(int ring ,int speed); //步进电机正转圈函数 void motor_back_circle(int ring ,int speed);//步进电机反转圈函数 //IN #define MOTOR_1 PCout(6) #define MOTOR_2 PCout(7) #define MOTOR_3 PCout(8) #define MOTOR_4 PCout(9) #endif 3.3 main.c /* ULN2003控制28BYJ-48步进电机接线: ULN2003接线: IN4: PC9 d IN3: PC8 c IN2: PC7 b IN1: PC6 a + : 5V - : GND */ int main() { u8 time_cnt=0; u8 key; LED_Init(); KEY_Init(); USART1_Init(115200); motor_init(); //步进电机初始化 USART1_Printf(“程序初始化。。。。。rn”); while(1) { //按键可以测试开锁和关锁 key=KEY_Scan(0); if(key==1) { LED1=0; //亮灯--表示开锁 motor_just_circle(1,300); //电机正转1圈 } else if(key==2) { LED1=1; //灭灯--表示关锁 motor_back_circle(1,300); //电机反转1圈 } DelayMs(10); time_cnt++; if(time_cnt》=50) { time_cnt=0; LED2=!LED2; } } } |
|
|
|
只有小组成员才能发言,加入小组>>
646浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 13:12 , Processed in 0.663756 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号