STM32 Foc开源算法,包括观测器和Foc method STM32F0系列FOC 源代码

STM32 Foc开源算法,包括观测器和Foc method STM32F0系列FOC 源代码

STM32 Foc开源算法,包括观测器和Foc method STM32F0系列FOC 源代码, 有单电阻采样和三电阻采样两种代码。 都是ST很经典算法,代码学习,无感算法观测器是开源代码,Foc method也是开源,不是库。

深夜调完电机准备收工,突然发现实验室角落积灰的STM32F0开发板。这玩意儿当年可是玩FOC的初代神器,今天咱们就扒一扒ST官方藏在GitHub暗处的FOC开源遗产——不带库的纯裸代码,单电阻三电阻玩法都有,观测器源码直接摊开给你看。

电流采样:单电阻的骚操作

单电阻方案最让人头秃的就是电流重构,ST的代码里藏着这样的玄机:

void ADC_Handler(void) { if(ADC_GetFlagStatus(ADC_FLAG_EOC)) { // 捕获三个PWM周期内的不同采样点 switch(sampling_phase) { case 0: currA = ADC_GetValue() * voltage_scale; break; case 1: currB = (ADC_GetValue() - currA) * voltage_scale; break; // ...其他相位处理 } // 相位计数器滚起来 sampling_phase = (sampling_phase + 1) % 6; } }

这段代码老司机一看就懂——通过PWM周期内不同时刻的采样拼凑电流波形。重点在case1里那个currB = ADC值减currA的操作,这其实是在做基尔霍夫电流定律的硬件级实现(Ia + Ib + Ic = 0)。注意这里的voltage_scale系数,实际调参时得拿着万用表校准,不然测出来的电流能飘到姥姥家。

三电阻的暴力美学

切到三电阻分支代码,画风突变:

void TIM1_UP_IRQHandler(void) { // PWM中点对齐模式触发三重采样 ADC_StartConversion(); while(!ADC_GetFlagStatus(ADC_FLAG_EOC)); // 死等ADC完成 currA_raw = ADC_GetValue(ADC_Channel_1); currB_raw = ADC_GetValue(ADC_Channel_2); currC_raw = ADC_GetValue(ADC_Channel_3); // 直接三相全采,就是这么豪横 Clarke_Transform(currA_raw, currB_raw, currC_raw, &Ialpha, &Ibeta); }

三电阻方案简单粗暴,但ADC时序要跟PWM严格同步。注意那个while死等——在F030这种低端芯片上敢这么玩,说明ST的工程师对中断响应时间掐得贼准。实测下来这个循环最多吃3个时钟周期,刚好卡在ADC转换完成后的时间窗里。

观测器里的黑魔法

开源观测器代码里有段神仙操作:

void Observer_Update(float Ialpha, float Ibeta, float speed_est) { // 反向电动势估算 float Ealpha = -Lq * Ibeta * speed_est; float Ebeta = Ld * Ialpha * speed_est; // 滑动模式观测器 float Zalpha = Kslide * sign(Ialpha_est - Ialpha); float Zbeta = Kslide * sign(Ibeta_est - Ibeta); // 角度估算 theta_est = atan2f(Ebeta - Zbeta, Ealpha - Zalpha); }

这里混合了滑模观测器和反电动势估算,Kslide参数调大了电机啸叫,调小了角度抖成帕金森。当年在实验室调这个参数,电机转起来像在跳踢踏舞。特别要注意atan2f的象限处理,ST用了C库函数而不是查表法,说明在F0系列上FPU性能够用。

FOC主循环的节奏感

核心控制代码出乎意料地简洁:

void FOC_Loop(void) { static uint32_t last_tick = 0; if(HAL_GetTick() - last_tick >= 100) { // 10kHz控制频率 Get_Phase_Currents(); Clarke_Park_Transform(); PI_Regulator_Update(); Inverse_Park_Transform(); SVM_Generate(); last_tick = HAL_GetTick(); } }

这个100微妙定时看起来人畜无害,实则暗藏杀机。实测发现用HAL_GetTick()做高精度定时就是个坑,后来我们全改成TIM6硬件定时触发。Park变换里有个细节:ST把角度补偿值硬编码为PI调节器输出量的1/4,这招在突加载时能防角度跑飞,但文档里压根没提。

这套代码最骚的是svm_generate.c里的死区补偿算法:

void DeadTime_Compensation(float *Ualpha, float *Ubeta) { float deadtime_voltage = DEADTIME_US * BUS_VOLTAGE / PWM_PERIOD; if(*Ualpha > 0) *Ualpha -= deadtime_voltage; else *Ualpha += deadtime_voltage; // Beta轴同理... }

用BUS电压直接算死区压降,比那些查表法高到不知哪里去了。但DEADTIME_US这个参数得拿示波器抓波形实测,手册给的推荐值就是个笑话——不同型号MOS管差异能到200ns以上。

这堆代码现在看可能有点过时,但作为FOC入门教材依然能打。GitHub仓库里还有份2014年的pdf文档,第23页有个电机参数填写表格,其中"Rs"标着"0.5Ω",结果我们实测0.38Ω的电机填进去照样跑,ST的鲁棒性设计确实有点东西。最后说句良心话,这套开源方案比现在CubeMX生成的FOC库有意思多了,至少你能看见PID参数是怎么把电机玩出花的。

Read more

Flutter 三方库 remove_markdown 的鸿蒙化适配指南 - 打造纯净文本提取、内容预处理实战、鸿蒙级文本解析专家

Flutter 三方库 remove_markdown 的鸿蒙化适配指南 - 打造纯净文本提取、内容预处理实战、鸿蒙级文本解析专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 remove_markdown 的鸿蒙化适配指南 - 打造纯净文本提取、内容预处理实战、鸿蒙级文本解析专家 在鸿蒙跨平台应用处理海量的 Markdown 博文、技术文档或用户输入的富文本内容时,有时我们需要剥离所有的样式标记(如加粗、链接、列表),还原出最原始、最纯洁的文字内容。如果你需要为搜索索引构建、智能语音播报(TTS)或是内容摘要生成提供高质量的数据源。今天我们要深度解析的 remove_markdown——一个专注于高效、无损 Markdown 语法剥离的轻量级 Dart 库,正是帮你实现“内容减负”的核心引擎。 前言 remove_markdown 是一套基于正则表达式与高效字符扫描的转换工具。它的设计初衷极其明确:将复杂的 Markdown 源码瞬间坍缩为易于阅读和处理的纯文本。在鸿蒙端项目中,利用它你可以确保在展示搜索片段(

By Ne0inhk

Flutter 三方库 jaguar 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、全能的工业级嵌入式 HTTP 服务端框架与 REST API 交互引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 jaguar 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、全能的工业级嵌入式 HTTP 服务端框架与 REST API 交互引擎 在鸿蒙(OpenHarmony)系统的端侧服务器化、分布式设备互联监控、或者是需要将鸿蒙应用转变为一个能够提供 API 服务的微型网关(如鸿蒙版物联网中枢)场景中,如何通过一套 Dart 代码构建出极致稳健、带路由拦截、支持 Session 且完全透明的 HTTP 服务?jaguar 为开发者提供了一套工业级的、基于生产环境优化的服务端处理方案。本文将深入实战其在鸿蒙端侧服务化中的应用。 前言 什么是 Jaguar?它不是一个普通的 HTTP 监听器,而是一个专为“速度”与“扩展性”

By Ne0inhk
鸿蒙金融理财全栈项目——基础架构、数据安全、用户体验

鸿蒙金融理财全栈项目——基础架构、数据安全、用户体验

《鸿蒙APP开发从入门到精通》第17篇:鸿蒙金融理财全栈项目——基础架构、数据安全、用户体验 📊🔒🎨 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第17篇——基础架构、数据安全、用户体验篇,完全承接第16篇的鸿蒙电商购物车项目架构,并基于金融场景的高安全、高合规、高性能要求,设计并实现鸿蒙金融理财全栈项目的核心架构与用户体验基础。 学习目标: * 掌握鸿蒙金融理财项目的整体架构设计; * 实现高可用、高安全、高可扩展的金融级架构; * 理解数据安全在金融场景的核心设计与实现; * 实现数据加密、身份认证、安全审计; * 掌握用户体验在金融场景的设计与实现; * 实现无障碍设计、响应式布局、性能优化; * 优化金融理财项目的用户体验(安全性、响应速度、用户反馈)。 学习重点: * 鸿蒙金融理财项目的架构设计原则; * 数据安全在金融场景的应用; * 用户体验在金融场景的设计要点。 一、 金融理财项目架构基础 🎯 1.1 金融理财项目特点 金融理财项目具有以下特点: * 高安全:需要严格的数据加密和身份认证; * 高合规:

By Ne0inhk
手搓简易 Linux 进程池:从 0 到 1 实现基于管道的任务分发系统

手搓简易 Linux 进程池:从 0 到 1 实现基于管道的任务分发系统

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 核心设计思路 * 二. 代码模块拆解 * 2.1 任务定义与随机任务生成 * 2.2 子进程任务处理逻辑 * 2.3 通道(Channel)类:封装父子进程通信 * 2.4 进程池(ProcesspPool)类:核心管理逻辑 * 2.5 主函数:进程池使用示例 * 三. 关键知识点解析 * 3.1 管道通信原理 * 3.2 轮询负载均衡 * 3.3 进程回收的坑

By Ne0inhk