请基于TMS28335C2000和DAC7724芯片设计定时数模转换(输出cos波形和锯齿波,列出引脚初始化函数,写函数,主函数,配置函数,中断函数)
时间: 2024-02-05 18:13:56 浏览: 132
基于MAX125转换器和TMS320LF2407A芯片实现电能质量监控系统的设计
首先需要说明的是,TMS28335C2000是一款数字信号处理器(DSP),并不搭载模拟输出模块,因此无法直接输出模拟信号。同时,DAC7724是一款4路12位DAC芯片,可以将数字信号转换为模拟信号输出,但需要通过SPI或者并行接口与DSP进行通信。
因此,本题需要先确定如何将DSP的数字信号转换为DAC7724能够接收的数字信号,并通过DAC7724输出cos波形和锯齿波。
以下是基于TMS28335C2000和DAC7724芯片设计定时数模转换的示例代码:
引脚初始化函数:
```
void initPins(void) {
// 初始化SPI通信引脚
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0b10; // SPI_SIMO
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0b10; // SPI_SOMI
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0b10; // SPI_CLK
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0b10; // SPI_CS
// 初始化DAC7724控制引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // /SYNC
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // LDAC
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // CLR
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // RESET
GpioDataRegs.GPASET.bit.GPIO0 = 1; // /SYNC高电平
GpioDataRegs.GPASET.bit.GPIO1 = 1; // LDAC高电平
GpioDataRegs.GPASET.bit.GPIO2 = 1; // CLR高电平
GpioDataRegs.GPASET.bit.GPIO3 = 1; // RESET高电平
}
```
SPI写函数:
```
void spiWrite(uint16_t data) {
SpiaRegs.SPITXBUF = data;
while(SpiaRegs.SPISTS.bit.INT_FLAG != 1);
SpiaRegs.SPIRXBUF;
}
```
DAC7724配置函数:
```
void initDAC7724(void) {
// 复位DAC7724
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1; // RESET低电平
DELAY_US(1);
GpioDataRegs.GPASET.bit.GPIO3 = 1; // RESET高电平
// 设置SPI模式
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR = 15;
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICCR.bit.SPIMASTER = 1;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
// 设置SPI时钟频率
SpiaRegs.SPIBRR = 0x3FF;
// DAC7724初始化
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // /SYNC低电平
spiWrite(0b0000111111111111); // 使能所有4路DAC输出
spiWrite(0b1111111111111111); // 设置参考电压为AVDD和AVSS
spiWrite(0b0000001111000000); // 设置输出为字节模式,更新寄存器时立即生效
spiWrite(0b0000000000000000); // 将DAC输出值全部清零
GpioDataRegs.GPASET.bit.GPIO0 = 1; // /SYNC高电平
}
```
定时器中断函数:
```
interrupt void timerISR(void) {
static uint16_t i = 0;
static uint16_t dacValue = 0;
// 输出cos波形
dacValue = (uint16_t)(2047 * cos(2 * 3.1415926 * i / 1024) + 2048);
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // /SYNC低电平
spiWrite(i << 2);
spiWrite(dacValue >> 4);
GpioDataRegs.GPASET.bit.GPIO0 = 1; // /SYNC高电平
i++;
// 输出锯齿波
dacValue = i << 2;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // /SYNC低电平
spiWrite(i << 2);
spiWrite(dacValue >> 4);
GpioDataRegs.GPASET.bit.GPIO0 = 1; // /SYNC高电平
i++;
if(i >= 1024) {
i = 0;
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
```
主函数:
```
int main(void) {
// 系统初始化
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.TIMER0_INT = &timerISR;
EDIS;
initPins();
initDAC7724();
// 定时器初始化
CpuTimer0Regs.TCR.bit.TSS = 1; // 停止定时器
CpuTimer0Regs.PRD.all = 375; // 定时器周期为375个SYSCLKOUT
CpuTimer0Regs.TCR.bit.TRB = 1; // 重载定时器周期
CpuTimer0Regs.TCR.bit.TIE = 1; // 使能定时器中断
CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器
// 使能总中断
IER |= M_INT1;
EINT;
ERTM;
while(1);
}
```
阅读全文