当前位置: 首页 > article >正文

用STM32F103ZET6和两个L298N驱动板,手把手教你做一个能调速的四轮小车(附完整代码)

基于STM32F103与L298N的四驱智能小车全流程开发指南在嵌入式开发领域电机控制一直是连接数字世界与物理运动的关键桥梁。当STM32微控制器遇上经典的L298N驱动模块再配合精准的PWM调速技术一个灵活可控的四驱小车平台便呼之欲出。本文将完整呈现从硬件搭建到软件调优的全过程特别针对双L298N协同工作场景提供经过实战检验的解决方案。1. 硬件架构设计与关键元件解析1.1 L298N驱动模块深度配置作为电机驱动核心L298N模块的正确配置直接决定系统稳定性。每个L298N可独立驱动两个直流电机其内部采用H桥电路设计支持电压范围5-35V峰值电流可达2A。双模块配置时需特别注意电源管理主电源建议使用12V/2A以上锂电池组逻辑供电可选择跳帽5V输出或外接独立5V电源两模块共地连接必不可少信号接口定义引脚类型功能描述连接注意事项ENA/ENBPWM调速使能端必须移除跳帽启用PWM模式IN1-IN4转向控制输入需匹配STM32输出电平OUT1-OUT4电机输出端注意极性防止反转1.2 STM32F103ZET6引脚分配策略合理规划GPIO资源是项目成功的基础。TIM3定时器的四个通道完美匹配四电机PWM需求// TIM3通道与GPIO对应关系 #define PWM_CH1 PA6 // 左前电机速度 #define PWM_CH2 PA7 // 左后电机速度 #define PWM_CH3 PB0 // 右前电机速度 #define PWM_CH4 PB1 // 右后电机速度 // 方向控制引脚分配 #define M1_IN1 PB7 // 左前电机方向A #define M1_IN2 PB6 // 左前电机方向B #define M2_IN1 PB9 // 左后电机方向A #define M2_IN2 PB2 // 左后电机方向B #define M3_IN1 PB13 // 右前电机方向A #define M3_IN2 PB12 // 右前电机方向B #define M4_IN1 PB15 // 右后电机方向A #define M4_IN2 PB14 // 右后电机方向B提示实际布线时建议使用杜邦线颜色区分功能组如红色接PWM线黄色接方向线黑色统一接地。2. PWM调速系统实现细节2.1 TIM3定时器精准配置STM32的通用定时器提供灵活的PWM生成能力。以下关键参数需要特别关注void TIM3_PWM_Init(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_BaseStruct; TIM_OCInitTypeDef TIM_OCStruct; // 时基配置 TIM_BaseStruct.TIM_Period arr; // 自动重装载值 TIM_BaseStruct.TIM_Prescaler psc; // 预分频系数 TIM_BaseStruct.TIM_ClockDivision 0; // 时钟分割 TIM_BaseStruct.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 // PWM模式配置 TIM_OCStruct.TIM_OCMode TIM_OCMode_PWM2; // PWM模式2 TIM_OCStruct.TIM_OutputState TIM_OutputState_Enable; TIM_OCStruct.TIM_OCPolarity TIM_OCPolarity_High; // 有效电平高 // 四个通道初始化 TIM_OC1Init(TIM3, TIM_OCStruct); TIM_OC2Init(TIM3, TIM_OCStruct); TIM_OC3Init(TIM3, TIM_OCStruct); TIM_OC4Init(TIM3, TIM_OCStruct); }参数计算实例 假设系统时钟72MHz需要20kHz PWM频率预分频系数psc0不分频自动重装载值arr(72000000/20000)-135992.2 动态调速实现技巧通过实时调整CCR寄存器值实现速度控制// 设置电机速度函数 void SetMotorSpeed(u8 motor_id, u16 speed) { switch(motor_id) { case 1: TIM_SetCompare1(TIM3, speed); break; case 2: TIM_SetCompare2(TIM3, speed); break; case 3: TIM_SetCompare3(TIM3, speed); break; case 4: TIM_SetCompare4(TIM3, speed); break; } } // 渐进加速示例 void SmoothAcceleration(u16 target_speed) { for(u16 i0; itarget_speed; i10) { SetMotorSpeed(1, i); SetMotorSpeed(2, i); SetMotorSpeed(3, i); SetMotorSpeed(4, i); delay_ms(20); } }3. 运动控制算法实现3.1 基础运动模式封装将常见运动状态抽象为函数接口// 前进函数 void CarForward(u16 speed) { // 设置方向 GPIO_ResetBits(GPIOB, GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_13 | GPIO_Pin_15); GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_2 | GPIO_Pin_12 | GPIO_Pin_14); // 设置速度 TIM_SetCompare1(TIM3, speed); TIM_SetCompare2(TIM3, speed); TIM_SetCompare3(TIM3, speed); TIM_SetCompare4(TIM3, speed); } // 差速转向函数 void CarTurn(u16 base_speed, u8 direction, float ratio) { u16 left_speed base_speed; u16 right_speed base_speed; if(direction TURN_LEFT) { right_speed base_speed * (1 ratio); } else { left_speed base_speed * (1 ratio); } TIM_SetCompare1(TIM3, left_speed); // 左前 TIM_SetCompare2(TIM3, left_speed); // 左后 TIM_SetCompare3(TIM3, right_speed); // 右前 TIM_SetCompare4(TIM3, right_speed); // 右后 }3.2 运动控制状态机设计采用状态机模式管理复杂运动序列typedef enum { STATE_IDLE, STATE_FORWARD, STATE_BACKWARD, STATE_TURN_LEFT, STATE_TURN_RIGHT, STATE_BRAKE } CarState; void CarStateMachine(CarState state, u16 param) { static CarState prev_state STATE_IDLE; if(prev_state ! state) { // 状态转换处理 switch(state) { case STATE_FORWARD: CarForward(param); break; case STATE_TURN_LEFT: CarTurn(param, TURN_LEFT, 0.3f); break; // 其他状态处理... } prev_state state; } }4. 系统优化与调试技巧4.1 常见问题排查指南电机抖动不转检查ENA/ENB跳帽是否已移除测量PWM信号是否正常输出确认电源功率足够驱动四个电机转向不对称校准各电机基准速度检查机械结构是否对称调整差速转向比例参数L298N发热严重确保散热片安装良好检查是否出现电机堵转考虑增加外部续流二极管4.2 性能提升实践电源优化方案[电源架构示意图] 电池 - 12V稳压 - L298N主电源 ↓ 5V稳压 - STM32供电软件滤波实现#define FILTER_DEPTH 5 u16 SpeedFilter(u16 new_val) { static u16 buf[FILTER_DEPTH] {0}; static u8 index 0; u32 sum 0; buf[index] new_val; if(index FILTER_DEPTH) index 0; for(u8 i0; iFILTER_DEPTH; i) { sum buf[i]; } return sum / FILTER_DEPTH; }运动参数推荐值运动模式PWM基准值持续时间(ms)加速度步长平稳启动30050010高速运行800--急停刹车010050

