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

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.mfbz.cn/a/577214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电源小白入门学习6——锂离子电池特性及充电电路

锂离子电池特性及充电电路 锂离子电池18650电池锂聚合物电池锂电池的放电曲线 锂离子电池充电方法常见的充电方案 锂离子电池 锂离子电池是一种常见的可充电电池类型,主要依靠锂离子在正极和负极之间的移动来工作。在充放电过程中,锂离子在两个电极之间…

表情识别 | LBP+SVM实现脸部动态特征的人脸表情识别程序(Matlab)

表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序(Matlab) 目录 表情识别 | LBPSVM实现脸部动态特征的人脸表情识别程序(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1 运行环境 程序运行在Windows系统下&am…

不同技术实现鼠标滚动图片的放大缩小

摘要: 最近弄PC端的需求时,要求在layui技术下实现鼠标滚动图片的放大缩小的功能!下面来总结一下不同框架剩下这功能! layui: 看了一下layui文档,其实这有自带的组件的!但是又版本要求的!并且layui的官方文档…

让ThreadPoolExecutor无所遁形:Java线程池运行原理详解

ThreadPoolExecutor的核心工作原理 当我们在Java中讨论并发和多线程时,ThreadPoolExecutor 是不可或缺的一个类。在 java.util.concurrent 包下,该类负责管理线程池内的线程,包括线程的创建、执行、管理以及线程池的监控等。理解 ThreadPool…

玩转手机在AidLux上安装宝塔面板

AidLux,手机不用刷机、不用root,直接在手机应用市场就能下载使用。 1.4G的应用包,看起来挺大的,那是因为内嵌了一套完整的AIoT应用开发和部署平台。 不仅Android手机可以玩,华为的Harmony系统也可以使用。 使用它最主…

websocket爬虫

人群看板需求分析 先找到策略中心具体的数据。对应数据库中的数据 看看接口是否需要被逆向 点开消费者细分,可以找到人群包(人群名称) 点击查看透视 label字段分类: 在这里插入图片描述 预测年龄:tagTitle 苹果id&#x…

【Unity基础】TextMeshPro组件学习过程记录

目录 1.TextMeshPro组件渲染创建文本RTL Editor字体Font Asset字体加粗,下划线等字体大小控制字体颜色控制字体渐变控制字符间隔、单词间隔、行间距、段落间距控制WrappingUV映射控制代码 2.TextMeshPro组件AssetFace InfoGeneration Setting 3.使用Dynamic SDF Sys…

从C语言到C++过渡篇(快速入门C++)

目录 引言 命名空间 C 的输入输出(cout & cin) 输出 cout 输入 cin 缺省参数 函数重载 知识要点讲解 函数重载底层 引用& 内联函数 auto & nullptr 结语 引言 很多同学从C语言到C的转变不知从何下手,今天这篇文章主…

【MRI重建】Cartesian采样中data consistency 常规数据一致性实现(pytorch)

关于 在MRI重建中,data consistency 可以帮助加快MRI图像重建和减少模型重建带来的重建误差。 工具 方法实现 x_rec: 重建图像, (batch_size,2,H,W) mask: 欠采样模版,(batch_size,2,H,W) k_un: 真实欠采样采集数据, (batch_size,2,H,W) torch.view_as_complex: 将实数数据…

【Linux】HTTP协议2

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:承接上文【Linux】HTTP协议1 目录 👉🏻HTTP方法👉🏻HTTP状态码&…

Swift - 流程控制

文章目录 Swift - 流程控制if-else2. while3. for3.1 闭区间运算符3.2 半开区间运算符3.3 for - 区间运算符用在数组上3.3.1 单侧区间 3.4 区间类型3.5 带间隔的区间值 4. switch4.1 fallthrough4.2 switch注意点 5. 复合条件6. 区间匹配、元组匹配7. 值绑定8. where9. 标签语句…

webpack中mode、NODE_ENV、DefinePlugin、cross-env的使用

本文讲的全部知识点,都是和webpack相关的。如果你之前有疑问,那本文一定能帮你搞清楚。 问题来源一般是类似下面代码(webpack.json中): "scripts": {"dev": "cross-env NODE_ENVdevelopmen…

BUUCTF_[BSidesCF 2020]Had a bad day

[BSidesCF 2020]Had a bad day 1.一看题目直接尝试文件包含 2.直接报错,确实是存在文件包含漏洞 http://307b4461-36d6-443f-879a-68803a57f721.node5.buuoj.cn:81/index.php?categoryphp://filter/convert.base64-encode/resourceindex strpos() 函数查找字符串…

StarRocks x Paimon 构建极速实时湖仓分析架构实践

Paimon 介绍 Apache Paimon 是新一代的湖格式,可以使用 Flink 和 Spark 构建实时 Lakehouse 架构,以进行流式处理和批处理操作。Paimon 创新性地使用 LSM(日志结构合并树)结构,将实时流式更新引入 Lakehouse 架构中。 …

Docker基本操作 容器相关命令

docker run:运行镜像; docker pause:暂停容器,会让该容器暂时挂起; docker unpauser:从暂停到运行; docker stop:停止容器,杀死进程; docker start:重新创建进程。 docker ps:查看所有运行的容器及其状态,默认只展…

WildCard开通GitHub Copilot

更多AI内容请关注我的专栏:《体验AI》 期待您的点赞👍收藏⭐评论✍ WildCard开通GitHub Copilot GitHub Copilot 简介主要功能工作原理 开通过程1、注册Github账号2、准备一张信用卡或虚拟卡3、进入github copilot页4、选择试用5、选择支付方式6、填写卡…

实现SpringMVC底层机制(一)

文章目录 1.环境配置1.创建maven项目2.创建文件目录3.导入jar包 2.开发核心控制器文件目录1.流程图2.编写核心控制器SunDispatcherServlet.java3.类路径下编写spring配置文件sunspringmvc.xml4.配置中央控制器web.xml5.配置tomcat,完成测试1.配置发布方式2.配置热加…

创建Spring Boot项目

选择Maven Archetype,之后再Archetype选择webapp 两个都打勾 这是当前的打勾 这个是以后都默认勾上 打开对应的路径,用vscode打开settings.xml 加入国内源 阿里云 若没有此文件可上网查找 若jar包出现问题,可在repostitory文件内全删除 之后在Maven刷…

巴特沃斯滤波原理及代码实现(matlab详细过程版)

目录 一、算法原理1、原理概述2、参考文献 二、代码实现三、结果展示 本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 巴特沃斯滤波器(Butterworth filt…

主成分分析(PCA)在 Java 中的简单应用

在数据科学的众多工具中,主成分分析(PCA)是一种非常重要的统计技术,用于数据降维和模式识别。它通过提取数据中的关键特征来简化数据结构,从而帮助我们更好地理解数据集的主要变化因素。本文将介绍如何在 Java 编程环境…
最新文章