使用TMS320F28377D开发板,写一套以按键触发中断的epwm的程序,使pwm只出现两个周期
时间: 2024-03-21 13:38:43 浏览: 56
c代码-中断控制pwm输出
好的,以下是以按键触发中断的EPWM程序示例,使PWM只出现两个周期:
```c
// 包含头文件
#include "F2837xD_device.h"
#include "F2837xD_pievect.h"
// 定义按键状态
volatile uint16_t buttonStatus = 0;
// 初始化GPIO
void initGPIO(void)
{
// 配置GPIO为输入模式
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 0;
EDIS;
}
// 初始化ePWM模块
void initEPWM(void)
{
// 配置PWM时钟
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM7 = 1; // 使能ePWM7时钟
EDIS;
// 配置PWM管脚
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1; // 配置GPIO12为ePWM7A管脚
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // 配置GPIO12为输出模式
EDIS;
// 配置PWM计数器
EPwm7Regs.TBPRD = 1000; // PWM周期为1000个计数脉冲
EPwm7Regs.TBCTL.bit.CTRMODE = 0; // 边沿对齐模式
EPwm7Regs.TBCTL.bit.PHSEN = 1; // 启用相位补偿
EPwm7Regs.TBPHS.bit.TBPHS = 0; // 相位补偿值为0
// 配置PWM计数器模块中断
EPwm7Regs.ETSEL.bit.INTSEL = 1; // 选择计数器比较中断
EPwm7Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm7Regs.ETPS.bit.INTPRD = 1; // 中断周期为1个PWM周期
// 配置PWM比较器
EPwm7Regs.CMPA.bit.CMPA = 500; // PWM占空比初始值为50%
EPwm7Regs.AQCTLA.bit.CAU = 2; // 上升沿时设置为翻转
EPwm7Regs.AQCTLA.bit.CAD = 1; // 下降沿时设置为置位
}
// 中断服务函数
__interrupt void buttonIsr(void)
{
buttonStatus = GpioDataRegs.GPADAT.bit.GPIO0; // 读取按键状态
if(buttonStatus == 1) // 按键按下
{
EPwm7Regs.TBCTL.bit.CTRMODE = 0; // 边沿对齐模式
EPwm7Regs.TBCTL.bit.PHSEN = 1; // 启用相位补偿
EPwm7Regs.TBPHS.bit.TBPHS = 0; // 相位补偿值为0
EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频为1
EPwm7Regs.TBCTL.bit.CLKDIV = 0; // 低速时钟分频为1
EPwm7Regs.TBPRD = 500; // PWM周期为500个计数脉冲
EPwm7Regs.CMPA.bit.CMPA = 250; // PWM占空比为50%
}
else // 按键弹起
{
EPwm7Regs.TBCTL.bit.CTRMODE = 0; // 边沿对齐模式
EPwm7Regs.TBCTL.bit.PHSEN = 1; // 启用相位补偿
EPwm7Regs.TBPHS.bit.TBPHS = 0; // 相位补偿值为0
EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频为1
EPwm7Regs.TBCTL.bit.CLKDIV = 0; // 低速时钟分频为1
EPwm7Regs.TBPRD = 1000; // PWM周期为1000个计数脉冲
EPwm7Regs.CMPA.bit.CMPA = 500; // PWM占空比为50%
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志位
}
// 主函数
int main(void)
{
// 禁用全局中断
DINT;
// 初始化PIE中断控制器
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 使能PIE中断控制器
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能GPIO0中断
IER |= M_INT1; // 使能PIE中断
// 初始化GPIO
initGPIO();
// 初始化ePWM
initEPWM();
// 使能全局中断
EINT;
// 程序主循环
while(1)
{
}
}
```
在这个示例程序中,我们使用`GPIO0`作为按键的输入引脚,`GPIO12`作为PWM输出引脚。按键按下时,PWM会输出两个周期,频率为1kHz;按键弹起时,PWM会恢复到原来的状态,频率为500Hz。主程序的作用是等待中断的发生,因此程序进入一个空的死循环。
阅读全文