相关文章:

用STM32F103ZET6和两个L298N驱动板,手把手教你做一个能调速的四轮小车(附完整代码)

基于STM32F103与L298N的四驱智能小车全流程开发指南 在嵌入式开发领域,电机控制一直是连接数字世界与物理运动的关键桥梁。当STM32微控制器遇上经典的L298N驱动模块,再配合精准的PWM调速技术,一个灵活可控的四驱小车平台便呼之欲出。本文将完…...

SQL中窗口函数的LIMIT限制逻辑_如何分页显示

窗口函数不支持在OVER()中使用LIMIT,正确分页需先用ROW_NUMBER()等生成序号,再在外层WHERE中筛选范围;ORDER BY必须包含唯一字段(如主键)以保证分页稳定性。窗口函数本身不支持 LIMIT,别在 OVER() 里写 LIM…...

实战避坑|Java部署YOLO全踩坑实录:模型加载失败/推理延迟高一站式解决

前言 在工业视觉检测、智能安防上位机、嵌入式视觉项目中,Java凭借跨平台、生态成熟、适配Windows/统信UOS等优势,成为大量企业级视觉项目的首选开发语言。但在实际部署YOLOv5/v8/v11模型时,几乎所有开发者都会遇到两个致命问题:模…...

工业级实战:Java优化YOLO推理全流程,帧率稳定突破30FPS实时检测

前言 在工业视觉检测、智能安防、现场实时识别等落地场景中,Java凭借其跨平台兼容性、成熟的企业级生态以及稳定的运行特性,依旧是大量后端与桌面视觉项目的核心开发语言。但谈及YOLO系列目标检测模型的推理部署,业内普遍存在固有认知&#x…...

