EPWM模块影子寄存器的原理
在TI(Texas Instruments)的DSP28335中,EPWM(Enhanced Pulse Width Modulator)模块提供了高精度、高灵活性的PWM信号生成功能。为了能在不影响当前PWM波形输出的情况下预装载新的PWM参数(如周期、占空比等),EPWM模块引入了影子寄存器的概念。
影子寄存器的工作原理
1.双缓冲机制:影子寄存器实际上是一种双缓冲机制。每个可以更新的EPWM寄存器(如周期寄存器TBPRD、比较匹配寄存器CMPA等)都有一个对应的影子寄存器。
2.预装载新值:当用户想要改变PWM的参数时,不是直接写入正在使用的寄存器,而是先将新值写入对应的影子寄存器。
3.同步更新:在特定的时间点(通常是由时间基准计数器触发的某个事件,如计数器的顶部或底部),影子寄存器中的值会被自动复制到活动寄存器中,从而实现参数的平滑更新,避免在PWM波形中产生不希望的跳变。
代码实例
以下是一个简单的示例,展示了如何在DSP28335上使用EPWM模块的影子寄存器来更新PWM的周期和占空比。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_GlobalPrototypes.h" // DSP2833x Prototypes Headerfile Include File
#include "DSP2833x_EPwm.h" // DSP2833x EPwm Headerfile Include File
// 假设我们想要设置EPWM1模块
#define EPWM_MODULE EPWM1
void main(void) {
// 初始化系统时钟和外设时钟
InitSysCtrl();
// 初始化EPWM模块
InitEPwm();
// 配置EPWM模块的具体参数(时钟、周期、占空比等)
EPwm_setClockPrescaler(EPWM_MODULE, 1, 1); // 设置时钟预分频器
EPwm_setTimeBasePeriod(EPWM_MODULE, 2000); // 设置周期
EPwm_setCounterCompareValue(EPWM_MODULE, EPWM_CMPA, 1000); // 设置占空比
// 启用影子寄存器
EPwm_enableShadowMode(EPWM_MODULE, EPWM_SHADOW_MODE_FREEZE);
// 开始计数
EPwm_startCounter(EPWM_MODULE);
// 主循环
while(1) {
// 在此处可以执行其他任务
// 假设我们想要更新PWM周期和占空比
uint16_t newPeriod = 1900; // 新的周期值
uint16_t newDuty = 900; // 新的占空比值
// 更新影子寄存器
EPwm_setTimeBasePeriodShadow(EPWM_MODULE, newPeriod); // 更新周期影子寄存器
EPwm_setCounterCompareShadowValue(EPWM_MODULE, EPWM_CMPA, newDuty); // 更新占空比影子寄存器
// 强制从影子寄存器装载新值到活动寄存器
// 这通常在计数器达到特定值时触发,但也可以手动触发
EPwm_forceShadowLoad(EPWM_MODULE);
// 延时一段时间,然后可以再次更新
DELAY_US(1000000); // 延时1秒,假设DELAY_US是一个实现微秒延时的函数
}
}
// 其他必要的初始化函数和中断服务程序等…
注意:以上代码是基于DSP28335的C2000系列微控制器库函数的伪代码。实际使用时,需要根据具体的库函数和寄存器名称进行调整。此外,为了确保PWM波形的连续性,通常会在PWM计数器的特定点(如计数器下溢或上溢时)自动触发影子寄存器的更新。这可以通过配置EPWM模块的中断和事件触发来实现。
在实际应用中,还应考虑中断服务程序、错误处理、外设初始化等更多细节。务必参考TI提供的官方文档和示例代码来编写和调试程序。