写一个TMS320F28035 定时器触发ADC采样的完整代码
时间: 2024-04-07 11:30:10 浏览: 218
下面是一个示例代码,演示如何在TMS320F28035微控制器上使用定时器触发ADC采样:
```c
#include "F2803x_Device.h"
#include "F2803x_Examples.h"
void InitSystem(void);
void InitADC(void);
void InitTimer(void);
Uint16 adcResult;
void main(void)
{
InitSystem();
InitADC();
InitTimer();
while(1)
{
// 在这里处理ADC采样结果
// 可以将结果存储到变量中或进行其他处理
}
}
void InitSystem(void)
{
// 禁用看门狗定时器
DisableDog();
// 初始化系统时钟
InitSysCtrl();
// 选择外部时钟源,例如晶体振荡器
// 这里假设使用20MHz的晶体振荡器
InitPll(10, 3);
// 设置时钟分频,这里设置SYSCLK为100MHz
// EPWM1时钟频率为100MHz/2 = 50MHz
// ADC采样时钟为50MHz/4 = 12.5MHz
InitPeripheralClocks();
}
void InitADC(void)
{
// 先初始化GPIO引脚,将其配置为ADC输入引脚
// 配置GPIO引脚为模拟输入
EALLOW;
// 这里假设使用的是GPIO0和GPIO1作为ADC输入引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
// 禁用拉电阻
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
// 配置GPIO引脚为ADC引脚
GpioCtrlRegs.AIOMUX1.bit.AIO0 = 2;
GpioCtrlRegs.AIOMUX1.bit.AIO1 = 2;
EDIS;
// 初始化ADC模块
InitAdc();
// 配置ADC采样窗口
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // ADCINA0作为采样通道0
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; // ADCINA1作为采样通道1
// 配置采样窗口触发源为定时器
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 选择ePWM1 SOC-A作为触发源
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // 选择ePWM1 SOC-A作为触发源
// 配置采样窗口触发方式为软件触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // 采样保持窗口为7个周期
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; // 采样保持窗口为7个周期
// 启用ADC模块和采样窗口
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 内部参考电压为AVDD-AVSS
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 中断延迟一个周期
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // 上电使能ADC模块
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 上电使能ADC参考电压
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // 上电使能ADC参考电压
AdcRegs.ADCSOC0CTL.bit.ACQEN = 1; // 启动采样通道0
AdcRegs.ADCSOC1CTL.bit.ACQEN = 1; // 启动采样通道1
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 中断延迟一个周期
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // ADCINT1触发源为采样窗口0
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; // 使能ADCINT1中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除ADCINT1中断标志位
// 启用全局中断
IER |= M_INT1;
EINT;
}
void InitTimer(void)
{
// 初始化ePWM模块
InitEPwm1Gpio();
InitEPwm2Gpio();
// 配置ePWM模块
EPwm1Regs.TBPRD = 5000; // 定时器周期为5000个周期
EPwm1Regs.CMPA.half.CMPA = 2500; // 占空比为50%
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 停止计数
// 配置ADC SOC触发源
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能ePWM1 SOC-A
EPwm1Regs.ETSEL.bit.SOCASEL = 2; // 选择计数器等于零时触发
// 配置ePWM模块的时钟源
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频为1
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 时钟分频为1
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; // 禁用同步输出
// 启动ePWM1计数
EPwm1Regs.TBCTL.bit.CTRMODE = 0x3; // 上升沿计数模式
}
```
请注意,这只是一个示例代码,具体的配置和功能可能需要根据您的应用进行调整。确保在使用该代码之前,您已经阅读并理解了TMS320F28035的参考手册和数据表。
阅读全文