完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
步进电机
步进电动机又称脉冲电动机,是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。 传送门:一文搞懂步进电机特性、原理及驱动器设计 28BYJ-48步进电机 28BYJ-48永磁式减速单极性步进电机
ULN2003 ULN2003驱动板 ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。 ULN2003驱动原理 ULN2003驱动28BYJ-48接线 在实际使用中,只需要使用单片机的IO接ULN2003驱动板的IN1-IN4即可,当然,单片机和模块需要共地。 代码实现 (使用STM32F103C8最小系统板) 创建step_motor.c和step_motor.h文件,并在step_motor.h中进行宏定义4个IO口,如下: /* 宏定义 ------------------------------------------ */ /* 步进电机1参数宏 */ #define LA PAout(1) /* A相 */ #define LB PAout(2) /* B相 */ #define LC PAout(3) /* C相 */ #define LD PAout(4) /* D相 */ /* A相 */ #define LA_GPIO_PORT GPIOA #define LA_GPIO_PIN GPIO_Pin_1 #define LA_GPIO_CLK RCC_APB2Periph_GPIOA /* B相 */ #define LB_GPIO_PORT GPIOA #define LB_GPIO_PIN GPIO_Pin_2 #define LB_GPIO_CLK RCC_APB2Periph_GPIOA /* C相 */ #define LC_GPIO_PORT GPIOA #define LC_GPIO_PIN GPIO_Pin_3 #define LC_GPIO_CLK RCC_APB2Periph_GPIOA /* D相 */ #define LD_GPIO_PORT GPIOA #define LD_GPIO_PIN GPIO_Pin_4 #define LD_GPIO_CLK RCC_APB2Periph_GPIOA 在step_motor.c中初始化端口,代码如下: /** * @name: Step_Motor_Init * @description: 步进电机初始化端口 * @param {*} * @return {*} */ void Step_Motor_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LA_GPIO_CLK | LB_GPIO_CLK | LC_GPIO_CLK | LD_GPIO_CLK, ENABLE); /* A相端口初始化 */ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = LA_GPIO_PIN; GPIO_Init(LA_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = LB_GPIO_PIN; GPIO_Init(LB_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = LC_GPIO_PIN; GPIO_Init(LC_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = LD_GPIO_PIN; GPIO_Init(LD_GPIO_PORT, &GPIO_InitStruct); GPIO_ResetBits(LA_GPIO_PORT, LA_GPIO_PIN); GPIO_ResetBits(LB_GPIO_PORT, LB_GPIO_PIN); GPIO_ResetBits(LC_GPIO_PORT, LC_GPIO_PIN); GPIO_ResetBits(LD_GPIO_PORT, LD_GPIO_PIN); } 在step_motor.c中宏定义或者枚举类型定义每个IO口或者是电机各个相的软件接通位。 比如: A相位定义为bit0,当A相导通的时候状态对应0x01; B相位定义为bit1,当B相导通时位0x02;以此类推定义C相和D相; /* 私有类型定义------------------------------------------------- */ typedef enum _PIN_BIT { PLA = 0x01, PLB = 0x02, PLC = 0x04, PLD = 0x08, } Pin_Bit; 根据以上定义,很容易算1-2相励磁的时候各个步骤中的每相的状态,将状态组织成为数据,方便后续进行遍历,如下: 只要在以上定义的数字之间,穿插加上一个数字,值为两边的数字求和; /* 私有变量定义------------------------------------- */ static uint8_t steps[8] = {0x01, 0x03, 0x02, 0x6, 0x04, 0x0c, 0x08, 0x09}; 定义电机正转函数: /** * @name: Step_Motor_CW * @description: 电机正转函数 * @param {uint32_t} nms * @return {*} */ void Step_Motor_CW(uint32_t nus) { volatile uint8_t i; uint8_t temp = 0; for(i = 0; i < 8; i++) { temp = steps; LA = (uint8_t)((temp&PLA) >> 0); LB = (uint8_t)((temp&PLB) >> 1); LC = (uint8_t)((temp&PLC) >> 2); LD = (uint8_t)((temp&PLD) >> 3); delay_us(nus); } Step_Motor_Stop(); } 定义电机反转函数: /** * @name: Step_Motor_CCW * @description: 电机反转函数 * @param {uint32_t} nms * @return {*} */ void Step_Motor_CCW(uint32_t nus) { int i; for(i = 8; i > 0; i--) { LA = (uint8_t)((steps[i-1]&PLA) >> 0); LB = (uint8_t)((steps[i-1]&PLB) >> 1); LC = (uint8_t)((steps[i-1]&PLC) >> 2); LD = (uint8_t)((steps[i-1]&PLD) >> 3); delay_us(nus); } Step_Motor_Stop(); } 定义一个电机停转函数,为了让电机停止的时候每一相都断电,不然长期通电会使电机线圈发热严重: /** * @name: Step_Motor_Stop * @description: 电机停止 * @param {*} * @return {*} */ void Step_Motor_Stop(void) { LA = 0; LB = 0; LC = 0; LD = 0; } 最后,在main.c中进行测试: int main(void) { initSysTick(); LED1_Init(); Step_Motor_Init(); for(;;) { Step_Motor_CW(1000); } } 以上是STM32驱动ULN2003的简单过程,在使用此种方法的同时会带来严重问题: 28BYJ-48非常慢,转动一圈需要4096步,如果每步之间需要1ms,一圈需要4.096s; 在电机旋转函数中调用了delay_ms进行每步之间的保持时间,消耗cpu运行效率,阻塞其他任务执行; 如果28BYJ-48转动10圈,那么相当于cpu在41s一直在执行电机相位切换和delay_ms函数,阻塞整个程序,不利于整个系统的稳定性; 所以,如果想要系统及时稳定的处理其他问题,以上这样驱动ULN2003是不可取的,怎样才能在不影响系统及时稳定的前提下,驱动ULN2003呢? |
|
|
|
只有小组成员才能发言,加入小组>>
2480 浏览 0 评论
9376 浏览 4 评论
37077 浏览 19 评论
5079 浏览 0 评论
25117 浏览 34 评论
1682浏览 2评论
1938浏览 1评论
2398浏览 1评论
1705浏览 0评论
699浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 18:18 , Processed in 1.037927 second(s), Total 42, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号