基于STM32F103控制L298N驱动两相四线步进电机
文章目录
- 前言
- 一、模块参数
- 二、接口说明
- 三、准备工作
- 四、直流电机驱动
- 引脚接线
- 效果展示
- 五、两相四线步进电机驱动
- 步进电机相关概念
- 拍数驱动时序
- 引脚接线
- 效果展示
- 六、参考示例
前言
L298N 是一种常见的双 H 桥电机驱动模块,广泛用于驱动直流电机和步进电机。它基于 ST 的 L298N 芯片,具有高电流承载能力和灵活的控制模式,适合机器人、自动化设备等领域。
一、模块参数
1、驱动芯片:L298N 双 H 桥直流电机驱动芯片
2、驱动电压 Vs:+5V~+35V ; 如需要板内取电,则供电范围Vs:+7V~+35V
3、驱动电流Io:2A(MAX)
4、逻辑电压Vss:+5V~+7V(可板内取电+5V)
5、逻辑电流:0~36mA
6、控制信号输入电压范围:
低电平:-0.3V≤Vin≤1.5V
高电平:2.3V≤Vin≤Vss
7、使能信号输入电压范围:
低电平:-0.3≤Vin≤1.5V(控制信号无效)
高电平:2.3V≤Vin≤Vss(控制信号有效)
8、最大功耗:20W(温度 T=75℃时)
9、存储温度:-25℃~+130℃
二、接口说明
关于模块供电说明:
供电一:板上除了L298N外,还有7805的5V稳压芯片,当供电为5V到7V区间的时候模块内置的7805芯片不能正常工作的。所以供电端接5-7V外部电源只负责给电机供电,然后逻辑端外接5V逻辑电源。
供电二:当供电电压为7-12V时,插上板载5V使能的跳线帽,此时的逻辑端不但不用外接5V电源,还可以输出5V为单片机进行供电。
供电三:当供电在大于12V的时候,此时必须断开板载5V使能跳线帽,再在逻辑端子接入5V电源给芯片供电。如果不断开板载使能跳线帽的话,可能会损坏内置的7805的稳压芯片。
注意:板子没有升降压功能,供电范围要根据接的电机选择,避免供电过低过高带不动电机或烧坏电机,如驱动12V的电机,则接12V的电源。
三、准备工作
STM32F103最小系统板、L298N驱动模块、2个直流电机或1个两相四线步进电机、EC11旋转编码器模块以及供电电源。
四、直流电机驱动
该驱动板可驱动 2 路直流电机,使能端 ENA、ENB 为高电平时有效,控制方式及直流电机状态表如下所示:
若要对直流电机进行 PWM 调速,需设置 IN1 和 IN2,确定电机的转动方向,然后对使能端输出 PWM 脉冲,即可实现调速。注意当使能信号为 0 时,电机处于自由停止状态;当使能信号为 1,且 IN1 和 IN2 为 00 或 11 时,电机处于制动状态,阻止电机转动。IN1和IN2控制输出A,IN3和IN4控制输出B。
引脚接线
L298N | STM32F103 / 电源 / 直流电机 |
---|---|
输出A,B | 连接电机1,2 |
12V供电 | 电源正 |
供电GND | 电源负 |
旋转编码器A,B,S | PB3,PB1,PB0 |
通道A,B使能 | 去掉跳线帽,使能A接PA6,使能B接PA7 ,PWM调速 |
IN1,IN2 | PA0,PA1 |
IN3,IN4 | PA2,PA3 |
效果展示
五、两相四线步进电机驱动
步进电机相关概念
相数——步进电机的N、S磁场的激磁线圈对数,如两相四线步进电机,就有两对极N、S磁场的激磁线圈,四线A+、A-、B+、B-,A+A-,B+B-是连通的,在不知道四线哪两两线为一对激磁线圈,通过短接两两线有明显阻力变化的则为一对线圈。
拍数——转子转动一周,定子绕组通电的次数,以两相电机为例,有两相四拍运行方式即(A+)—(B+)—(A-)—(B-),两相八拍运行方式(A+)—(A+B+)—(B+)–(B+A-)—(A-)—(A-B-)—(B-)–(B-A+),以此循环。
步距角——步进电机接收到一个脉冲信号后,驱动电机按设定的方向转动的一个固定角度。如两相四线步进电机的基本步距角是1.8°,即一个脉冲走1.8°。
同时,为了减弱或消除步进电机的低频振动开发了细分驱动技术。细分后电机运行时的实际步距角是基本步距角的几分之一,微步即1/4-step、1/8-step、1/16-step等。 比如,两相步进电机的基本步距角是1.8°,如果没有细分,则是200个脉冲走一圈360°。细分是通过驱动器靠精确控制电机的相电流所产生的,如果是10细分,则发一个脉冲电机走0.18°,即2000个脉冲走一圈360°,电机的精度能否达到或接近0.18°,还取决于细分驱动器的细分电流控制精度等其它因素。
细分驱动 | 单圈步数=360°÷角度 |
---|---|
四拍(1细分) | 1.8°—— 单圈200步 |
八拍(2细分) | 0.9°—— 单圈400步 |
十六拍(4细分) | 0.45°—— 单圈800步 |
三十二拍(8细分) | 0.225°—— 单圈1600步 |
六十四拍(16细分) | 0.1125°—— 单圈3200步 |
拍数驱动时序
单4拍(整步)方式驱动时序
双4拍(整步)方式驱动时序
电机转动方向如下所示,(A+)—(B+)—(A-)—(B-),以此循环,
特性 | 单四拍 | 双四拍 |
---|---|---|
通电相数 | 每次一相 | 每次两相 |
功耗 | 较低 | 较高 |
步进角 | 一致 | 一致 |
力矩 | 较小 | 较大 |
定位稳定性 | 一般 | 更高 |
8拍(半步)方式驱动时序
电机转动方向如下所示,(A+)—(A+B+)—(B+)–(B+A-)—(A-)—(A-B-)—(B-)—(B-A+),以此循环,
反转时,控制时序倒过来控制就可实现反向转动。
引脚接线
L298N | STM32F103 / 电源 / 两相四线电机 |
---|---|
12V供电 | 电源正 |
供电GND | 电源负 |
旋转编码器A,B,S | PB3,PB1,PB0 |
通道A,B使能 | 把跳线帽插回去 |
IN1,IN2 | PA0,PA1 |
IN3,IN4 | PA2,PA3 |
OUT1,OUT2 | A+,A- |
OUT3,OUT4 | B+,B- |
效果展示
六、参考示例
main.c
#include "stm32f10x.h" // Device header
#include "encoder.h"
#include "l298n.h"
#include "usart.h"
#include "timer.h"
#include "pwm.h"int32_t RxData;int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);usart_Init();L298N_Init();Encoder_Init();Timer_Inti();PWM_Init();while(1){ RxData =Encoder_Get();//直流电机控制正反转,调速TIM_SetCompare1(TIM3,RxData);if(Encoder_GetKey() == 0){Motor1_Zturn();Motor2_Zturn();}else{Motor1_Rturn();Motor2_Rturn();}//步进电机控制正反转
// if(Encoder_GetKey() == 0)
// {
// switch(RxData)
// {
// case 1:
// ZturndouControl_4();
// break;
// case 2:
// RturndouControl_4();
// break;
// }
// }else{
// switch(RxData)
// {
// case 1:
// ZturnControl_8();
// break;
// case 2:
// RturnControl_8();
// break;
// }
// }}
}
l298n.c
#include "l298n.h"
#include "delay.h"
#include "timer.h"void L298N_Init(void)
{//通过旋转编码器控制步进电机正转,翻转,加减速,停止GPIO_InitTypeDef GPIO_InitStructurn;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructurn.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructurn.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructurn.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructurn);
}void Motor1_Stop(void) //电机1停止
{IN1(0);IN2(0);
}void Motor2_Stop(void) //电机2停止
{IN3(0);IN4(0);
}void ALL_Stop(void) //两个电机全停止
{IN1(0);IN2(0);IN3(0);IN4(0);
}void Motor1_Zturn(void) //电机1正转
{IN1(1);IN2(0);
}void Motor1_Rturn(void) //电机1反转
{IN1(0);IN2(1);
}void Motor2_Zturn(void) //电机2正转
{IN3(1);IN4(0);
}void Motor2_Rturn(void) //电机2反转
{IN3(0);IN4(1);
}void Control_4(void) //单四拍
{if(Timer_GetCounter()<2500){IN1(1);IN2(0);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<7500){IN1(0);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<10000){IN1(0);IN2(0);IN3(0);IN4(1);delay_ms(10);}
}void ZturndouControl_4(void) //正双四拍
{if(Timer_GetCounter()<2500){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<7500){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<10000){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}
}void RturndouControl_4(void) //反双四拍
{if(Timer_GetCounter()<2500){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<5000){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<7500){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<10000){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}
}void ZturnControl_8(void) //正八拍
{if(Timer_GetCounter()<1250){IN1(1);IN2(0);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>1250 && Timer_GetCounter()<2500){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<3750){IN1(0);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>3750 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<6250){IN1(0);IN2(1);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>6250 && Timer_GetCounter()<7500){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<8750){IN1(0);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>8750 && Timer_GetCounter()<10000){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}
}void RturnControl_8(void) //反八拍
{if(Timer_GetCounter()<1250){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>1250 && Timer_GetCounter()<2500){IN1(0);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<3750){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>3750 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<6250){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>6250 && Timer_GetCounter()<7500){IN1(0);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<8750){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>8750 && Timer_GetCounter()<10000){IN1(1);IN2(0);IN3(0);IN4(0);delay_ms(10);}
}
相关文章:

