tlc5620 dsp28335实现矩形波输出
时间: 2024-05-24 20:13:11 浏览: 83
利用DSP28335实现SPWM波形产生
4星 · 用户满意度95%
要实现矩形波输出,可以使用tlc5620数字模拟转换器(DAC)和dsp28335单片机。
首先,需要配置dsp28335的GPIO输出引脚,将其连接到tlc5620的数字输入引脚。然后,使用dsp28335的PWM模块生成一个固定频率的方波信号,将其输出到GPIO引脚,以控制tlc5620的数字输入。
在程序中,可以使用定时器中断来控制方波的占空比,从而产生矩形波。具体实现步骤如下:
1. 配置GPIO输出引脚,将其连接到tlc5620的数字输入引脚。
2. 配置PWM模块,生成一个固定频率的方波信号。
3. 在定时器中断中,控制方波的占空比,从而产生矩形波。
4. 将矩形波信号输出到tlc5620的数字输入,通过DAC输出到外部。
以下是一个简单的示例程序:
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define PWM_FREQ 10000 // PWM频率
#define PWM_DUTY 50 // PWM占空比
#define DAC_MAX 4095 // DAC最大值
Uint16 dac_val = 0; // DAC输出值
interrupt void TimerISR(void)
{
static Uint16 count = 0;
if (count < PWM_DUTY) {
GpioDataRegs.GPASET.bit.GPIO0 = 1; // 设置GPIO引脚为高电平
} else {
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // 设置GPIO引脚为低电平
}
count++;
if (count >= 100) count = 0; // PWM周期为100个时钟周期
dac_val = (count < PWM_DUTY) ? DAC_MAX : 0; // 根据PWM占空比计算DAC输出值
DacaRegs.DACVALS.all = dac_val; // 将DAC输出值写入DAC寄存器
}
void main(void)
{
InitSysCtrl(); // 初始化系统时钟和PLL
InitPieCtrl(); // 初始化PIE中断控制器
InitPieVectTable(); // 初始化PIE中断向量表
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // 将GPIO0引脚配置为GPIO模式
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 将GPIO0引脚配置为输出模式
EDIS;
InitEPwm1(); // 初始化EPWM1模块,用于产生PWM信号
InitDaca(); // 初始化DACA模块,用于输出DAC信号
EALLOW;
PieVectTable.TINT0 = &TimerISR; // 将定时器中断函数注册到PIE中断向量表
EDIS;
InitCpuTimers(); // 初始化CPU定时器
ConfigCpuTimer(&CpuTimer0, 150, 10000); // 配置CPU定时器为10ms周期
CpuTimer0Regs.TCR.all = 0x4001; // 启动CPU定时器
IER |= M_INT1; // 允许PIE INT1中断(定时器中断)
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 启用PIE中断控制器
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 允许PIE INT1.7中断(定时器中断)
EINT; // 全局中断使能
while (1) {}
}
void InitEPwm1(void)
{
EPwm1Regs.TBPRD = (150e6 / (2 * PWM_FREQ)) - 1; // 计算PWM周期
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 设置EPWM1A为高电平
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 设置EPWM1A为低电平
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;
EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD / 2; // 设置PWM占空比
EPwm1Regs.CMPB.bit.CMPB = EPwm1Regs.TBPRD / 2;
EPwm1Regs.ETSEL.bit.SOCAEN = 0;
EPwm1Regs.ETSEL.bit.SOCBEN = 0;
EPwm1Regs.ETSEL.bit.INTEN = 0;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;
EPwm1Regs.ETCLR.bit.INT = 1;
}
void InitDaca(void)
{
DacaRegs.DACCTL.bit.DACREFSEL = 1; // DAC参考电压为外部电压
DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 允许DAC输出
DacaRegs.DACVALS.all = 0; // 初始化DAC输出值为0
}
阅读全文