对高精度PWM(HRPWM)的理解

2023-11-16

 传统PWM的精度

假定CPU工作频率为100MHz。PWM模块的计数频率也一样,则计数周期为10ns。

假设PWM的开关频率为1MHz。使用向上计数模式。

那么,计数周期PRD等于100.

此时,比较值只能在0~100里面选。占空比的精度只有1%。也就是说,只能产生24%、56%这种整数的占空比,不能产生26.5%这种占空比。

如果计数模式是使用“向上向下计数”,那么精度还会再降一半。

这个精度是由PWM的“计数器和”“比较器”的原理决定的。

 

因为PRD和CMPA都是整数。想要提高占空比的精度,就得更加精确地控制上升沿或者下降沿的时间。就要微调“CMPA”的值。

高精度PWM

TI使用了MEP技术来实现HRPWM。

MEP=micro-edge positioner微边沿定位。

就是将一个计数周期再拆分为很多个小的MEP步长。

 比如,280025的CPU,计数频率为100MHz,MEP步长为150ps。那么,就可以将每一个计数周期再细分为10ns / 150ps = 66.67份。

还是上面的例子,开关频率为1M,载波周期为1us。现在,如果想要实现12.24%的占空比,那么边沿时间就应该控制在12.24 * 10ns = 122.4ns。取CMPA=12,再加上2.4ns = 2400ps = 150ps * 8 = 8个MEP步长。

高精度比较值CMPHR的计算

假定:工作频率100M,PWM频率1.25M,MEP频率为180ps。

期望得到40.5%的占空比。

 由于计数周期为10ns,PWM周期为800ns。期望的占空比时间为800 * 40.5% = 324ns。

先取整数部分,CMP = 32,已经有了320ns了。还差4ns。

MEP数量=4ns / 180ps = 22.22,再取整后得到22. 即CMPAHR的数量为22.(但CMPAHR寄存器的值还需要再左移8位。)

最终得到的高电平时间为:320ns + 22 * 180ps = 323.96ns,占空比为323.96 / 800 = 40.495%。 

CMPHR寄存器的配置

寄存器的定义

 这个32位的寄存器,可以分为2个部分。

高16位为传统的比较值寄存器CMPA。

低16位中的高8位为扩展的高精度比较值寄存器,低8位保留。

 其中,CMPAHR的含义为MEP的数量。

计算公式

CMPA的计算公式为:比较值 = 周期值 * 占空比,再取整。其中占空比为0.0f ~ 1.0f 之间的一个纯小数。

CMPAHR的计算方法为:先得到比较值的小数部分,乘以MEP缩放系数,再四舍五入。

 其中,MEP缩放系数(Scale Factor) = 每个计数的周期 / MEP步长。比如,10 ns / 150 ps = 66.67

举例说明

前提条件:系统频率100MHz,PWM频率400KHz。MEP步长为150ps。

则PRD=250. MEP缩放系数 = 66.67

如果期望的占空比为12.345%。

则期望的占空比计数数量CMP = 250 * 0.12345 = 30.8625

CMPA = 30.

CMPAHR数值 = 小数部分 0.8625 * 66.67 = 57.5,再四舍五入圆整得到58(0x3A)

CMPAHR寄存器 = 0x3A << 8 = 0x3A00.

能不能直接由浮点数的占空比快速地得到寄存器的值呢?

可以。使用自动转换模式,就不再需要计算缩放系数了。

缩放系数(比例因子)优化SFO(Scale Factor Optimizer)

如果设置了 AUTOCONV 位 (HRCNFG.6) 并且 MEP_ScaleFactor 在 HRMSTEP 寄存器中,则 CMPAHR / CMPBHR 寄存器值 = frac (PWMDuty*PWMperiod<<8)。其余的转换计算在硬件中自动执行,正确的 MEP 缩放信号边沿出现在 ePWM 通道输出上。如果没有设置 AUTOCONV,则上述计算必须由软件执行。
MEP 比例因子 (MEP_ScaleFactor) 随系统时钟和 DSP 操作条件而变化。
TI 提供了 MEP 比例因子优化 (SFO) 软件 C 函数,它使用每个 HRPWM 中的内置诊断并返回给定工作点的最佳比例因子。
比例因子在有限范围内缓慢变化,因此优化 C 函数可以在后台循环中非常缓慢地运行。

