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

基于STM32F103与L9110s的直流电机PWM调速实战

1. 硬件准备与电路连接在开始STM32F103与L9110s的直流电机控制项目前我们需要先准备好必要的硬件组件。这个部分我会详细列出所需材料并解释如何正确连接它们。我第一次做这个项目时就因为接线问题折腾了半天希望你们能避开这些坑。核心硬件清单STM32F103C8T6最小系统板蓝色小板子淘宝30块钱就能买到L9110s电机驱动模块注意是双H桥版本别买成单路的5V直流电机建议先用小功率电机测试比如130电机杜邦线若干建议用公对母的连接方便电源可以用USB供电或者外接5V电源电路连接示意图STM32的PB8引脚 → L9110s的B-IASTM32的PB9引脚 → L9110s的B-IB电机两端 → L9110s的电机输出端电源正极 → L9110s的VCC电源负极 → L9110s的GND这里有个容易出错的地方L9110s模块上有两组接口A和B我们只需要用其中一组来控制单个电机。我第一次就傻乎乎地把电机接在了A组和B组之间结果电机根本不转。后来仔细看手册才发现每组接口是独立的应该把电机接在同一组的两个输出端上。注意给电机供电时建议先用可调电源测试慢慢调高电压观察电机反应。直接上大电压可能会烧毁驱动芯片。2. GPIO配置与PWM初始化硬件连接好后就要开始写代码了。这部分我会带大家一步步配置STM32的GPIO和PWM功能。虽然标准库已经帮我们封装了很多细节但理解底层原理还是很重要的。GPIO配置步骤首先开启GPIOB的时钟这个千万不能忘配置PB8为通用推挽输出模式控制方向配置PB9为复用推挽输出模式PWM输出void GPIO_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; // PB8 方向控制 GPIO_InitStruct.GPIO_Pin GPIO_Pin_8; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStruct); // PB9 PWM输出 GPIO_InitStruct.GPIO_Pin GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽 GPIO_Init(GPIOB, GPIO_InitStruct); }PWM初始化关键点使用TIM4的通道4对应PB9引脚预分频值(PSC)设为71这样计数器时钟为1MHz72MHz/(711)自动重装载值(ARR)设为999这样PWM频率约为1kHz1MHz/1000PWM模式选择模式1高电平有效void PWM_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Prescaler 71; TIM_TimeBaseStruct.TIM_Period 999; TIM_TimeBaseStruct.TIM_ClockDivision 0; TIM_TimeBaseStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, TIM_TimeBaseStruct); TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse 0; // 初始占空比0% TIM_OCInitStruct.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC4Init(TIM4, TIM_OCInitStruct); TIM_Cmd(TIM4, ENABLE); }在实际项目中我发现PWM频率设置在1kHz-5kHz之间效果最好。频率太低电机会有噪音太高则可能导致驱动芯片发热。可以根据实际电机特性调整TIM_Prescaler和TIM_Period的值。3. 电机方向控制逻辑控制电机正反转是驱动模块的核心功能。L9110s的逻辑其实很简单但刚开始使用时容易混淆。下面我通过真值表来解释控制逻辑。L9110s控制真值表IAIB电机状态00停止10正转01反转11停止根据这个表我们可以写出控制函数void Motor_Ctrl(MotorState state, uint16_t speed) { switch(state){ case MOTOR_STOP: GPIO_ResetBits(GPIOB, GPIO_Pin_8); GPIO_ResetBits(GPIOB, GPIO_Pin_9); break; case MOTOR_CW: // 正转 GPIO_SetBits(GPIOB, GPIO_Pin_8); GPIO_ResetBits(GPIOB, GPIO_Pin_9); TIM4-CCR4 speed; break; case MOTOR_CCW: // 反转 GPIO_ResetBits(GPIOB, GPIO_Pin_8); GPIO_SetBits(GPIOB, GPIO_Pin_9); TIM4-CCR4 speed; break; } }这里有个实用技巧在切换方向前最好先让电机停止一小会儿比如50ms。我遇到过直接切换方向导致驱动芯片保护的情况加入短暂延时后就解决了。4. 动态调速实现与优化PWM调速的精髓在于动态调整占空比。我们可以通过改变TIM4-CCR4的值来实时调整电机速度。下面分享几种常见的调速方式。基础调速示例// 简单递增调速 for(int i0; i1000; i100){ TIM4-CCR4 i; Delay_ms(500); }按键调速实现// 按键控制速度增减 if(KEY_UP_Pressed()){ // 加速 if(speed 1000) speed 50; TIM4-CCR4 speed; } if(KEY_DOWN_Pressed()){ // 减速 if(speed 0) speed - 50; TIM4-CCR4 speed; }PID调速进阶 对于需要精确控制速度的场景可以加入PID算法。这里给出一个简化版的实现思路float PID_Control(float target, float actual) { static float integral 0; static float last_error 0; float error target - actual; integral error * dt; float derivative (error - last_error) / dt; last_error error; return Kp*error Ki*integral Kd*derivative; } // 使用时 speed PID_Control(targetSpeed, actualSpeed); TIM4-CCR4 (uint16_t)speed;在实际应用中我发现电机启动时需要较大的初始PWM值才能转动这个值称为启动阈值。可以在代码中加入判断当速度从0开始增加时先给一个较大的初始值比如300然后再按正常逻辑调整。5. 常见问题排查调试过程中难免会遇到各种问题这里总结几个我踩过的坑和解决方法。电机不转检查电源用万用表测量VCC和GND之间是否有电压检查接线确认电机接在同一个H桥的输出端检查信号用示波器看PWM波形是否正常输出电机抖动或噪音大调整PWM频率尝试1kHz-5kHz不同频率检查电源容量电源功率不足会导致电压跌落加入滤波电容在电机两端并联0.1uF电容驱动芯片发热严重检查负载电机电流是否超过L9110s的额定值800mA检查死区时间快速切换方向可能导致直通加强散热可以加装小型散热片有个特别隐蔽的问题当PWM占空比为0%或100%时有些电机驱动芯片会进入特殊模式。我建议将占空比限制在5%-95%范围内这样可以避免一些奇怪的问题。6. 项目扩展思路基础功能实现后可以考虑加入更多实用功能。这里分享几个我实践过的扩展方案。速度闭环控制 通过编码器或霍尔传感器获取实际转速与目标转速比较后调整PWM。可以使用正交编码器接口如TIM2或TIM3的编码器模式来读取电机转速。电流检测保护 在电机回路串联小电阻用运放放大电压后通过ADC检测。当电流过大时自动切断输出保护驱动芯片。无线控制 加入蓝牙模块如HC-05或WiFi模块ESP8266通过手机APP远程控制电机速度和方向。多电机同步 如果需要控制多个电机可以使用多个定时器的PWM通道。STM32F103有多个定时器资源合理分配可以实现复杂的多轴控制。我在一个机械臂项目中就用到了三路PWM分别控制三个关节电机。关键是要规划好定时器资源避免通道冲突。比如TIM1_CH1 → 电机1TIM2_CH2 → 电机2TIM4_CH4 → 电机37. 实际应用案例最后分享一个真实的项目案例帮助大家理解这些技术如何应用到实际产品中。智能小车速度控制系统使用两个L9110s分别控制左右轮电机通过TIM1和TIM4产生两路独立PWM编码器反馈实际转速PID算法维持恒定速度无线遥控调整目标速度关键代码结构void main() { Hardware_Init(); PID_Init(); while(1){ leftSpeed Get_Target_Speed(LEFT); rightSpeed Get_Target_Speed(RIGHT); leftActual Encoder_Read(LEFT); rightActual Encoder_Read(RIGHT); leftPWM PID_Calc(leftSpeed, leftActual); rightPWM PID_Calc(rightSpeed, rightActual); Motor_Set(LEFT, leftPWM); Motor_Set(RIGHT, rightPWM); Delay_ms(10); } }在这个项目中最大的挑战是两轮速度同步。由于电机特性差异同样的PWM值可能导致不同转速。后来我加入了PID算法和转速反馈问题才得到解决。这也说明单纯的PWM开环控制精度有限闭环控制才是更可靠的方案。