DownKyi:B站视频下载的完整指南,从入门到精通

DownKyi:B站视频下载的完整指南,从入门到精通 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…...

Seraphine终极指南:英雄联盟自动BP与战绩查询的完整解决方案

Seraphine终极指南:英雄联盟自动BP与战绩查询的完整解决方案 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于LCU API开发的免费开源英雄联盟战绩查询工具,它不仅提…...

5千字长文:一篇看懂 Agent Harness 的结构!

这篇文章我提取的最核心的一句话是:Agent Model Harness。 模型负责智能,Harness 负责把这份智能变成能持续工作的系统。真正决定 agent 上限的,不只是底座模型,而是模型外面的那整套文件系统、工具、记忆、状态、验证和上下文…...

首篇全新情景认知视角的大模型Agent综述

大家都在谈 Agent,真正拉开差异的关键,来自我们怎样理解 Agent。 若将 Agent 理解为由规划、记忆、行动、反思组成的系统,读者很快会记住一串模块名,却较难抓住它在真实环境里怎样持续工作。中科大的这篇 Survey 试图把问题向前推…...

XUnity.AutoTranslator完整教程:轻松实现Unity游戏实时翻译

XUnity.AutoTranslator完整教程:轻松实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的外文游戏而烦恼吗?XUnity.AutoTranslator是一款功能强大…...

从玩具车到智能车:给你的51单片机循迹小车加上LCD1602和蓝牙遥控(HC-05/06)

从玩具车到智能车:51单片机循迹小车的LCD1602与蓝牙遥控升级指南 当你看着自己亲手组装的51单片机循迹小车沿着黑线平稳运行时,那种成就感不言而喻。但作为创客,我们总想让项目更上一层楼——为什么不给它加上实时数据显示和手机遥控功能&…...

DownKyi:解锁B站视频自由存取的数字工具箱

DownKyi:解锁B站视频自由存取的数字工具箱 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。 …...

STM32 RTC掉电后时间不准?手把手教你排查VBAT供电和LSE晶振问题

STM32 RTC掉电后时间不准?手把手教你排查VBAT供电和LSE晶振问题 当产品需要持续计时功能时,STM32的RTC模块往往是首选方案。但在实际项目中,工程师们常会遇到一个棘手问题:设备断电重启后,RTC时间出现明显偏差甚至完全…...

STM32G474硬件IIC+DMA驱动OLED翻车实录:从软件IIC迁移到DMA的三大坑与解决方案

STM32硬件IICDMA驱动OLED的进阶实战:从软件迁移到DMA的深度避坑指南 当你在STM32项目中使用软件IIC驱动OLED屏幕时,可能会遇到性能瓶颈。这时候,硬件IICDMA的组合看起来是个完美的解决方案——理论上它能大幅降低CPU负载,提升整体…...

LLM Wiki + Research Skill Graph + Obsidian 从零构建你的个人知识库和研究引擎

2026年4月3日,安德烈卡帕西(OpenAI联合创始人、特斯拉前人工智能主管,也是“氛围编程”一词的创造者)发布了一条标题为“大语言模型知识库”的推文,讲述了他如今如何利用大语言模型构建个人知识维基,而非仅…...

3大智能功能,彻底改变你的英雄联盟BP体验

3大智能功能,彻底改变你的英雄联盟BP体验 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否还在为排位赛BP阶段手忙脚乱而烦恼?是否因为犹豫不决错过了最佳英雄选择时机&#xff1…...

HsMod终极指南:55项炉石传说增强功能完全解析与实战配置教程

HsMod终极指南:55项炉石传说增强功能完全解析与实战配置教程 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说游戏增强插件,为…...

XUnity.AutoTranslator完全指南:5分钟实现Unity游戏实时翻译

XUnity.AutoTranslator完全指南:5分钟实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经遇到过一款精彩的Unity游戏,但因为语言障碍而无法完全享受游…...

开源百度网盘提取码智能解析工具:技术实现与效率优化

开源百度网盘提取码智能解析工具:技术实现与效率优化 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在云存储资源分享日益频繁的技术环境中,百度网盘提取码查询已成为开发者、研究者和内容创作者面临的…...

GHelper:华硕笔记本性能控制的终极轻量级解决方案

