dsp中F28335芯片用三角载波生成epwm波的具体编程举例
时间: 2024-03-24 10:39:04 浏览: 241
基于DSP28335的PWM程序
好的,以下是一个简单的例子,用于在F28335芯片上使用三角载波生成EPWM波:
```c
#include "F2837xS_device.h"
#include "F2837xS_Examples.h"
void InitEPwm1(void);
void InitEPwm2(void);
void InitEPwm3(void);
void InitEPwmGpio(void);
// 定义一个用于三角波生成的计数器
Uint16 epwm_cnt;
void main(void)
{
InitSysCtrl(); // 初始化系统控制模块
InitEPwmGpio(); // 初始化EPWM引脚
InitEPwm1(); // 初始化EPWM1
InitEPwm2(); // 初始化EPWM2
InitEPwm3(); // 初始化EPWM3
// 用于三角波生成的计数器从0开始计数
epwm_cnt = 0;
// 开始计数
while(1)
{
// 计数器的值从0到255
if(epwm_cnt < 255)
{
epwm_cnt++;
}
else
{
epwm_cnt = 0;
}
}
}
void InitEPwm1(void)
{
// 初始化EPWM1
EPwm1Regs.TBPRD = 5999; // 设置周期为5999
EPwm1Regs.TBPHS.bit.TBPHS = 0; // 相位为0
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上向下计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 关闭相位同步
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 同步信号为计数器清零时
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 静态比较
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // CMPA在计数器清零时被加载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQCTL.bit.CAU = AQ_SET; // 当CMPA小于计数器值时,设置EPWMxA
EPwm1Regs.AQCTL.bit.CAD = AQ_CLEAR;
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能死区时间
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 死区时间时高电平有效
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区时间源为DBA
EPwm1Regs.DBRED = 50; // 设置上升沿死区时间
EPwm1Regs.DBFED = 50; // 设置下降沿死区时间
EPwm1Regs.CMPA.bit.CMPA = 3000; // 初始化CMPA为3000
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // SOCA在计数器清零时产生
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // SOCA每一个事件产生一次
}
void InitEPwm2(void)
{
// 初始化EPWM2
EPwm2Regs.TBPRD = 5999; // 设置周期为5999
EPwm2Regs.TBPHS.bit.TBPHS = 1200; // 相位为1200
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上向下计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 开启相位同步
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步信号来自EPWMxSYNC
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 静态比较
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // CMPA在计数器清零时被加载
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.AQCTL.bit.CAU = AQ_CLEAR; // 当CMPA小于计数器值时,清空EPWMxA
EPwm2Regs.AQCTL.bit.CAD = AQ_SET; // 当CMPA大于计数器值时,设置EPWMxA
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能死区时间
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 死区时间时高电平有效
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区时间源为DBA
EPwm2Regs.DBRED = 50; // 设置上升沿死区时间
EPwm2Regs.DBFED = 50; // 设置下降沿死区时间
EPwm2Regs.CMPA.bit.CMPA = 2500; // 初始化CMPA为2500
EPwm2Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // SOCA在计数器清零时产生
EPwm2Regs.ETPS.bit.SOCAPRD = ET_1ST; // SOCA每一个事件产生一次
}
void InitEPwm3(void)
{
// 初始化EPWM3
EPwm3Regs.TBPRD = 5999; // 设置周期为5999
EPwm3Regs.TBPHS.bit.TBPHS = 2400; // 相位为2400
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上向下计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 开启相位同步
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步信号来自EPWMxSYNC
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 静态比较
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // CMPA在计数器清零时被加载
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm3Regs.AQCTL.bit.CAU = AQ_SET; // 当CMPA小于计数器值时,设置EPWMxA
EPwm3Regs.AQCTL.bit.CAD = AQ_CLEAR; // 当CMPA大于计数器值时,清空EPWMxA
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能死区时间
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 死区时间时高电平有效
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区时间源为DBA
EPwm3Regs.DBRED = 50; // 设置上升沿死区时间
EPwm3Regs.DBFED = 50; // 设置下降沿死区时间
EPwm3Regs.CMPA.bit.CMPA = 2000; // 初始化CMPA为2000
EPwm3Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA
EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // SOCA在计数器清零时产生
EPwm3Regs.ETPS.bit.SOCAPRD = ET_1ST; // SOCA每一个事件产生一次
}
void InitEPwmGpio(void)
{
// 初始化EPWM引脚
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1;
EDIS;
}
```
在这个例子中,我们使用了三个EPWM模块(EPWM1、EPWM2和EPWM3),每个模块都被初始化为三角波模式。在 `main()` 函数中,我们定义了一个 `epwm_cnt` 变量,用于计数器的计数。然后,我们使用一个无限循环来不断地更新计数器的值,从而生成三角波。
在 `InitEPwm1()`、`InitEPwm2()` 和 `InitEPwm3()` 函数中,我们使用了一系列的寄存器设置来初始化每个EPWM模块。这些设置包括周期、相位、计数模式、同步信号、比较模式、死区时间、比较器值等等。我们还使用 `InitEPwmGpio()` 函数来初始化EPWM引脚。
这个例子只是一个简单的示例,你可以根据自己的需求修改EPWM模块的设置。同时,你需要了解更多关于F28335芯片和EPWM模块的知识,才能深入理解这个例子。
阅读全文