电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
L298N驱动28BYJ-48步进电机 STM32在定时器中控制步进电机
分 享
扫描二维码分享
L298N驱动28BYJ-48步进电机 STM32在定时器中控制步进电机
步进电机
28BYJ-48
L298N
嵌入式从0到1
关注
发布时间: 2021-06-09
丨
阅读: 1644
## 问题由来 在综合实例 [利用ZigBee模块实现智能家居的远程语音控制](https://mp.weixin.qq.com/s/EsiXJTKjrK-Zel6sL8wZVg) 中,用到了步进电机,有的网友问我,应该买一个什么样的步进电机呢? ![](https://img-blog.csdnimg.cn/20210512203756307.png) 其实底板上的L298N电路是一个步进电机驱动的通用电路,不一定要买跟我一模一样的步进电机。 我们随便选择一个步进电机都是可以的,为了控制方便,我们这里选择一个常见的5V的步进电机:**28BYJ-48**。 ![](https://img-blog.csdnimg.cn/20210512203819343.png) 内部拆解图: ![](https://img-blog.csdnimg.cn/20210512203833475.png) 正是因为内部有这么多齿轮,所以此步进电机为一个减速电机。 ## 解决问题 * 28BYJ-48步进电机与L298N驱动芯片的接法 * 改进综合实例中步进电机的驱动方式 ## 开发环境与工具 * Keil 5 * 主芯片为STM32F103RET6 * 电路使用的是**202008综合实例**的底板 * 下载工具为JLINK * PC为Win10 * 步进电机的型号为:**28BYJ-48** ## 主要技术参数 ![](https://img-blog.csdnimg.cn/20210512203900174.png) 步进电机28BYJ-48为5线4相八拍电机,额定电压有5V,还有6V、12V、24V的。 其中: **28**:步进电机的直径为28mm **48**:表示四相八拍 电机的减速比:1/64 步距角:5.625°/64=0.08789度(因为减速比是1/64) 所以对于此步进电机,4096个脉冲转一圈(64×64)。 ## 驱动方法 ![](https://img-blog.csdnimg.cn/20210512203924583.png) 此步进电机一共有5根线,红色是公共端,接5V电源,4橙(A),3黄(B),2粉(C),1蓝(D)。 步进电机要想转动,必须加驱动,步进电机的驱动信号必须为脉冲信号,没有脉冲的时候,步进电机静止。 加上适当的脉冲信号,步进电机就会以一定的角度转动,转动的速度和脉冲的频率成正比。 八拍步进电机控制时序为:A-AB-B-BC-C-CD-D-DA-A ... ,一拍转一个步距角,如此反复。 对应各个线的高低电平如下所示: | 橙 | 黄 | 粉 | 蓝 | 十六进制 | | :---: | :---: | :---: | :---: | :---: | | 1 | 0 | 0 | 0 | 0x08 | | 1 | 1 | 0 | 0 | 0x0C | | 0 | 1 | 0 | 0 | 0x04 | | 0 | 1 | 1 | 0 | 0x06 | | 0 | 0 | 1 | 0 | 0x02 | | 0 | 0 | 1 | 1 | 0x03 | | 0 | 0 | 0 | 1 | 0x01 | | 1 | 0 | 0 | 1 | 0x09 | 由上我们可以定义旋转相序: ```C uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时针旋转相序表 uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时针旋转相序表 ``` ## 原理图 ![](https://img-blog.csdnimg.cn/2021051220394282.png) 橙、黄、粉、蓝四根线分别与 StepMotor_OUT1、 StepMotor_OUT2、 StepMotor_OUT3、 StepMotor_OUT4 相连,通过改变StepMotor_IN1~StepMotor_IN4 引脚的高低电平,StepMotor_OUT1~StepMotor_OUT4 对应输出同向高低电平。 因为步进电机上为XH2.54-5P的胶壳插头,而底板是XH2.54-6P的胶壳直针座,所以我们要对其进行一下改造。 ![](https://img-blog.csdnimg.cn/20210512203955855.png) 因为步进电机的红线需要连接5V,即VCC连接5V,L298N的VS也需要连接5V,所以我们要将板子上的JP8三个引脚短接到一起。 改造后的结果展示如下: ![](https://img-blog.csdnimg.cn/20210512204029984.png) ## 代码实现 ### 定时器初始化 随便选择STM32的一个定时器即可,我们这里以定时器3为例: ```C //定时器3初始化 //arr:定时重装值 //psc:分频值 void TIM3_Init(uint16_t arr, uint16_t psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启TIM3时钟 //定时器3配置,重载值、分频值、分频系数、计数模式 TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允许定时更新中断 //中断配置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE); //使能定时器3 } ``` main函数中,调用上面的函数对定时器进行初始化: ```C TIM3_Init(19,7199); //2ms中断 TIM3_Set(0); //定时器初始状态为关闭状态 ``` ### 定时器中断处理函数 定时器3每2ms执行一次中断服务函数,在中断服务函数中,改变L298N四个输入引脚的状态,完成步进电机的一拍,如果想要让28BYJ-48型步进电机旋转一圈,需要执行下面中断服务函数**64\*64**次,即步进电机运转**64\*64**拍。 ```C //定时器3中断服务程序 void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断 { TIM_ClearITPendingBit(TIM3, TIM_IT_Up
date ); //清除TIM3更新中断标志 nCurrentMotorStepCount++; if(nCurrentMotorStepCount <= MOTOR_STEP_COUNT) { SetMotor(PhaseCW[nCurrentMotorStepCount%8]); //SetMotor(PhaseCCW[nCurrentMotorStepCount%8]); } if(nCurrentMotorStepCount >= MOTOR_STEP_COUNT) { TIM_Cmd(TIM3, DISABLE); //关闭TIM3 L298N_12ENA = 0; //只有转的时候使能,否则持续供电,芯片和电机过热。 L298N_34ENA = 0; nCurrentMotorStepCount = 0; } } } ``` 当步进电机行进了预定拍数之后,关闭定时器,并将L298N芯片的两个使能引脚置为低电平,步进电机将停止运动。 ### 步进电机行进一拍 每一拍中我们都需要改变一次L298N四个输出引脚的状态,即需要改变L298N的四个输入引脚状态,下面封装了一拍状态下,对与L298N芯片相连的STM32的四个引脚进行赋值的函数: ```C void SetMotor(unsigned char InputData) { if(InputData&0x01) { GPIO_SetBits(GPIOC,GPIO_Pin_13); } else { GPIO_ResetBits(GPIOC,GPIO_Pin_13); } if(InputData&0x02) { GPIO_SetBits(GPIOC,GPIO_Pin_1); } else { GPIO_ResetBits(GPIOC,GPIO_Pin_1); } if(InputData&0x04) { GPIO_SetBits(GPIOC,GPIO_Pin_2); } else { GPIO_ResetBits(GPIOC,GPIO_Pin_2); } if(InputData&0x08) { GPIO_SetBits(GPIOA,GPIO_Pin_0); } else { GPIO_ResetBits(GPIOA,GPIO_Pin_0); } } ``` ### 使能步进电机启动 要想步进电机启动,我们只需要开启定时器,并将L298N芯片的两个使能引脚置为高电平,步进电机将开始运动。 ```C TIM3_Set(1); nCurrentMotorStepCount = 0; L298N_12ENA = 1; L298N_34ENA = 1; ```
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交