基于STM32F103控制L298N驱动两相四线步进电机
文章目录 前言一、模块参数二、接口说明三、准备工作四、直流电机驱动引脚接线效果展示 五、两相四线步进电机驱动步进电机相关概念拍数驱动时序引脚接线效果展示 六、参考示例 前言 L298N 是一种常见的双 H 桥电机驱动模块,广泛用于驱动直流电机和步进电机。它基于…...

libreoffice在Windows和Linux环境的安装和结合Springboot使用教程
前言: 在公司做开发时,遇到一个需求,要求上传的文件有图片,也有word和pdf。预览信息时,既要求能水印展示出来,又要求能大图水印预览。思索许久,我决定采取全部打水印然后转成图片Base64&#x…...

前端开发 -- 自动回复机器人【附完整源码】
一:效果展示 本项目实现了一个简单的网页聊天界面,用户可以在输入框中输入消息,并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容,通过关键字匹配来生成自动回复。 二:源代码分享 <!DOCTYP…...

vue+echarts实现疫情折线图
效果: 代码: <<template><div><div id"left1" style "height:800px;width:100%"></div></div> </template><script> //疫情数据//export default {data() {return {data:{//疫情数据…...

服务器nfs文件共享
1. 配置 NFS 服务器(NFS Server) 在 Ubuntu/Debian 上: sudo apt update sudo apt install nfs-kernel-server在 CentOS/RHEL 上: sudo yum install nfs-utils1.2 创建共享目录 选择一个要共享的目录,并确保该目录的权限正确设置。例如,假设我们要共享 /srv/nfs 目录…...

