基于TMS320F28335,使用ccs12.2,以代码的形式设计一个可控 ePWM 信号 BUCK 电路,各路 ePWMA 作为可控占空比输出,各路 ePWMB直接点亮一组发光二极管,亮灭规律如下: (1)PWM_LED2、PWM_LED4、PWM_LED6 灯以 5 秒的时间间隔灯闪,其他灯灭,各路 EPWMA 无输出。
时间: 2024-02-26 12:56:42 浏览: 237
好的,根据您的要求,我可以提供以下代码作为参考:
```c
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#define PWM_PERIOD 2000 // PWM周期,单位为ns,对应100kHz的频率
// ePWM配置函数
void initEPWM(void)
{
// 配置GPIO口为ePWM功能
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // 配置为ePWM1A
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // 配置为ePWM1B
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // 配置为ePWM2A
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // 配置为ePWM2B
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // 配置为ePWM3A
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // 配置为ePWM3B
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; // 配置为ePWM4A
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 1; // 禁止上下拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1; // 配置为ePWM4B
EDIS;
// 开启ePWM1、2、3、4时钟
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM4 = 1;
// 配置ePWM时钟
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上升/下降计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位同步
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用影子寄存器更新周期寄存器
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 当计数器为0时,产生同步信号
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // 高速时钟分频为2
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2; // 时钟分频为2
EPwm1Regs.TBPRD = PWM_PERIOD; // PWM周期
// 配置ePWM1A输出
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 计数器为0时,输出高电平
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 计数器为上升沿时,输出低电平
// 配置ePWM1B输出
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // 计数器为0时,输出高电平
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // 计数器为下降沿时,输出低电平
// 同时配置ePWM2、3、4的输出,省略代码
// 启用ePWM1、2、3、4
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上升/下降计数模式
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上升/下降计数模式
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上升/下降计数模式
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上升/下降计数模式
}
// ePWM输出占空比设置函数
void setEPWMDuty(uint16_t duty)
{
// 计算占空比对应的计数值
uint16_t count = PWM_PERIOD * duty / 100;
// 设置ePWM1A的占空比
EPwm1Regs.CMPA.bit.CMPA = count;
// 同时设置ePWM2、3、4的占空比,省略代码
}
// ePWMB输出设置函数
void setEPWMB(uint8_t value)
{
// 依次点亮LED2、4、6
if(value % 5 == 2 || value % 5 == 4 || value % 5 == 6)
{
GpioDataRegs.GPASET.bit.GPIO12 = 1; // 点亮LED2
}
else
{
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1; // 熄灭LED2
}
// 省略代码,依次点亮LED4、6
// 延时5秒
DELAY_US(5000000);
}
```
在上述代码中,我们首先通过`initEPWM()`函数配置了ePWM1~4的基本参数,并定义了`setEPWMDuty()`和`setEPWMB()`函数来分别控制ePWMA的输出占空比和ePWMB的LED点亮规律。
对于要求中的第一条规律,在`setEPWMB()`函数中,我们通过对当前时间取模的方法来判断应该点亮还是熄灭LED,并在点亮LED2、4、6时延时5秒,以实现灯以5秒的时间间隔闪烁的效果。
需要注意的是,在实际使用中,您可能需要根据具体的硬件电路和需求来进行适当的修改。
阅读全文