假定CPU工作频率为100MHz。PWM模块的计数频率也一样,则计数周期为10ns。
假设PWM的开关频率为1MHz。使用向上计数模式。
那么,计数周期PRD等于100.
此时,比较值只能在0~100里面选。占空比的精度只有1%。也就是说,只能产生24%、56%这种整数的占空比,不能产生26.5%这种占空比。
如果计数模式是使用“向上向下计数”,那么精度还会再降一半。
这个精度是由PWM的“计数器和”“比较器”的原理决定的。
因为PRD和CMPA都是整数。想要提高占空比的精度,就得更加精确地控制上升沿或者下降沿的时间。就要微调“CMPA”的值。
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步长。
假定:工作频率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%。
这个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.
能不能直接由浮点数的占空比快速地得到寄存器的值呢?
可以。使用自动转换模式,就不再需要计算缩放系数了。
如果设置了 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