相关文章:

基于STM32F103与L9110s的直流电机PWM调速实战

1. 硬件准备与电路连接 在开始STM32F103与L9110s的直流电机控制项目前,我们需要先准备好必要的硬件组件。这个部分我会详细列出所需材料,并解释如何正确连接它们。我第一次做这个项目时,就因为接线问题折腾了半天,希望你们能避开这…...

Unity ObjectPool性能优化实战:从基础使用到高频对象管理

1. 为什么需要对象池?游戏性能的隐形杀手 在开发射击类游戏或AR应用时,最影响性能的往往不是华丽的特效,而是那些看似简单的对象创建与销毁操作。想象一下这样的场景:玩家每秒发射20发子弹,每发子弹存活2秒&#xff0c…...

再论几种工业视觉技术的本质差异(续)

——CV、MV、AIV、VSV、TVA之间微妙但惊人差异传统计算机视觉(CV)、机器视觉(MV)、常规 AI 视觉(AIV)、视频流视觉(VSV)等图像识别技术,普遍存在高度依赖人工特征设计、研…...

IC版图新手避坑:用Layout XL做Floorplan时,关闭飞线的正确姿势与常见误区

IC版图设计实战:Layout XL飞线管理的艺术与科学 在IC版图设计的世界里,飞线(Rubber Band)就像一把双刃剑——它既是连接关系的直观体现,也可能成为视觉干扰的源头。特别是当设计规模达到数万甚至数十万门级时&#xff…...

