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

stm32F407 硬件COM事件触发六步换相

上一节采用霍尔中断的方式进行六步换相,但是这样会导致定时器PWM通道配置的更改不会同时生效,因为我们在程序中是顺序执行更改配置的,因此配置的生效不会同时发生。

stm32提供了一种采用COM事件的方式,能够使定时器PWM通道的配置同时生效。

首先看一下stm32官方手册关于COM事件的描述:

这张图片说得很清楚,就是OCXM、CCXE、CCXNE这几个位可以进行预装载,那么我们看一下这几个位分别代表什么意思,首先是OCXM,这个位存在于捕获/比较模式寄存器1(TIMX_CCMR1)和捕获/比较模式寄存器2(TIMX_CCMR2)

我们以OC1M为例:

可以看到,OC1M其实就是输出比较1模式,包括冻结,翻转,强制模式、PWM1和PWM2模式。

CCXE与CCXNE则属于捕获/比较使能寄存器(TIMX_CCER),相关定义如下所示:

这两个位,其实就是通道的使能位。

然后COM事件可以由软件触发,软件触发就是自己写一段程序,开启COM事件。软件触发一般采用以下函数:

HAL_TIM_GenerateEvent(&htim1, TIM_EVENTSOURCE_COM);  //软件触发COM事件

这个函数的定义如下:

当然了,我们也可以采用硬件触发,也就是通过TRGI上升沿来生成COM事件。那TRGI怎么来呢?其实是采用一个定时器的TRGO作为另外一个定时器的TRGI。也就是主定时器产生一个触发给从定时器,这个触发就是TRGO。本文中TIM4是主定时器,TIM1是从定时器。

首先贴出stm32官方手册中关于霍尔传感器的配置过程以及COM时间生成的时序图:

在cubemx中将定时器TIM4配置成霍尔传感器接口时,TIM_CH1、TIM_CH2、TIM_CH3三个通道做异或操作。

TIM4的CCR1保存两个霍尔信号之间的捕获值,TIM4的CCR2则是另外配置,根据CCR2的值来生成OC2REF,然后触发COM事件。那么我们怎么配置CCR2呢,虽然可以手写CCR2的配置,但是既然有CubmeMx,那么stm32官方应该是可以允许我们直接配置的。

我们可以看到上文中的红线部分,“所编程的延迟过后”这句话,其实就是指的可以自定义更改的CCR2的值,CCR2是占空比,因此相当于延迟。在TIM4的配置界面,Commutation Delay就是CCR2的值。

在HAL_TIMEx_HallSensor_Init函数中,有一段语句就是用来配置通道2的。其中Commutation Delay就是Pulse也等于CCR2

如果在cubemx中允许COM事件中断,那我们可以在COM事件中断中进行换相处理。

需要注意的是,除了允许COM中断,还需要在程序中加入中断开启的语句,比如:

HAL_TIMEx_ConfigCommutationEvent_IT(&htim1,TIM_TS_ITR3,TIM_COMMUTATION_TRGI);

这里为什么ITR3,可以参考以下这个主从定时器的对应关系:

顺便将TIM1的配置也贴出来:

进行这些配置之后,将六步换相和霍尔检测放入COM中断中即可。需要注意的是在电机静止时,TIM4的计数器一直在计数,等待霍尔信号来,但是这个时候静止是没有霍尔信号的,这样会计数器溢出,使得CCR2与CNT的比较一直在进行,也就导致OCR2REF一直在产生,一直可以触发COM事件,从而导致换相出错,因此在使用硬件触发COM事件时,需要在程序里面加入堵转和电机停止的判断语句。

理论上,如果没有这种"错误",是需要在主程序加入软件触发COM事件来启动电机的,但是恰恰因为这种"错误"导致不需要再添加软件触发语句了,因为刚刚已经说了,电机静止时,会一直触发COM事件,进入COM中断,执行换相程序。

在实际中,硬件COM用得很少,因为刚刚这种问题,大部分采用的还是软件COM。

http://www.dtcms.com/a/315431.html

相关文章:

  • AI医疗革命:十大应用场景如何重塑未来医疗
  • 手绘风格制图新选择:如何用Excalidraw+cpolar构建你的视觉化工作流?
  • windos10 安装CentOS7 虚拟机笔记
  • Datawhale AI夏令营 第三期 task2
  • 基于ZYNQ ARM+FPGA的声呐数据采集系统设计
  • 01数据结构-平衡二叉树
  • Prometheus监控学习-安装
  • 【Git】实现使用SSH方式连接远程仓库时的免密操作
  • 计算机网络:目的网络在路由表项中的作用
  • Python实战项目--学生成绩管理系统
  • 机器人slam个人笔记
  • 交叉验证:机器学习模型评估的“稳压器”——从原理到实战
  • 测试开发:Python+Django实现接口测试工具
  • AI 对话高效输入指令攻略(四):AI+Apache ECharts:生成各种专业图表
  • 第六章 道阻且艰(2025.7学习总结)
  • 期权定价全解析:从Black-Scholes到量子革命的金融基石
  • 利用Coze平台生成测试用例
  • 发票的分类识别与查验接口-发票管理软件-发票查验API
  • C++返回值优化(RVO):高效返回对象的艺术
  • 《算法导论》第 2 章 - 算法基础
  • spring webflux链路跟踪【traceId日志自动打印】
  • 【Spring Boot 快速入门】七、阿里云 OSS 文件上传
  • 从零实现富文本编辑器#6-浏览器选区与编辑器选区模型同步
  • dos中常用的全屏幕编辑器
  • 一次“无告警”的服务器宕机分析:从无迹可寻到精准定位
  • 服务器数据恢复—坏道致Raid5阵列硬盘离线如何让数据重生?
  • 【Electron】electron-vite中基于electron-builder与electron-updater实现程序远程自动更新,附源码
  • 前端性能工程化:构建高性能Web应用的系统化实践
  • 8.5 CSS3-flex弹性盒子
  • 从达梦到 StarRocks:国产数据库实时入仓实践