开启该功能后,软件中只需要把占空比数值的小数部分,放大256倍,赋值给寄存器。

代码片段如下:

float32_t dutyFine = 0.8562;
float32_t count = (dutyFine * (float32_t)(EPWM_TIMER_TBPRD << 8));
uint32_t compCount = (count);
HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A, compCount);
HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_B, compCount);

使用SFO库时,需要在初始化过程中调用SFO()函数。

MEP缩放系数会保存到HRMSTEP寄存器中。

 要在主函数中定期地、缓慢地(5~10秒均可)调用SFO函数来校准缩放系数。

参考文档

28004x HRPWM 中文翻译_xklzw的专栏-CSDN博客文章目录TMS320F28004xHRPWM中文翻译HRPWM的操作描述HRPWM可配置的项HRPWM 时钟源配置HRPWM在死区上升沿和下降沿延迟中配置高分辨率操作规则边沿位置缩放注意事项高精的占空比范围限制高分辨率周期高精周期配置死区高精操作Scale Factor Optimizing Software (SFO)使用优化汇编代码的HRPWM示例单相Buck变换器附录A SFO软件库\- SFO_TI_Build_V8.libScale Factor Optimizer Function - int https://blog.csdn.net/xklzw/article/details/111224222#comments_18676261

DSP芯片F2803x系列之PWM模块及高精度PWM使用_紫宸的博客-CSDN博客PWM作为DSP的C200十分重要的模块,常用于电力电子数字控制系统中。该文详细介绍了PWM用途、原理及使用。还介绍了高精度PWM,用于高频PWM控制。https://blog.csdn.net/qq_21681077/article/details/120253933

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对高精度PWM(HRPWM)的理解 的相关文章