GHelper:华硕笔记本性能控制的终极轻量级解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, …...

3步解锁DownKyi:你的B站视频下载与管理终极解决方案

3步解锁DownKyi:你的B站视频下载与管理终极解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#xf…...

3秒解锁百度网盘资源:智能提取码查询工具完全指南

3秒解锁百度网盘资源:智能提取码查询工具完全指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗?每次看到心仪的学习资料、软件资源或影音文件,却…...

Real-Anime-Z惊艳效果:半透明衣物材质渲染+动漫式布料物理模拟对比展示

Real-Anime-Z惊艳效果:半透明衣物材质渲染动漫式布料物理模拟对比展示 1. 项目概述 Real-Anime-Z是一款基于Stable Diffusion技术的写实向动漫风格大模型,由Devilworld团队开发。这款模型最大的特点在于它独特的2.5D风格表现力——在保留真实质感的同时…...

S32K开发环境全攻略:基于S32 Design Studio和SDK的快速上手教程(含Arduino评估板)

S32K开发环境实战指南:从零构建智能车控系统 第一次拿到S32K开发板时,我盯着那排Arduino兼容的接口发呆了十分钟——这个汽车级MCU竟然能用面包板快速验证创意。NXP官方提供的工具链比想象中友好得多,但隐藏的坑也不少。本文将带你用S32 Desi…...

别再用Keil C51了!STC32G开发环境搭建避坑指南(FreeRTOS工程详解)

从C51到C251:STC32G开发环境迁移实战与FreeRTOS工程深度解析 当STC32G系列单片机以5元价位提供128KB Flash和12KB RAM的配置时,相信很多传统8051开发者都按捺不住升级的冲动。但真正开始环境迁移时,你会发现从Keil C51到Keil C251的转变远不止…...

从ARM转战RISC-V(沁恒CH32V307):写中断服务函数时,我踩过的那个‘坑’

从ARM到RISC-V的中断处理范式迁移:一位工程师的CH32V307实战手记 第一次在沁恒CH32V307开发板上触发GPIO中断时,我遭遇了职业生涯中最诡异的"一次性中断"现象——中断服务函数如同被施了魔法般仅执行一次就永久失效。作为有十年ARM Cortex-M开…...

机房摸鱼指南:手把手教你用C++卸载LibTDProcHook64.dll,绕过极域64位进程保护

深入解析极域64位系统下的进程保护机制与应对策略 在计算机教室或培训机构的日常使用中,极域电子教室软件作为教学管理工具被广泛采用。这款软件的设计初衷是为了方便教师统一控制学生机,实现屏幕广播、文件分发和远程协助等功能。然而,当学生…...

别再为电机供电发愁了!ESP12E电机拓展板与NodeMCU的电源配置详解(含L293D芯片分析)

ESP12E电机拓展板电源系统深度优化指南:从L293D芯片特性到实战供电方案 当你在机器人项目中使用NodeMCU配合ESP12E电机拓展板时,是否遇到过电机启动瞬间开发板重启、PWM信号不稳定或者L293D芯片异常发热的问题?这些现象背后往往隐藏着电源系统…...

**Vulkan实战进阶:从零构建高性能图形渲染管线(附完整代码流程)**在现代图形编程领域,**Vulkan**

Vulkan实战进阶:从零构建高性能图形渲染管线(附完整代码流程) 在现代图形编程领域,Vulkan 已成为跨平台、低开销、高性能渲染的首选 API。相比 OpenGL 或 DirectX 12,Vulkan 提供了更细粒度的控制能力,但也…...

**发散创新:基于Python的数字水印技术实战与应用深度解析**在多媒体内容日益泛

发散创新:基于Python的数字水印技术实战与应用深度解析 在多媒体内容日益泛滥的今天,版权保护已成为数字世界的核心议题之一。而数字水印技术作为信息隐藏的重要手段,正逐渐从理论走向工业级落地。本文将带你深入实践一种基于Python的鲁棒性图…...

**Jest 测试驱动开发新范式:从基础到高级实战指南**在现代前端工程化体系中,**单

Jest 测试驱动开发新范式:从基础到高级实战指南 在现代前端工程化体系中,单元测试已成为保障代码质量的核心防线。而作为 Node.js 生态中最流行的 JavaScript 测试框架之一,Jest 凭借其开箱即用的特性、出色的性能以及丰富的 API 支持&#x…...