DSP开发实战教程--EPWM模块的影子寄存器详细讲解原理和代码实例

ops/2024/12/22 0:41:49/

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提供的官方文档和示例代码来编写和调试程序。


http://www.ppmy.cn/ops/26198.html

相关文章

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS【大模型的协同推理】

目录 前言一、ABSTRACT二、INTRODUCTION三、KNOWLEDGE-INTENSIVE REASONING TASKS3-1、SETUP3-2、METHODS3-3、RESULTS AND OBSERVATIONS 四、DECISION MAKING TASKS4-1、ALFWorld TASK4-2、WebShop TASK 五、RELATED WORK六、CONCLUSION总结 前言 文章提出了ReAct方法&#xf…

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…

Linux 查看所有进程 ps -ef 命令详解, 查看网络链接信息 netstat -tuplan 命令详解

ps -ef 指令 在Linux系统中,ps 是一个非常基础且强大的命令行工具,用于报告当前系统中运行的进程的状态。它是 “Process Status” 的缩写。通过使用不同的选项和参数,ps 命令能够以多种格式展示进程信息,帮助用户了解系统中进程…

Linux IP Forwarding路由转发实验

linux 路由转发功能 Linux 操作系统具备路由转发功能,路由功能是指 Linux 操作系统提供的路由管理和转发功能,它允许 Linux 主机在网络中正确地转发数据包,并确保数据包能够达到其目的地。 出于安全考虑,Linux系统默认是禁止数据…

【Flutter】极光推送配置流程(小米厂商通道) 章二

前言 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 并且,我大概率不会去修改第一篇文章的内容。 随着我自己在配置公司的项目的同时,我希望一直更新这个推送系列文章。 在章一配置完后,也是出现了一些问题,所以本…

Flask 3 保姆级教程(一):快速上手

一、创建项目 PyCharm 中新建项目 创建完成后会出现这么个项目 以下是代码解析: # 导入了 Flask 类 from flask import Flask# 创建了一个 Flask web 应用的实例,并将其赋值给变量 app # __name__ 是一个特殊的 Python 变量,它表示当前模块…

【机器学习】自然语言引导下的单目深度估计:泛化能力与鲁棒性的新挑战

自然语言引导下的单目深度估计:泛化能力与鲁棒性的新挑战 一、自然语言引导下的单目深度估计进展二、泛化能力与鲁棒性的挑战三、评估方法与实验验证四、代码实例与未来展望 在人工智能领域,单目深度估计一直是一个备受关注的热点问题。通过单张图片推断…

docker compose mysql主从复制及orchestrator高可用使用

1.orchestrator 功能演示: 1.1 多级级联: 1.2 主从切换: 切换成功后,原来的主库是红色的,需要在主库的配置页面点击“start replication ”,重新连接上新的主库。 1.3 主从故障,从库自动切换新…