dsp28335 PWM实现流水灯,只要.c文件,不要延时函数
时间: 2023-12-24 21:05:53 浏览: 53
以下是基于DSP28335的PWM实现流水灯的代码,不包含延时函数。需要注意的是,该代码使用了DSP28335的定时器中断来实现流水灯效果。
```c
#include "DSP2833x_Device.h"
#define PWM_PERIOD 3750 // PWM周期为15000个CPU时钟周期,即3750个PWM时钟周期(PWM时钟频率为150MHz/128 = 1.171875MHz)
#define PWM_DUTY_MAX 3750 // 最大占空比为100%
volatile Uint16 pwm_cnt = 0;
interrupt void pwm_isr(void)
{
EALLOW;
EPwm1Regs.ETCLR.bit.INT = 1; // 清除PWM中断标志位
EDIS;
pwm_cnt++;
if (pwm_cnt > 3)
{
pwm_cnt = 0;
}
switch (pwm_cnt)
{
case 0:
EPwm1Regs.CMPA.half.CMPA = PWM_DUTY_MAX; // PWM1输出高电平
EPwm2Regs.CMPA.half.CMPA = 0; // PWM2输出低电平
EPwm3Regs.CMPA.half.CMPA = 0; // PWM3输出低电平
break;
case 1:
EPwm1Regs.CMPA.half.CMPA = 0; // PWM1输出低电平
EPwm2Regs.CMPA.half.CMPA = PWM_DUTY_MAX; // PWM2输出高电平
EPwm3Regs.CMPA.half.CMPA = 0; // PWM3输出低电平
break;
case 2:
EPwm1Regs.CMPA.half.CMPA = 0; // PWM1输出低电平
EPwm2Regs.CMPA.half.CMPA = 0; // PWM2输出低电平
EPwm3Regs.CMPA.half.CMPA = PWM_DUTY_MAX; // PWM3输出高电平
break;
case 3:
EPwm1Regs.CMPA.half.CMPA = 0; // PWM1输出低电平
EPwm2Regs.CMPA.half.CMPA = PWM_DUTY_MAX; // PWM2输出高电平
EPwm3Regs.CMPA.half.CMPA = 0; // PWM3输出低电平
break;
default:
break;
}
}
void main(void)
{
InitSysCtrl(); // 系统时钟初始化
InitPieCtrl(); // 中断初始化
IER = 0x0000; // 禁止所有中断
IFR = 0x0000; // 清除所有中断标志位
InitPieVectTable(); // 初始化PIE向量表
EALLOW;
PieVectTable.EPWM1_INT = &pwm_isr; // 将PWM中断函数指针注册到PIE向量表
EDIS;
// PWM1初始化
EPwm1Regs.TBPRD = PWM_PERIOD; // PWM周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0x00; // 增计数模式
EPwm1Regs.TBCTL.bit.PHSEN = 0x00; // 不使用相位补偿
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00; // 高速时钟分频系数为1
EPwm1Regs.TBCTL.bit.CLKDIV = 0x07; // 低速时钟分频系数为128
EPwm1Regs.CMPA.half.CMPA = 0; // PWM初始占空比为0%
EPwm1Regs.AQCTLA.bit.CAU = 0x02; // 当计数器计数到CMPA时,PWM输出高电平
EPwm1Regs.AQCTLA.bit.CAD = 0x01; // 当计数器计数到CMPA时,PWM输出低电平
// PWM2初始化
EPwm2Regs.TBPRD = PWM_PERIOD; // PWM周期
EPwm2Regs.TBCTL.bit.CTRMODE = 0x00; // 增计数模式
EPwm2Regs.TBCTL.bit.PHSEN = 0x00; // 不使用相位补偿
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0x00; // 高速时钟分频系数为1
EPwm2Regs.TBCTL.bit.CLKDIV = 0x07; // 低速时钟分频系数为128
EPwm2Regs.CMPA.half.CMPA = 0; // PWM初始占空比为0%
EPwm2Regs.AQCTLA.bit.CAU = 0x02; // 当计数器计数到CMPA时,PWM输出高电平
EPwm2Regs.AQCTLA.bit.CAD = 0x01; // 当计数器计数到CMPA时,PWM输出低电平
// PWM3初始化
EPwm3Regs.TBPRD = PWM_PERIOD; // PWM周期
EPwm3Regs.TBCTL.bit.CTRMODE = 0x00; // 增计数模式
EPwm3Regs.TBCTL.bit.PHSEN = 0x00; // 不使用相位补偿
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0x00; // 高速时钟分频系数为1
EPwm3Regs.TBCTL.bit.CLKDIV = 0x07; // 低速时钟分频系数为128
EPwm3Regs.CMPA.half.CMPA = 0; // PWM初始占空比为0%
EPwm3Regs.AQCTLA.bit.CAU = 0x02; // 当计数器计数到CMPA时,PWM输出高电平
EPwm3Regs.AQCTLA.bit.CAD = 0x01; // 当计数器计数到CMPA时,PWM输出低电平
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // 使能PWM中断
EDIS;
IER |= M_INT3; // 使能PIE中断
EINT; // 全局中断使能
while (1);
}
```
该代码中,通过三个EPWM模块分别控制三个LED灯,其中每个PWM模块的输出占空比在ISR中进行设置,以实现流水灯效果。在main函数中,通过使能PWM中断和PIE中断,来启用PWM输出和中断服务程序。