QUALCOMM高通 AR8031-AL1A-R QFN48 以太网收发器

功能特性 符合IEEE802.3标准的10/100/1000BASE-T支持1000BASE-TPCS和自动协商,支持下一页功能支持RGMII和/或SGMII接口连接MAC设备 当MAC接口在RGMII模式下工作时,支持光纤和铜缆组合模式支持额外的IEEE1000 BASE-X和100 BASE-FX,并集成SerDesRGMII时序模…...

EspDn32Mqtt:ESP32/ESP8266轻量级MQTT客户端封装库

1. EspDn32Mqtt 库深度解析:面向 ESP8266/ESP32 的轻量级 MQTT 客户端封装实践1.1 库定位与工程价值EspDn32Mqtt 是一个专为 ESP8266 和 ESP32 平台设计的轻量级 MQTT 客户端封装库。其核心目标并非替代PubSubClient或 ESP-IDF 原生mqtt_client,而是在保…...

SAP MTS计划策略实战:从策略10到52的配置差异与业务场景适配指南

1. SAP MTS计划策略入门:理解按库存生产的基础逻辑 刚接触SAP的生产计划模块时,我被各种计划策略搞得晕头转向。直到有次在汽车零部件厂实施项目,看到流水线上堆积如山的标准件,才真正理解**按库存生产(Make-To-Stock&…...

如何免费获取网盘直链:8大平台下载速度提升5倍的终极指南

如何免费获取网盘直链:8大平台下载速度提升5倍的终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

SpringBoot3与OAuth2.1实战:从/oauth/token到/oauth2/token的平滑迁移指南

1. 为什么需要从/oauth/token迁移到/oauth2/token 最近在升级SpringBoot3项目时,遇到了一个棘手的问题:原先运行良好的OAuth2认证接口突然失效了。仔细排查后发现,原来是Spring Security 6.x彻底重构了OAuth2的实现方式,最直观的…...

宝马集团采用PTC的Codebeamer实现需求管理标准化并推动数字工程发展

2026年4月8日,PTC宣布,全球高端汽车创新领域的领导者宝马集团已成功部署PTC的Codebeamer应用生命周期管理(ALM)解决方案,将其作为下一代数字工程的基础。2026年4月8日,PTC宣布,全球高端汽车创新…...

从抓包到洞察:Wireshark实战解析HTTP协议核心交互

1. 为什么我们需要抓包分析HTTP协议 刚开始接触网络协议分析时,很多人都会有这样的疑问:为什么非要大费周章地抓包?直接看文档不行吗?这个问题我也曾经困惑过,直到第一次用Wireshark亲眼看到真实的HTTP报文在眼前流动&…...

SecGPT-14B模型微调:提升OpenClaw在特定安全场景的准确率

SecGPT-14B模型微调:提升OpenClaw在特定安全场景的准确率 1. 为什么需要定制安全场景模型 去年我在尝试用OpenClaw自动化处理服务器日志时,发现一个尴尬的现象:当遇到"疑似入侵行为"的日志条目时,通用大模型要么过度敏…...

STM32F103C8T6实战:I2C驱动STP23L测距传感器与OLED显示优化

1. 项目背景与硬件选型 第一次接触STM32F103C8T6驱动STP23L测距传感器时,我完全没料到这个蓝色小模块会成为后续多个项目的核心组件。STP23L是一款基于TOF(飞行时间)原理的激光测距传感器,测量范围0.1-3米,精度可达1m…...

Human3.6M数据集获取与预处理实战指南:从百度网盘到可用的.pkl文件

1. Human3.6M数据集简介与下载准备 Human3.6M是目前人体姿态估计领域最权威的基准数据集之一,包含11名专业演员在17种日常活动场景下的360万帧动作捕捉数据。我第一次接触这个数据集时,面对近50GB的原始文件和复杂的目录结构也一头雾水。这里分享从下载到…...

仅限首批200名AI基础设施工程师:Cuvil 2024Q3内部编译诊断工具集(含AST可视化插件与算子融合热力图)

第一章:Cuvil编译器在Python AI推理中的定位与价值Cuvil编译器是一个面向AI推理场景的轻量级、Python原生友好的编译框架,专为优化动态图模型(如PyTorch TorchScript子集、ONNX子图及自定义算子图)在CPU/GPU边缘设备上的执行效率而…...

在VMware虚拟机里用CentOS 7.5手把手搭建OpenVPN 2.4.12服务器(附完整证书生成与防火墙配置)

在虚拟化环境中构建安全通信通道的技术实践 虚拟化技术为现代IT基础设施提供了灵活性和隔离性,而在这类环境中建立安全的通信通道则是许多开发者和运维人员的刚需。本文将聚焦于如何在VMware虚拟化平台上,基于CentOS 7.5系统构建一套完整的加密通信解决…...

深入浅出:图解5G NR中UCI复用与资源抢占的那些事儿

5G NR上行控制信道的资源博弈:UCI复用机制全景解析 想象一下,在一个繁忙的十字路口,各种车辆(出租车、救护车、私家车)都在争夺有限的通行权。5G上行控制信道中的UCI复用场景与之惊人地相似——SR(调度请求…...

5个核心价值:docx2tex实现DOCX到LaTeX的高效转换

5个核心价值:docx2tex实现DOCX到LaTeX的高效转换 【免费下载链接】docx2tex Converts Microsoft Word docx to LaTeX 项目地址: https://gitcode.com/gh_mirrors/do/docx2tex 在学术论文撰写中,一位研究生花费数小时手动调整从Word转换过来的LaTe…...

告别C盘空间焦虑:手把手教你将MySQL和PATSTAT专利库完整部署到移动硬盘

告别C盘空间焦虑:手把手教你将MySQL和PATSTAT专利库完整部署到移动硬盘 当你的研究项目需要处理数百GB的专利数据,而笔记本电脑的C盘只剩下可怜的几GB空间时,那种焦虑感堪比论文截止日期前夜的打印机卡纸。PATSTAT这样的专利数据库就像知识宝…...

Kubernetes集群的灾难恢复方案

Kubernetes集群的灾难恢复方案 🔥 硬核开场 各位技术老铁,今天咱们聊聊Kubernetes集群的灾难恢复方案。别跟我扯那些理论,直接上干货!在生产环境中,Kubernetes集群面临着各种潜在的灾难,如节点故障、网络中…...

5个让老旧电脑也能流畅运行碧蓝航线自动脚本的优化技巧

5个让老旧电脑也能流畅运行碧蓝航线自动脚本的优化技巧 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为老旧电脑运行A…...

Fish Speech-1.5企业级应用:教育课件配音、政务播报、跨境电商本地化

Fish Speech-1.5企业级应用:教育课件配音、政务播报、跨境电商本地化 1. 快速上手:用Fish Speech-1.5生成专业级语音 想象一下这样的场景:你是一名教育工作者,需要为在线课程录制配音,但自己的声音不够专业&#xff…...

3步轻松解密QQ音乐加密文件:qmc-decoder终极指南

3步轻松解密QQ音乐加密文件:qmc-decoder终极指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经在QQ音乐下载了心爱的歌曲,却发现只能在…...

Linux内核SLUB调试之slabinfo工具

前面我们介绍了Linux内核SLUB调试功能,现在我们来介绍一下slabinfo等相关的工具,这对于理解并调试slab缓存功能很有帮助。 slabinfo介绍 slabinfo 不是普通系统命令,而是内核源码自带的官方调试工具。 它的源码位于内核源码树的tools/mm/slabinfo.c,由内核社区直接维护,…...

【软件部署】docker快速部署MySQL多个主版本的单实例

说明 使用docker快速部署MySQL多个主版本的单实例容器。最新子版本。 MySQL5 创建文件compose.yamlservices:mysql5-single:image: mysql:5.7.44container_name: mysql5-singlerestart: unless-stoppedports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_P…...

失业期PHP程序员,能合作就别对着干。多一个朋友,少一个敌人。

这句话是失业期 PHP 程序员在资源匮乏环境下,从“零和博弈”转向“正和博弈”的生存智慧。 它的本质是:承认个体力量的局限性,通过降低人际摩擦系数,将潜在的竞争对手转化为互补的合作伙伴。在失业期,你的核心资产不是…...

极坐标曲线绘制的艺术:从基础图形到复杂路径

1. 极坐标曲线绘制入门指南 第一次接触极坐标曲线时,我被它独特的数学美感深深吸引。与常见的直角坐标系不同,极坐标用距离和角度来描述点的位置,这种表达方式让某些图形的绘制变得异常简单。记得刚开始学习时,我花了整整一个周末…...

基于SpringBoot开发的预约停车系统共享停车位小程序app

在城市化进程加速的今天,汽车保有量以年均数百万辆的速度激增,而停车位建设却始终滞后。据统计,我国一线城市核心区域车位缺口率普遍超过50%,医院、景区、商圈等场景“一位难求”的现象已成为制约城市运转效率的痛点。在此背景下&…...

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

语义通信实战:轻量级图像压缩重建网络从零实现(PyTorch版) 在无人机巡检、远程医疗等物联网场景中,传统图像传输常面临带宽与功耗的双重压力。我们团队去年为某农业无人机项目部署图像识别系统时,发现传统JPEG2000压缩…...

AMD Ryzen底层硬件调试:如何通过SMU Debug Tool实现处理器性能的精确控制与优化

AMD Ryzen底层硬件调试:如何通过SMU Debug Tool实现处理器性能的精确控制与优化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table…...