STM32控制ULN2003驱动步进电机28BYJ-48
步进电机
步进电动机又称脉冲电动机,是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
传送门:一文搞懂步进电机特性、原理及驱动器设计
28BYJ-48步进电机
28BYJ-48永磁式减速单极性步进电机
- 28:步进电机的有效最大外径是28毫米
- B:表示是步进电机
- Y:表示是永磁式
- J:表示是减速型(减速比1:64)
- 48:表示四相八拍
传送门:28BYJ-48单极性步进电机
28BYJ-48步进电机的励磁方式
1相励磁
励磁控制:一瞬间步进电机只有一个线圈导通,没送一个励磁信号,步
进电机转动一个角度。
特点:精确度好,消耗电力小,但输出转矩最小,振动较大。2相励磁
励磁控制:一瞬间步进电机有两个线圈导通。
特点:输出转矩最大,振动较小。1-2相励磁
励磁控制:1相励磁和2相励磁交替导通。
特点:分辨率高,运转平滑,应用广。
28BYJ-48采用以上方式都可行,相较1相励磁和2相励磁来说,1-2相励磁方式应用更广。1-2相励磁驱动28BYJ-48获得更小的步进角度,运转更平滑,但同时28BYJ-48的转矩会随着1-2相励磁交替改变。
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[i];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呢?
请看下节分析
以上传送门:完整工程的驱动传
喜欢请点个赞哦,欢迎大家指正,谢谢
STM32控制ULN2003驱动步进电机28BYJ-48相关推荐
- 使用STM32控制TMC5160驱动步进电机
首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...
- 【Proteus仿真】Arduino+uln2003驱动步进电机+单按键启保停正反转控制
[Proteus仿真]Arduino+uln2003驱动步进电机+单按键启保停正反转控制 Proteus仿真 功能实现 采用外部中断来获取按键信息 程序代码 #define LED ( 13 )#de ...
- 【Proteus仿真】Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制
[Proteus仿真]Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制 Proteus仿真演示 功能说明 正反转采用2和3 引脚外部中断,3和4引脚调节加减速. 示例程序代码 ...
- 【Proteus仿真】Arduino UNO+ uln2003驱动步进电机+按键启保停控制
[Proteus仿真]Arduino UNO+ uln2003驱动步进电机+按键启保停控制 Proteus演示 功能说明 加减速采用外部中断引脚2和3实现调速控制,调速方位,110-250,也就是代码 ...
- VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制
VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制 Proteus仿真演示 基于51单片机,步进电机采用8节拍控制 VSM Studio代码 /* Main.c file g ...
- 【Proteus仿真】Arduino UNO利用Stepper库实现uln2003驱动步进电机转动
[Proteus仿真]Arduino UNO利用Stepper库实现uln2003驱动步进电机转动 Proteus仿真 Proteus说明 Proteus软件里面的步进电机的步距角默认是90,和代码中 ...
- STM32+ULN2003驱动步进电机
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A->AB->B ->BC -& ...
- stm32f302实现斩波控制步进电机_[转载]步进电机原理介绍与基于STM32的SPWM驱动步进电机,使用软件实现电机细分...
文章摘自: http://bbs.eeworld.com.cn/thread-370591-1-1.html 一.混合式步进电机的结构和驱动原理 电机原理这部分不想讲的太复杂了,拆开一台电机看看就明白 ...
- 用STM32和ULN2003控制28BYJ-48步进电机正反转固定角度
在我们平时做一些小项目的时候,需要用到步进电机驱动某一部件转动某一固定角度或者是走过固定长度. 比如自制一个具有扫风功能的小风扇,由于风扇自身尺寸偏小,使用如图1所示传统的复杂机械结还构去实现扫风功能 ...
最新文章
- 如何解释混合网络?—Vecloud微云
- 3d饼图 vue_Vue+Echarts构建可视化大数据平台实战项目分享(附源码)(上)
- 一个成功敏捷团队的失败历程
- 201671010128 2017-09-24《Java程序设计》之继承
- 记录一次分组求和查询优化
- 【Android手机测试】OOM
- 一:MyBatis知识整理(1)
- 解决在微信中不能直接发送和下载APK的方案
- python根据汉字获得拼音,python获取一组汉字拼音首字母的方法 -电脑资料
- 马云不是退休,而是进修,遵循“天道”,风清扬用大情怀修炼封神
- 如何管理你的客户?别用会员卡积分打折了,把客户变成粉丝
- python数据建模工具_Python数据分析、挖掘常用工具
- 领导讲话稿小标题大全,笔杆子收藏备用
- ali-oss配合element上传130M以上的文件,浏览器直接崩溃,有大神知道是什么情况么
- Win11系统电脑硬盘分区方法教程
- 零基础python入门书籍推荐书目_清华大学出版社-图书详情-《Python数据科学零基础一本通》...
- python把文件夹中所有的图片按顺序转换成视频
- 欧拉角,万向节锁和四元数
- SpringBoot 基于配置文件给bean赋值
- CODESYS开发教程6-关键字及变量类型