对高精度PWM(HRPWM)的理解
传统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
对高精度PWM(HRPWM)的理解相关推荐
- DSP芯片F2803x系列之PWM模块及高精度PWM使用
DSP芯片F2803x之ePWM模块 文章目录 1 ePWM模块概述 2 ePWM模块构成 3 ePWM各子模块 3.1 TB模块 3.2 CC模块 3.3 AQ模块 3.4 DB模块 3.5 PC模 ...
- STC15W4K48S4 它有6通道高精度PWM发生器
STC15W4K48S4 的 PCA_PWM 只有两路 PWM0 和 PWM1 已经用来控制了两个风机,因为项目需要要控制3个风机所以又添加了一个PWM来控制风机,查看电路板发现只有一个 PWM7的 ...
- PWM方波的理解浅谈
对PWM方波的一些理解心得 PWM方波代表的是电压,占空比大,就代表电压较大:占空比小,就代表电压较小. PWM方波数字信号其实是模拟信号的另外一种表达方式,客观存在的效果是一样的,只是形式不一样而已 ...
- 四轴无人机那些事 番外篇 4 关于PWM模式的理解
前言: 之前做无人机的时候和pwm是经常打交道,不过最近这一年多由于"转行"已经很久不接触了,但是还是会在论坛默默潜水,发现好的资料也还是会仔细阅读,今天就分享一篇关于pwm的文章 ...
- STC15W4K32S4 6通道高精度PWM
增强型PWM PWM波形发生器内部有一个15位的PWM计数器供6路PWM使用 所有与PWM相关的端口,上电后均为高阻输入态,必须在程序中将这些端口设置为双向口或者强推挽模式才可正常输出波形 ENPWM ...
- 锂电池正常分容测试温度的软件,实现节能环保,锂电池化成分容测试方案不可少...
随着手机,智能无线设备和电动汽车的快速发展,锂电池的市场需求越来越广,锂电池的生产制造效率也越来越高.同时,由于节能减排的需要,锂电池的化成,分容的充电,放电,也大量采用能量回馈的形式,将锂电池的放电 ...
- 单片机的PWM控制,一篇即可学废
一. PWM是什么 PWM全称为"Pulse Width Modulation"及"脉冲宽度调制".利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技 ...
- 用PWM实现DAC功能
现在单片机型号很多,但是内部拥有12位DAC且性价比较高的芯片恨少,导致在芯片选型时,捉襟见肘.没办法,就想着用PWM实现DAC的功能,这只是初步理论,还没有实践过,先贴出来,后续实现再看效果如何吧. ...
- nRF52832学习记录(十、PWM 脉冲调制)
..添加PWM Single模式回调示例 ..添加PWM Grouped模式示例 ..添加PWM WaveForm模式示例 ..添加PWM 综合示例 2021/9/30 目录 nRF52xx PWM基 ...
最新文章
- Android -- Volley解析
- 【Paper】2013_Autonomous Cooperation Between UAV and UGV to Improve Navigation and Environmental
- kmp——next数组的应用---cout the string
- 要选择做有价值的事情
- hdu 6851 Vacation(思维+贪心)
- C#异常处理机制初步
- loadrunner mysql脚本_LoadRunner11_MySQL数据库脚本
- Video for linux 2 example (v4l2 demo)
- argparse模块用法
- 10.性能测试软技能
- 电脑常见故障排查思路
- 汉字GB2312编码
- 解决tuple index out of range
- Windows 文件系统过滤驱动开发教程 (第二版)
- 微软发布InstaLoad电池技术 不考虑极性
- 日常生活开支记账明细_教你记账管理家庭日常生活收入支出明细的实例
- GoPro fusion(双目) Vr视频如何导出至手机和PC端(Win)
- 布尔巴基学派的灵魂人物—安德烈` 韦伊
- 基于微信小程序的旅游社微信小程序
- 软工非全研究生学习和工作总结-开题和第三辆捷安特