基于STM32与BD623x的电机控制实战——从零搭建无人机/机器人驱动系统
系列文章目录
1.元件基础
2.电路设计
3.PCB设计
4.元件焊接
5.板子调试
6.程序设计
7.算法学习
8.编写exe
9.检测标准
10.项目举例
11.职业规划
文章目录
- 一、为什么选择这两个芯片?
- 1.1 STM32微控制器
- 1.2 ROHM BD623x电机驱动
- 二、核心控制原理详解
- 2.1 H桥驱动奥秘
- 2.2 PWM调速原理
- 2.3 实战电路设计
- 三、STM32程序开发实战
- 3.1 CubeMX配置步骤
- 3.2 核心控制代码
- 四、安全设计规范
- 4.1 硬件防护措施
- 4.2 软件保护策略
- 五、多电机系统扩展
- 六、调试技巧大全
- 结语
一、为什么选择这两个芯片?
1.1 STM32微控制器
- 大脑角色:作为Cortex-M系列代表,STM32F103C8T6(蓝色pill开发板)具备72MHz主频,提供精准的PWM波形控制
- 关键资源:16路12位ADC、7通道DMA、37个GPIO,满足多电机同步控制需求
1.2 ROHM BD623x电机驱动
- 肌肉角色:BD6231FVM单通道H桥驱动器,支持4.5-18V/1.2A持续输出
- 三大保护:内置过热关断(TSD)、过流保护(ISD)、低压锁定(UVLO)
选型对比:相比L298N,BD623x效率提升40%,体积缩小60%
二、核心控制原理详解
2.1 H桥驱动奥秘
// 典型控制真值表
| IN1 | IN2 | 电机状态 |
|--|---------|
| 0 | 0 | 刹车 |
| 1 | 0 | 正转 |
| 0 | 1 | 反转 |
| 1 | 1 | 停止 |
2.2 PWM调速原理
- 占空比公式:转速 ∝ (Ton / (Ton + Toff)) × 100%
- 频率选择:推荐8-20kHz(超声波频段避免噪音)
2.3 实战电路设计
接线示意图:
STM32 GPIOA0 --> BD623x IN1 (PWM1)
STM32 GPIOA1 --> BD623x IN2 (PWM2)
STM32 GND --> BD623x GND
12V电池正极 --> BD623x VM
电机端子 --> OUT1 & OUT2
滤波关键:在VM端并联100μF电解电容+0.1μF陶瓷电容
三、STM32程序开发实战
3.1 CubeMX配置步骤
- 启用TIM1_CH1(PA8)和TIM1_CH2(PA9)
- 设置PWM模式1,预分频值72-1(1MHz时基)
- 配置ARR为999(1kHz频率)
3.2 核心控制代码
// PWM初始化
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);// 转速控制函数
void SetMotorSpeed(int16_t speed) {speed = constrain(speed, -1000, 1000); // 限幅if(speed >= 0) {__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, speed);__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);} else {__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, -speed);}
}// 急停函数
void MotorEmergencyStop() {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 启用刹车__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000);__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 1000);
}
四、安全设计规范
4.1 硬件防护措施
- 在VM端串接5A自恢复保险丝
- 电机两端并联1N5819续流二极管
- 逻辑地与功率地单点连接
4.2 软件保护策略
// 过流检测中断服务
void ADC_IRQHandler(void) {if(hadc.Instance->SR & ADC_FLAG_JEOC) {uint16_t current = HAL_ADCEx_InjectedGetValue(&hadc, ADC_INJECTED_RANK_1);if(current > 1200) { // 1.2A阈值MotorEmergencyStop();Error_Handler();}}
}
五、多电机系统扩展
四轴飞行器应用示例:
typedef struct {TIM_HandleTypeDef *htim;uint32_t ch1;uint32_t ch2;
} MotorControl;MotorControl motors[4] = {{&htim1, TIM_CHANNEL_1, TIM_CHANNEL_2},{&htim1, TIM_CHANNEL_3, TIM_CHANNEL_4},{&htim2, TIM_CHANNEL_1, TIM_CHANNEL_2},{&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4}
};void SetAllMotors(int16_t *speeds) {for(uint8_t i=0; i<4; i++) {SetSingleMotor(motors[i], speeds[i]);}
}
六、调试技巧大全
- 示波器观测法:验证PWM波形占空比与频率
- 电流检测法:通过0.1Ω采样电阻监测工作电流
- 温度监控:使用红外测温仪确保芯片表面<85℃
常见故障排查:
- 电机抖动 → 检查PWM频率是否低于5kHz
- 驱动芯片发烫 → 确认是否频繁切换正反转
- 无法启动 → 测量VCC电压是否>4.5V
结语
通过本方案可实现:
- 单个电机0-100%无级调速
- 正反转快速切换(<200ns响应)
- 四轴飞行器基础姿态控制
项目进阶方向:
- 结合MPU6050实现闭环控制
- 开发CAN总线多节点控制系统
- 移植FreeRTOS实现多任务调度
相关文章:
基于STM32与BD623x的电机控制实战——从零搭建无人机/机器人驱动系统
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、为什么选择这两个芯片?1.1 STM32微控制器1.2 ROHM BD623x电机驱动 二、核心控制原理详解2.1 H桥驱动奥…...
基于ffmpeg+openGL ES实现的视频编辑工具-字幕添加(六)
在视频编辑领域,字幕的添加是一项极为重要的功能,它能够极大地丰富视频内容,提升观众的观看体验。当我们深入探究如何实现这一功能时,FreeType 开源库成为了强大助力。本文将详细阐述借助 FreeType 库生成字幕数据的过程,以及如何实现字幕的缩放、移动、旋转、颜色修改、对…...
C++中const T为什么少见?它有什么用途?
在C中,右值引用(T&&)是移动语义和完美转发的核心特性之一,但你是否注意到,const T&&(const右值引用)却很少被使用?它到底有什么用途? 今天我们就来深入…...
Leetcode 位计算
3095. 或值至少 K 的最短子数组 I 3097. Shortest Subarray With OR at Least K II class Solution:def minimumSubarrayLength(self, nums: List[int], k: int) -> int:n len(nums)bits [0] * 30res infdef calc(bits):return sum(1 << i for i in range(30) if…...
SpringBoot3.x整合WebSocket
SpringBoot3.x整合WebSocket 本文主要介绍最新springboot3.x下如何整合WebSocket. WebSocket简述 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许在浏览器和服务器之间进行实时的、双向的通信。相对于传统的基于请求和响应的 HTTP 协议ÿ…...
猿大师办公助手对比其他WebOffice在线编辑Office插件有什么优势
1. 原生Office功能完整嵌入,排版一致性保障 猿大师办公助手直接调用本地安装的微软Office、金山WPS或永中Office,支持所有原生功能(如复杂公式、VBA宏等),确保网页编辑与本地打开的文档排版完全一致。 提供OLE嵌入和完…...
STM32创建静态库lib
创建静态库lib 1. 新建工程1.1 创建工程文件夹1.2 编写用户相关代码1.2.1 stm32f4xx_it.h1.2.2 stm32f4xx_it.c1.2.3 标准库配置:stm32f4xx_conf.h1.2.4 HAL库的配置:stm32f4xx_hal_conf.h1.2.5 LL库配置:stm32f4xx_ll_conf.h 1.3 移植通用文…...
Hive JOIN过滤条件位置玄学:ON vs WHERE的量子纠缠
Hive JOIN过滤条件位置玄学:ON vs WHERE的量子纠缠 作为数据工程师,Hive JOIN就像吃火锅选蘸料——放错位置味道全变!今天带你破解字节/阿里等大厂高频面试题:ON和WHERE后的过滤条件究竟有什么不同? 一、核心差异对比表 特性ON子句WHERE子句执行时机JOIN操作时JOIN完成后…...
MAC快速本地部署Deepseek (win也可以)
MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型(LLM)本地运行框架,旨在简化大模型的部署和管理流程,使开发者、研究人员及爱好者能够高效地在本地环境中实验和…...
javaEE-13.spring MVC
目录 什么是spring web mvc: 什么是MVC: 一.创建一个spring项目 二.实现功能: 创建helloController.java项目: 建立连接: RequestMapping注解: 1.RequestMapping注解的使用: 2. RequestMapping 是GET还是POST请求 3.指定请求方法 RestControll…...
C/C++ | 每日一练 (2)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…...
Nginx 常用命令和部署详解及案例示范
一、Nginx常用命令 1.1 启动 Nginx 要启动 Nginx 服务,可以使用以下命令: sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服务,可以使用以下命令: sudo systemctl stop nginx1.3 重启 Nginx 在修改了 Nginx…...
GO大模型应用开发框架-
Eino 旨在提供基于 Golang 语言的终极大模型应用开发框架。 它从开源社区中的诸多优秀 LLM 应用开发框架,如 LangChain 和 LlamaIndex 等获取灵感,同时借鉴前沿研究成果与实际应用,提供了一个强调简洁性、可扩展性、可靠性与有效性࿰…...
保姆级!springboot访问Ollama API并调用DeepSeek模型 Api
要在springboot中访问Ollama API并调用DeepSeek模型,你需要遵循以下步骤。首先,确保你有一个有效的Ollama服务器实例运行中,并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级!使用Ollama本地部署DeepSeek-R1大模型 并java通过api 调用 使用Spring Boot + Sprin…...
力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 解题思路: 借助行和列有序特性,不断按行或者列缩小范围;途中数字表示每…...
娱乐使用,可以生成转账、图片、聊天等对话内容
软件介绍 今天要给大家介绍一款由吾爱大佬 lifeixue 开发的趣味软件。它的玩法超丰富,能够生成各式各样的角色,支持文字聊天、发红包、转账、发语音以及分享图片等多种互动形式,不过在分享前得着重提醒,此软件仅供娱乐࿰…...
【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
使用 FFmpeg 剪辑视频指南
FFmpeg 是一个功能强大的多媒体处理工具,可以进行视频和音频的剪辑、合并、转码等操作。本文将详细介绍如何使用 FFmpeg 进行视频剪辑,并通过实例帮助你快速掌握剪辑技巧。我们会从最基础的剪切功能讲起,再延伸到一些高级操作,如指…...
AWS云从业者认证题库 AWS Cloud Practitioner
题库持续更新,上方二维码查看完整题库! 在分担责任模型下,客户对以下哪项负责? A:确保在使用后擦除磁盘驱动器 B:确保在硬件设备上更新固件 C:确保静态数据已加密 D:确保网线为六类或更高类…...
高性能内存对象缓存Memcached详细实验操作
目录 前提准备: cache1,2: 客户端cache-api(一定得是LAMP环境) memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备: 1. 准备三台cent…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
