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

server/2024/9/24 15:14:34/

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/server/18356.html

相关文章

AI助手对决:ChatGPT vs 文心一言

背景介绍 在当今人工智能技术飞速发展的时代,AI助手已经成为我们日常生活中不可或缺的一部分。而在众多AI助手中,ChatGPT和文心一言可以说是备受瞩目的两大代表,它们在智能回复、语言准确性、知识库丰富度等方面都有着自己的特点和优…

vue与Spring boot数据交互例子【简单版】

文章目录 什么是Vue?快速体验Vueaxios是什么?向Springboot后端发送数据接收Springboot后端数据小结 什么是Vue? 官网解释:Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上…

C++性能优化实践 三

C性能优化实践 三 文章目录 一、C标准库线程间的通信二、内存屏障、获得与释放语义三、多线程优化总结 书接上回, 这篇文章继续来谈谈C 并发编程性能优化相关的内容。 参考文章: hhttps://boolan.com/ 先形象的说明一下并发与并行: 并发:类似与足球场踢足球, 大家为…

【Go】匿名函数与闭包

目录 一、匿名函数 基础介绍 形式 示例程序 1: 直接调用 示例程序 2: 作为变量赋值 示例程序 3: 作为函数参数 示例程序 4: 使用匿名函数进行排序 示例程序 5: 匿名函数用于延迟执行 示例程序 6: 通过匿名函数实现迭代器 二、闭包用法 基础知识 示例程序 1: 状态保持…

【k8s】(九)kubernetes1.29.4离线部署之-Token过期后加入节点

(一)kubernetes1.29.4离线部署之-安装文件准备 (二)kubernetes1.29.4离线部署之-镜像文件准备 (三)kubernetes1.29.4离线部署之-环境初始化 (四)kubernetes1.29.4离线部署之-组件安装…

hbase MultiRowRangeFilter的原理、作用和实例

MultiRowRangeFilter是HBase中的一个过滤器,用于在扫描操作中过滤多个行键范围 原理 MultiRowRangeFilter的原理是将多个行键范围组合成一个过滤器,然后在扫描操作中应用这个过滤器。当扫描器遍历HBase表的行时,它会检查每一行的行键是否在…

mysql8.0免安装版windows

1.下载 MySQL下载链接 2.解压与新建my.ini文件 解压的路径最好不要有中文路径在\mysql-8.0.36-winx64文件夹下新建my.ini文件,不建data文件夹(会自动生成) [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录(尽量用双斜杠\\,单斜杠\可能会报错) basedirD:\…

数据结构——二叉树练习(深搜广搜)

数据结构——二叉树练习 路径之和深度优先算法和广度优先算法二叉搜索树判断一棵二叉树是否为搜索二叉树和完全二叉树 我们今天来看二叉树的习题: 路径之和 https://leetcode.cn/problems/path-sum-ii/ 这是一个典型的回溯,深度优先算法的题&#xff0c…