利用TMSF28335C2000设计定时DA输出仿真与设计,设计三个小任务写出完整代码
时间: 2023-10-09 08:04:21 浏览: 31
任务一:设计定时DA输出
```c
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#define CPU_FREQ 200E6
#define PWM_FREQ 10E3
#define MAX_DUTY_CYCLE 1.0
Uint16 CpuTimer0Flag = 0;
// 初始化CPU Timer0
void InitCpuTimer0(void)
{
// 停止定时器
CpuTimer0Regs.TCR.bit.TSS = 1;
// 清除计数器
CpuTimer0Regs.TIM.all = 0x00000000;
// 加载周期值
CpuTimer0Regs.PRD.all = (Uint32)(CPU_FREQ / PWM_FREQ);
// 启用定时器中断
CpuTimer0Regs.TCR.bit.TIE = 1;
// 启动定时器
CpuTimer0Regs.TCR.bit.TSS = 0;
}
// CPU Timer0中断服务函数
__interrupt void CpuTimer0ISR(void)
{
// 清除定时器中断标志位
CpuTimer0Flag = 1;
// 清除 PIE 中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
// 初始化 DA 输出
void InitDA(void)
{
// 使能 DA 模块时钟
CpuSysRegs.PCLKCR16.bit.DAC_A = 1;
// 设置 DA 控制寄存器
DacaRegs.DACCTL.bit.DACREFSEL = 1; // 内部参考电压为2.5V
DacaRegs.DACCTL.bit.LOADMODE = 0; // 立即加载数据到 DAC
DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 使能 DAC 输出
// 设置 DA 数据寄存器(默认值:0x7FFF)
DacaRegs.DACVALS.all = (Uint16)(MAX_DUTY_CYCLE * 0xFFFF);
}
// 主函数
int main(void)
{
// 禁用全局中断
DINT;
// 初始化系统时钟
InitSysCtrl();
// 初始化 CPU Timer0
InitCpuTimer0();
// 初始化 DA 输出
InitDA();
// 使能全局中断
EINT;
// 主循环
while (1)
{
// 等待定时器中断
while (!CpuTimer0Flag);
CpuTimer0Flag = 0;
// 修改 DA 数据寄存器值
DacaRegs.DACVALS.all = (Uint16)(MAX_DUTY_CYCLE * 0xFFFF);
}
}
```
任务二:设计定时DA输出(带有线性变化)
```c
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#define CPU_FREQ 200E6
#define PWM_FREQ 10E3
#define MAX_DUTY_CYCLE 1.0
Uint16 CpuTimer0Flag = 0;
float DutyCycle = 0.0;
// 初始化CPU Timer0
void InitCpuTimer0(void)
{
// 停止定时器
CpuTimer0Regs.TCR.bit.TSS = 1;
// 清除计数器
CpuTimer0Regs.TIM.all = 0x00000000;
// 加载周期值
CpuTimer0Regs.PRD.all = (Uint32)(CPU_FREQ / PWM_FREQ);
// 启用定时器中断
CpuTimer0Regs.TCR.bit.TIE = 1;
// 启动定时器
CpuTimer0Regs.TCR.bit.TSS = 0;
}
// CPU Timer0中断服务函数
__interrupt void CpuTimer0ISR(void)
{
// 清除定时器中断标志位
CpuTimer0Flag = 1;
// 清除 PIE 中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
// 初始化 DA 输出
void InitDA(void)
{
// 使能 DA 模块时钟
CpuSysRegs.PCLKCR16.bit.DAC_A = 1;
// 设置 DA 控制寄存器
DacaRegs.DACCTL.bit.DACREFSEL = 1; // 内部参考电压为2.5V
DacaRegs.DACCTL.bit.LOADMODE = 0; // 立即加载数据到 DAC
DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 使能 DAC 输出
// 设置 DA 数据寄存器(默认值:0x7FFF)
DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF);
}
// 主函数
int main(void)
{
// 禁用全局中断
DINT;
// 初始化系统时钟
InitSysCtrl();
// 初始化 CPU Timer0
InitCpuTimer0();
// 初始化 DA 输出
InitDA();
// 使能全局中断
EINT;
// 主循环
while (1)
{
// 等待定时器中断
while (!CpuTimer0Flag);
CpuTimer0Flag = 0;
// 修改 DA 数据寄存器值
DutyCycle += 0.01;
if (DutyCycle > MAX_DUTY_CYCLE)
{
DutyCycle = 0.0;
}
DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF);
}
}
```
任务三:设计定时DA输出(带有正弦变化)
```c
#include "F2837xD_device.h"
#include "F2837xD_Examples.h"
#include "math.h"
#define CPU_FREQ 200E6
#define PWM_FREQ 10E3
#define MAX_DUTY_CYCLE 1.0
Uint16 CpuTimer0Flag = 0;
float DutyCycle = 0.0;
// 初始化CPU Timer0
void InitCpuTimer0(void)
{
// 停止定时器
CpuTimer0Regs.TCR.bit.TSS = 1;
// 清除计数器
CpuTimer0Regs.TIM.all = 0x00000000;
// 加载周期值
CpuTimer0Regs.PRD.all = (Uint32)(CPU_FREQ / PWM_FREQ);
// 启用定时器中断
CpuTimer0Regs.TCR.bit.TIE = 1;
// 启动定时器
CpuTimer0Regs.TCR.bit.TSS = 0;
}
// CPU Timer0中断服务函数
__interrupt void CpuTimer0ISR(void)
{
// 清除定时器中断标志位
CpuTimer0Flag = 1;
// 清除 PIE 中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
// 初始化 DA 输出
void InitDA(void)
{
// 使能 DA 模块时钟
CpuSysRegs.PCLKCR16.bit.DAC_A = 1;
// 设置 DA 控制寄存器
DacaRegs.DACCTL.bit.DACREFSEL = 1; // 内部参考电压为2.5V
DacaRegs.DACCTL.bit.LOADMODE = 0; // 立即加载数据到 DAC
DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 使能 DAC 输出
// 设置 DA 数据寄存器(默认值:0x7FFF)
DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF);
}
// 主函数
int main(void)
{
// 禁用全局中断
DINT;
// 初始化系统时钟
InitSysCtrl();
// 初始化 CPU Timer0
InitCpuTimer0();
// 初始化 DA 输出
InitDA();
// 使能全局中断
EINT;
// 主循环
while (1)
{
// 等待定时器中断
while (!CpuTimer0Flag);
CpuTimer0Flag = 0;
// 修改 DA 数据寄存器值
DutyCycle = 0.5 * sin(2 * M_PI * PWM_FREQ * CpuTimer0Regs.TIM.all / CPU_FREQ) + 0.5;
DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF);
}
}
```