基于Vue+SSM+SpringCloudAlibaba的科目课程管理系统
功能1:科目列表 功能2:条件查询 功能3:分页查询 功能4:excel批量导入 功能5:修改 功能6:删除...

vue3配置caddy作为静态服务器,在浏览器地址栏刷新出现404
vue3配置caddy作为静态服务器,在浏览器地址栏刷新出现404 1 情况描述2 原因3 配置 1 情况描述 在vue打包之后,形成dist文件,采用caddy作为静态资源服务器。在浏览器中输入域名时可以访问网站,但是,进过路由导航栏内部…...

深入理解委托:C# 编程中的强大工具
在面向对象编程中,委托(Delegate) 是一个非常强大且灵活的概念,特别是在 C# 编程语言中。它不仅仅是函数指针的替代品,还提供了更高层次的抽象,使得代码更加简洁、灵活和可维护。在这篇博客中,我…...

【Java 数据结构】合并两个有序链表
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 1. 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示…...

基于微信小程序的校园访客登记系统
基于微信小程序的校园访客登记系统 功能列表 用户端功能 注册与登录 :支持用户通过手机号短信验证码注册和登录。个人资料管理 :允许用户编辑和更新个人信息及其密码。站内信消息通知:通知公告。来访预约:提交来访预约支持车牌…...

uniapp 判断多选、选中取消选中的逻辑处理
一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"...

php8.0版本更新了哪些内容
PHP 8.0版本是PHP语言的一个重要更新,它引入了许多新特性和改进,旨在提高性能、增强代码的可读性和可维护性。以下是PHP 8.0版本更新的主要内容: 一、性能提升 JIT编译器:PHP 8.0引入了Just-In-Time(JIT)…...

Browser Use:AI智能体自动化操作浏览器的开源工具
Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…...

Android笔记(四十):ViewPager2嵌套RecyclerView滑动冲突进一步解决
背景 ViewPager2内嵌套横向滑动的RecyclerView,会有滑动冲突的情况,引入官方提供的NestedScrollableHost类可以解决冲突问题,但是有一些瑕疵,滑动横向RecyclerView到顶部,按住它不放手继续往左拖再往右拖,这…...

POS系统即销售点系统 文档与数据库设计
POS系统即销售点系统,是一种用于商业交易的软硬件集成系统,主要用于管理销售、库存、客户信息等,以下是其详细介绍: 1. 系统组成 硬件部分 : 收银终端:包括传统的台式收银机、平板电脑、智能手机等设备&a…...