随机推荐

  • 活动报名|X-Decoder&SEEM:从开放词库的图像理解到像素分割,如何用一个模型做N个任务理解M个模态...

    2023年04月27日 星期四 11 00 12 00 由智源社区主办的 智源LIVE 第39期线上活动 X Decoder SEEM 从开放词库的图像理解到像素分割 如何用一个模型做N个任务理解M个模态本期活动将在线举办 阅读原文 报名即
  • 科技感十足的網站頁面

    http www bootstrapmb com item 9102 preview
  • 信号盒子连接服务器,【当贝市场】简单4步解决电视盒子没信号问题

    原标题 当贝市场 简单4步解决电视盒子没信号问题 看电视是家庭娱乐方式 很多家庭都喜欢用电视机顶盒来看电视直播 很多用户也会遇到一个问题就是机顶盒没信号怎么看电视直播呢 大家都知道机顶盒看直播 都是在有网有信号的状态下才能完美呈现呢 机顶盒
  • element Plus Select选择器实现查询搜索 下拉选择

    这Select选择器用于哪里 怎么用 Select 选择器可以用于许多不同的场景 包括但不限于以下几个方面 表单 Select 选择器常用于表单中的下拉选择字段 例如选择国家 城市 性别 职位等 用户可以从预定义的选项中选择一个值 以便提交
  • gd32f103 串口数据处理说明

    1 数据接收或发送完毕 发出复位信号 GetBitState USART 接收数据 ch U8 USART DataReceive USART1 类似 C51 直接向寄存器写数据自动发送 UART1 SendChar ch 2 操作逻辑 发
  • 一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路?

    一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 问总共有多少条不同的路 var machinePath1 function m n var arr new Array m n i
  • Deformable DETR源码解读

    文章目录 一 网络创新点 二 流程详解 part 1 deformable detr模块 part 2 deformable transformer模块 part3 Encoder模块 part 4 MSDeformAttn part5 D
  • Linux系统调试之gdbserver远程调试程序

    本篇讲解如何使用gdbserver对目标开发板上的程序进行远程调试 安装 GDBSERVER 首先在开发板上安装 gdbserver apt install gdbserver gdbserver 用法 gdbserver用法描述 Usag
  • redis概述-1

    视频链接 尚硅谷 Redis 6 入门到精通 超详细 教程 哔哩哔哩 bilibili 早期架构 随着web2 0 手机端和pc端的请求增加 应用服务器会有cpu及内存压力 数据服务器有IO压力 针对应用服务器 采用分布式 负载均衡的方式进
  • ILRuntime Unity热更新

    在新的项目中 使用到了ILRuntime的热更新方式 不同于XLua等 这种方式的热更新是由纯C 实现的 所以就不需要客户端懂Lua的代码 更详细的介绍可以看官方的文档 官方的介绍及文档为 http ourpalm github io IL
  • vcpkg安装和使用--学习入门

    前言 vcpkg是一个C 的包管理器 包管理器是专门管理一些代码库的 比如一些大佬们开源的一些NB的框架 我们可以用vcpkg将他们放到自己的项目中 然后就可以直接用了 我用的win10 vs2019 1 安装 1 先git clone下载
  • openwrt中计划任务的设置

    寝室的供网规则为周一到周五零点断网 六点开网 双休日通宵供网 故设置一套计划任务提高路由器使用效率 crontab命令常见于Unix和类Unix的操作系统之中 用于设置周期性被执行的指令 操作符号 在一个区域里填写多个数值的方法 逗号 分开
  • AcWing基础课题集汇总

    本篇博文是笔者归纳汇总的AcWing基础课题集 方便读者后期复盘巩固 PS 本篇文章只给出完整的算法实现 并没有讲解具体的算法思路 如果想看算法思路 可以阅读笔者往期写过的文章 或许会有 也可以移步AcWing官网看详情 本篇文章的特点 每
  • Qt应用开发(基础篇)——时间类 QDateTime、QDate、QTime

    一 前言 时间类QDateTime QDate QTime QTimeZone保存了Qt的时间 日期 时区信息 常用的时间类部件都会用到这些数据结构 常用概念有年 月 日 时 分 秒 毫秒和时区 时间和时区就关系到时间戳和UTC的概念 UT
  • Debian(Linux)系统Samba安装和配置

    samba安装 root用户下直接使用以下命令 apt get install samba 若是普通用户下使用以下命令 sudo apt get install samba samba配置 samba的配置文件在 etc samba 路径下
  • 1-2动态图

    文章目录 动态图 一 环境配置 二 基本用法 三 使用python的控制流 四 构建更加灵活的网络 控制流 五 构建更加灵活的网络 共享权重 The End 动态图 在这种模式下 每次执行一个运算 可以立即得到结果 而不是事先定义好网络结构
  • 基本数据类型的包装类

    本人之所以把包装类作为单独一篇博文来写 主要是因为这里知识比较冗杂 为了帮助大家比较好的理解深层次的东西而不是做一个搬砖的这里我有必要单开一篇博文来了解下 首先我们来分析一下基本数据类型和包装类 包装类是对象 拥有方法和字段 对象的调用都是
  • Python异常处理总结

    Python异常处理总结 这篇文章主要介绍了Python异常处理总结 需要的朋友可以参考下 本文较为详细的罗列了Python常见的异常处理 供大家参考 具体如下 1 抛出异常和自定义异常 Python用异常对象 exception obje
  • 《Java基础——制表符》

    Java基础 制表符 规则 若前面输出内容不为8的倍数 则通过空格补全 不足八位 补全八位 例一 不足八位 System out println 123456 t 空格补位 编译结果 123456 空格补位 例二 大于等于八位 System
  • 对高精度PWM(HRPWM)的理解

    传统PWM的精度 假定CPU工作频率为100MHz PWM模块的计数频率也一样 则计数周期为10ns 假设PWM的开关频率为1MHz 使用向上计数模式 那么 计数周期PRD等于100 此时 比较值只能在0 100里面选 占空比的精度只有1