DSP28335的SPWM波生成方法

DSP28335的SPWM波生成方法DSP 新手 研究了一下午 在这里做个总结 希望对其他刚接触 DSP 的新手也能有所帮助 首先要明白 SPWM 波是什么 SPWM 波实际上就只有 2 种电平 而且其频率一般是你自己给定的 所以难点在于如何调节每个周期内的占空比 这里采用的是双极性调制法 先说总体思路 以 TBCTR 为载波 以 CMPA 为调制波 并且让 CMPA 的值不断更新 中断方式 就可以在 ePWMxA 产生 SPWM 波 看了一些资料的你 没看就去看吧 应该能了解到 ePWM 模块的 TB 寄存器是设置频率的 CMPA 和 CMPB 是设置占空比的 AQ

DSP新手,研究了一下午,在这里做个总结,希望对其他刚接触DSP的新手也能有所帮助。

首先要明白SPWM波是什么。

SPWM波实际上就只有2种电平,而且其频率一般是你自己给定的,所以难点在于如何调节每个周期内的占空比,这里采用的是双极性调制法。

先说总体思路:以TBCTR为载波,以CMPA为调制波,并且让CMPA的值不断更新(中断方式),就可以在ePWMxA产生SPWM波。

DSP28335的SPWM波生成方法

看了一些资料的你(没看就去看吧),应该能了解到ePWM模块的TB寄存器是设置频率的,CMPA和CMPB是设置占空比的,AQ是设置触发方式的

如果设置好TB,那么就可以使得ePWM模块的计数器TBCTR从0上升到TBPRD然后下降到0,以此得到三角调制波,那就必须有

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

此外还要设置AQ,保证是调制波大于载波的时候,输出高电平

EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM1A on event A, up count
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;      // Set PWM1A on event A, down count
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // Clear PWM1B on event B, up count
EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;      // Set PWM1B on event B, down count






而载波要怎么获得呢?Easy,写函数表即可。形式就是 sin(2π*i/N),i=0,1,…,N-1

float sina[256];

for(k=0;k

但是有没有发现,这里的载波并不是那种有正有负的、并且幅值为1的形式呢?我们能用的载波和图中的载波看起来就好像是标准载波加1并且乘以TBPRD/2得到的对吧?既然没法对载波进行变换,那就对调制波进行同样的变换,让调制波为TBPRD*(1+ M*sin(wt))/2,M为调制比,这样得到的调制结果也会是相同的,这里很关键。

当然最关键的地方就是中断了,这一段意思很明白,就是根据正弦表不断更新CMPA和CMPB的值,这就相当于一个阶梯状的调制波TBPRD*(1+ M*sin(wt))/2

interrupt void epwm1_isr(void){ EPwm1Regs.CMPA.half.CMPA=EPwm1Regs.TBPRD*((1.0+M*sina[i])/2.0); EPwm1Regs.CMPB=EPwm1Regs.TBPRD*((1.0+M*sinb[i])/2.0); i++; if (i>=N){ i=0; } EPwm1Regs.ETCLR.bit.INT = 1; //写1对ETFLG[INT]状态标志位清零才能进行下一次中断 PieCtrlRegs.PIEACK.all=PIEACK_GROUP3; } 

完整代码如下,烧录后,可以在PWM1引脚观察到SPWM波输出,关于频率的设置(TB的设置)这里就不多说了:

#include "DSP2833x_Project.h" #include "math.h" void InitEPwm1Example(void); void Gpio_Setup(void); interrupt void epwm1_isr(void); int i,k=0; float M=0.8;//调制比 int N=256; //采样点数 float sina[256]; float sinb[256]; void main(void) { InitSysCtrl(); //初始化系统控制 InitEPwm1Gpio(); Gpio_Setup(); //子函数,Gpio口设置 for(k=0;k 
  
    =N){ i=0; } EPwm1Regs.ETCLR.bit.INT = 1; //写1对ETFLG[INT]状态标志位清零才能进行下一次中断 PieCtrlRegs.PIEACK.all=PIEACK_GROUP3; } 
  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175819.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:21
下一篇 2026年3月26日 下午11:21


相关推荐

  • phpCOW机制详解

    phpCOW机制详解

    2021年10月31日
    40
  • 6大智能体框架横评:Dify/Coze/n8n/AutoGen/LangChain/CrewAI技术解析

    6大智能体框架横评:Dify/Coze/n8n/AutoGen/LangChain/CrewAI技术解析

    2026年3月15日
    3
  • virtualbox怎么安装windows10_安装ubuntu教程

    virtualbox怎么安装windows10_安装ubuntu教程步骤1:下载WindowsXP镜像GhostXP镜像下载地址本教程使用的是电脑公司GHOSTXPSP3步骤2:创建WindowsXP虚拟机步骤3:安装WindowsXP系统重启

    2022年8月2日
    12
  • Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程

    Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程1.1Web抓包火狐抓包环境需求:火狐浏览器代理插件1.打开测试工具BurpSuite,默认工具拦截功能是开启的,颜色较深,我们点击取消拦截。下图取消拦截状态,数据包可以自由通过:2.按下图顺序点击选显卡来到代理设置3.可以看到默认的代理设置情况,本地代理地址:127.0.0.1,代理端口8080。如果前面没有勾选一定要选择勾选。工具代理设置完毕。4.证书安装,浏览器输输入http://burp/,点击图示位置下载证书5配置证书,打开浏览器并导入证书火狐浏览器开打开证

    2022年5月4日
    756
  • 个人网站赚钱经营解密

    个人网站赚钱经营解密现在所有的网站都在考虑如何赚钱 个人网站也不例外 个人网站最开始的动机可能是出于兴趣或一种爱好 但时间一长 这些兴趣或爱好便为自己积累了许多资源 比如数量可观的访问量 当这些资源积累到一定程度的时候 商业意识比较敏感的个人网站站长便开始寻求开展电子商务 将自己手中的资源进行商业操作 从而 个人网站开始赚钱 当然 目前比较流行的个人网站赚钱方式可能更多的还是依赖于广告 但从目前个人网站的广告收入来看

    2026年3月26日
    2
  • tinyxml2使用方法

    tinyxml2使用方法最近项目中使用到xml,最终选用了tinyxml2,学习后写个使用总结。

    2022年6月9日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号