安全合规遇 AI 强援:深度驱动行业发展新引擎 | 倍孜网络CEO聂子尧出席ICT深度观察报告会!
12月24日,2025中国信通院深度观察报告会科技伦理与合规发展分论坛在北京举办。本次分论坛主题为“伦理先行,合规致远”,聚焦互联网广告合规治理、移动终端应用生态治理、短视频平台责任限度等前沿话题进行分享与探讨。工业和信息化部领导&…...

算法进阶:贪心算法
贪心算法是一种简单而直观的算法思想,它在每一步选择中都采取在当前状态下最优的选择,以期望最终得到全局最优解。贪心算法通常适用于一些具有最优子结构的问题,即问题的最优解可以通过一系列局部最优解的选择得到。 贪心算法的基本思路是&a…...

C++ 设计模式:工厂方法(Factory Method)
链接:C 设计模式 链接:C 设计模式 - 抽象工厂 链接:C 设计模式 - 原型模式 链接:C 设计模式 - 建造者模式 工厂方法(Factory Method)是创建型设计模式之一,它提供了一种创建对象的接口…...

手机联系人 查询 添加操作
Android——添加联系人_android 添加联系人-CSDN博客 上面连接添加联系人已测试 是可以 Android : 获取、添加、手机联系人-ContentResolver简单应用_contentresolver 添加联系人-CSDN博客...

【LeetCode】2506、统计相似字符串对的数目
【LeetCode】2506、统计相似字符串对的数目 文章目录 一、哈希表位运算1.1 哈希表位运算 二、多语言解法 一、哈希表位运算 1.1 哈希表位运算 每个字符串, 可用一个 int 表示. (每个字符 是 int 的一个位) 哈希表记录各 字符组合 出现的次数 步骤: 遇到一个字符串, 得到 ma…...

金仓数据库对象访问权限的管理
基础知识 对象的分类 数据库的表、索引、视图、缺省值、规则、触发器等等,都称为数据库对象,对象分为如下两类: 模式(SCHEMA)对象:可以理解为一个存储目录,包含视图、索引、数据类型、函数和操作符等。非模式对象:其他的数据库对象&#x…...

Qt 中实现系统主题感知
【写在前面】 在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观。 Qt 作为一个跨平台的C图形用户界面应用程序开发框架,提供…...

Modbus TCP 报文说明
Modbus TCP 报文说明 Modbus TCP 报文结构报文解析功能码说明Modbus 功能码与 PLC 地址的对应关系 Modbus TCP 报文结构 事务标识符(Transaction Identifier,2 字节): 用于匹配请求和响应,通常由客户端生成࿰…...

音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现
音视频入门基础:MPEG2-TS专题系列文章: 音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载 音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件 音视频入门基础…...

大模型:OneFitsAll、Time - LLM、LLaTA
LLM数据集:ETT、Illness、Weather ETT、Illness、Weather在上述提到的论文中都是用于时间序列预测研究的真实世界数据集,以下是对它们的具体介绍: ETT数据集 内容:ETT是电力变压器温度(Electric Transformer Temperature)数据集,通常包含电力变压器在不同时间点的温度…...

连锁餐饮行业数据可视化分析方案
引言 随着连锁餐饮行业的迅速发展,市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势,以制定科学合理的决策,提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据,通过直观、动态的可…...

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程
Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程 作者:Witheart更新时间:20241228 本教程将详细介绍如何将 U 盘格式化为 ext4、FAT32 和 exFAT 文件系统,同时包括如何安装必要工具(如 exfat-utils&#x…...

多说话人ASR的衡量指标和有效计算工具包
WER (Word Error Rate) 定义:预测的识别语音序列于groundtruth抄本之间的编辑距离 除以 ground truth抄本的单词数量 编辑距离 (预测的识别语音序列,groundtruth 抄本)/ ground truth抄本的单词数量 英文定义:It is g…...

英伟达(NVIDIA)
本文来自智谱清言 ------------------------------ 英伟达(NVIDIA)是一家成立于1993年的美国跨国科技公司,由黄仁勋、克里斯马拉科夫斯基和柯蒂斯普里姆共同创立。公司总部位于加利福尼亚州圣克拉拉市。英伟达最初专注于图形芯片的设计&…...

【环境配置】Jupyter Notebook切换虚拟环境
在Jupyter Notebook中是可以切换虚拟环境的,以下是几种常见的方法: 方法一:使用nb_conda_kernels扩展(适用于Anaconda环境) 安装 如果你使用的是Anaconda环境,首先确保你已经安装了 nb_conda 包。如果没…...