基于STM32平台,学习BLDC记录
前言
打算基于ST的官方平台,开始BLDC的学习。先学习简单的六步换相,后面的FOC再说。写此文督促自己学习。手头有一部分零零散散的资料,但是一直没有一个项目能把这些资料都串起来,在网上也看了不少资料,看看都懂了,实际连六步换相都没跑过,也是惭愧。
若能有大神指点一二,感激不尽!希望能有志同道合的一起学习进步,一起入门
硬件平台
1、NUCLEO-F302开发板 + IHM07M1驱动板 + 7对极三相无刷小电机
(均为ST官方套件)
软件部分
1、移植例程
学习网上的无刷无感电控例程,自己进行移植到ST开发套件上,记录遇到的一些问题。
1.1 单步换相
首先,开始万里长征第一步,做一次换相。
定义一些基本的变量,例如step步数等备用。
借用现成的按键函数,按一次按键,则进行一次换相。先用按键实现六步换相。每次开MOS后,设置1秒后关闭输出,防止换相失败或者上下桥意外导通烧MOS。
1.2 强制换相
捣鼓下,发现可以开环转了,然而可能还是原来的例程在跑,需要屏蔽掉while(1)中自己写的部分代码,看电机是不是还在正常跑,才知道。后面发现中断里有部分还是不能屏蔽,屏蔽了就不能转,说明并不是自己的代码在起作用,还需要继续屏蔽代码。
开环转,与反电动势的采样应该是无关的,屏蔽反电动势相关采样,只保留强制换相的步骤,发现仍然可以运行。
PS:强制换相六步,成功的话会旋转360度电角度,想要旋转一圈即360度机械角度,则可以旋转:六步*极对数 的步骤。此处是七对极电机,则计数换相42步,差不多旋转一圈。
发现开环启动不是每次都会成功,有时候会卡住,原因待分析。
1.3 开环启动
开环启动的原理,就是强制进行六步换向。如果换向的频率固定的话,开环转的速度也是固定的。开环启动没什么技巧,首先就是用定时器配置一个周期,例如周期为1ms,然后以这1ms为基准的PWM载波周期进行换向。
开环启动核心代码如下:
switch(MotorA.State) //状态机,State 表示电机状态{case 0: //定位状态
//PWMTicks 是每个PWM 周期加1,换向时清零。这段就是给某两相通电一段时间,定位if(MotorA.PWMTicks >= 1000) //默认是4ms周期{ BLDC_SwitchStep(); //六步换向,Step=2, A+,B-MotorA.State++; //切换到启动状态MotorA.BEMF_Cnt = 0;}break;case 1: //开环启动状态 if (MotorA.PWMTicks >= 8) //{ // 强制换向BLDC_SwitchStep(); //从Step=3开始 C+,B-。MotorA.BEMF_Cnt++;}// 六步转一个电角度,此处转 6*7=42 ,7代表七对极,则是转机械角度360度。if (MotorA.BEMF_Cnt >= 42) //50次换向之后,认为达到平稳状态 {MotorA.State++; //切换到闭环控制状态MotorA.BEMF_Cnt = 0;}break;/*******其它代码*******/case 2: .../*******其它代码*******/
1.4 开环切闭环
闭环的核心就是检测反电动势过零,能正确检测到反电动势过零,再延时30电角度(也就是上次换相时机的一半)
等能正确检测到反电动势过零后,就可以切入闭环了,一般强制换相20次左右,就应该能检测到过零点了。
case 2: //闭环控制状态 if (MotorA.FlagBEMF == 0) //未检测到过零事件{if (MotorA.PWMTicks >= 4) //同上,消磁{if ( BEMF()) //检测过零点{ MotorA.FlagSwitchStep = MotorA.PWMTicksPre >> 1; //延迟30电角度,上一次换向时间间隔的一半。//延迟30电角度,PWMTicksPre 记录的是上一步的时间 MotorA.FlagBEMF = 1; //检测到过零事件,不再检测}}}else{if (MotorA.FlagSwitchStep == 0) //延迟时刻到{BLDC_SwitchStep(); //换向MotorA.BEMF_Cnt++;}else{MotorA.FlagSwitchStep--; //延迟30电角度时刻未到,自减}}if (MotorA.BEMF_Cnt >= 2000) //2000次换向之后,停止{MotorA.State++;MotorA.BEMF_Cnt = 0;}break;case 3: //关闭电机MC_StopMotor();break;
1.5 闭环换相时机–改变周期
试着慢慢的去改变周期,加快换向频率,使得电机转的越来越快。
实际上,先尝试了,将计时周期缩短,使得100us的计时周期。定义一个 “temp_a” 作为消磁等待周期,只有速度到达一定值,才能后缩小 “temp_a” 的值,否则只会振动不运转。
case 2: //闭环控制状态if (MotorA.FlagBEMF == 0) //换一次相,该标志置0。 未检测到过零事件{if (MotorA.PWMTicks >= temp_a) //同上,消磁{if ( BEMF()) //检测过零点{ MotorA.FlagSwitchStep = MotorA.PWMTicksPre >> 1; //延迟30电角度,上一次换向时间间隔的一半。//延迟30电角度,PWMTicksPre 记录的是上一步的时间 MotorA.FlagBEMF = 1; //检测到过零事件,不再检测}}}else{if (MotorA.FlagSwitchStep == 0) //延迟时刻到{BLDC_SwitchStep(); //换向MotorA.BEMF_Cnt++;}else{MotorA.FlagSwitchStep--; //延迟30电角度时刻未到,自减}}if (MotorA.BEMF_Cnt >= 1000) //1000次换向之后,缩短换相等待时间 {temp_a = 10; //静态变量temp_a,在达到一定速度后,进行改变,使得换相的频率更快} if (MotorA.BEMF_Cnt >= 2500) //2500次换向之后,缩短换相等待时间{temp_a = 8;}if (MotorA.BEMF_Cnt >= 4000) //80000次换向之后,停止{MotorA.State++;MotorA.BEMF_Cnt = 0;}break;
(未完待续)
基于STM32平台,学习BLDC记录相关推荐
- stm32中用到的实时系统_基于STM32平台的实时操作系统
基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux.μC/OS-II.eCos.FreeRTOS和都江堰操作系统(djyos). 下面分别介绍这五种嵌入式操作系 ...
- 基于STM32的学习记录--MQ系列计算公式
目录 MQ-2 定义 计算 MQ-4 定义 公式 MQ-7 定义 公式 MQ-135 定义 公式 所有的MQ系列传感器都需要一定的预热时间进行一个精度的校准 MQ-2 定义 //R2-1K. #def ...
- stm32 IOT_基于STM32平台的cubeMX和HAL库详解
课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...
- 78、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序源码 七.资料包括 摘要 在当今大规模制造业中,企业为提高生产效率, ...
- 基于STM32的学习型通用红外遥控设备的设计实现(一)
1.1处理器 处理器为STM32,代码在其两个系列的CPU上调试通过,为STM32F103ZET和STM32F103VBT. 软件平台:Keil uVision4;电路设计:Altium Design ...
- SylixOS 基于STM32平台的GPIO模仿I2C总线的驱动开发流程
2019独角兽企业重金招聘Python工程师标准>>> 概述 本文档以STM32F767平台为例,详细介绍SylixOS上GPIO模仿I2C总线的驱动开发流程. 初始化 GPIO模仿 ...
- 基于STM32跑步路径记录
基于STM32跑步路径记录 随着科技不断进步,电子化设备不断进入涌入我们的日常生活.生活水平的提高,各项健身运动应运而生,然后,健身运动不能盲目进行,科学的健身方式才能有效的提升我们自身的身体素质 ...
- 【官方推荐】基于STM32单片机的热门可穿戴应用设计方案
基于STM32F411的步行者航迹推算技术 方案简介 基于STM32F411的步行者航迹推算技术(PDR)为一种辅助定位方式, 适用于中短程相对位置推测. • 室外模式与GPS结合使用, 减少GPS ...
- 基于stm32温湿度采集平台开发
基于stm32温湿度采集平台开发 ==这里记录一下自己以前课设报告,但是论文中图片和文字.公式太多了,懒得粘贴了,需要完整的私信== 摘 要 关键词 第一章 绪论 1.1 研究背景 1.1.1国内研究 ...
最新文章
- 远看像乱序执行,近看是内存屏障的 BUG 是如何解决的?
- H5支持度检测常用模式(仅干货)
- Redhat 5.4 Orcle RAC 数据库 从10.2.0.1升级到 10.2.0.4
- java Launcher源码_Launcher3源码浅析(5.1)--Launcher.java
- Flutter布局锦囊---完善信息页
- mysql慢日志分析工具_mysql慢查日志分析工具 percona-toolkit
- 【VBA】获取当前工作表的用户名
- 浅谈c++纯虚函数的多态与数据隐藏
- linux配置路由器命令手册,Linux配置路由器
- 根据图片地址检查图片格式,今日头条有效
- jdk文档下载(html格式)
- 【移动网络】[5G 核心网络架构] 5GC: Architecture
- 【Redis消息队列实现异步秒杀】--Redis学习笔记08
- 蓝桥杯_大胖子走迷宫
- 2018王者服务器维护,王者荣耀:2018年最后一次更新,大量装备改动,玩法全部迭代!...
- Ubuntu的基本用法:常用指令,控制流程和重定向
- 元胞自动机交通模型【matlab实现】
- 字蛛压缩ttf字体(前端常用)
- 数据质量分析之校验规则模板
- LeetCode刷题记录+数据结构总结
热门文章
- Java Web中涉及的编解码
- 教你如何找回被盗的QQ密码(转贴)
- 基于bert特征提取的FAQ问答系统构建
- Python抓取妹子图,内含福利
- 中国股市:如果历史会重复?
- ES 文件浏览器安全漏洞分析(CVE-2019-6447)
- CVPR2022论文速递(2022.4.20)!共13篇!
- 用filebeat读不了log文件,出现“message“:“Non-zero metrics in the last 30s“
- 035 Rust死灵书之Vec处理零尺寸类型
- 【亲测有效】mac电脑也能玩魔兽世界怀旧版(wow经典怀旧版)