TMS320F28335软件触发ADC
时间: 2024-08-17 16:00:47 浏览: 209
TMS320F28335是一款由TI公司(德州仪器)生产的C2000系列数字信号处理器(DSP),其中的模拟到数字转换器(ADC)支持软件触发模式。在软件触发ADC时,处理器控制着ADC何时进行采样,而不是像硬件触发那样由外部或内部定时器自动触发。
具体操作流程如下:
1. **初始化设置**:首先,你需要配置ADC模块,包括选择合适的通道、设定转换率、设置中断使能等,以便在需要时能够被CPU唤醒进行采样。
2. **软件调用**:当应用程序需要获取某通道的模拟数据时,会发送一条命令给ADC控制器,请求执行一次转换。这通常通过写入特定的寄存器来触发,例如启动/停止转换命令。
3. **数据处理**:ADC开始采样后,采集的数据会被暂存在内部缓冲区中。此时,处理器可以继续执行其他任务,直到中断发生或达到预设的等待时间。
4. **中断响应**:一旦ADC完成转换,会产生一个中断通知CPU。CPU会在中断服务程序(ISP)中读取并处理这次转换的结果。
5. **数据读取**:从ADC的输出寄存器或缓冲区中取出转换后的数字值,并可能进行后续处理,如滤波、A/D转换结果的存储或传输。
相关问题:
1. TMS320F28335 ADC有多少个通道可以选择?
2. 如何在软件中设置ADC的分辨率和转换速率?
3. ADC中断是如何关联到CPU的?
相关问题
写一个TMS320F28035 定时器触发ADC采样的完整代码
下面是一个示例代码,演示如何在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的参考手册和数据表。
1. 写出相关 C 语言指令,完成以下任务: (1)将 TMS320F28335 的引脚 GPIO0 设置为普通输出引脚、使能上拉电阻,并 将该引脚输出电平设置为高电平; (2)将 TMS320F28335 的引脚 GPIO1 设置为 ePWM1 模块的 EPWMB 信号输出 引脚。 2. 将 TMS320F28335 的 SCIA 串口的波涛率设置为 115200 波特。假设低速外设 时钟 LSPCLK 的频率是 37.5MHz。请写出相关数据的计算过程及 C 语言指令。 3. 利用 TMS320F28335 的 ADC 模块采集 8 个通道的模拟量输入信号,假设采集 顺序为:A7、A4、A6、A5、A2、B2、B0、A3。要求:采用级联、顺序采样方 式。请写出相关 C 语言指令,按上要求完成 ADC 模块配置。
1.
(1)将 TMS320F28335 的引脚 GPIO0 设置为普通输出引脚、使能上拉电阻,并将该引脚输出电平设置为高电平:
```
//配置GPIO0为普通输出引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; //设置为输出引脚
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; //使能上拉电阻
//将GPIO0输出电平设置为高电平
GpioDataRegs.GPASET.bit.GPIO0 = 1;
```
(2)将 TMS320F28335 的引脚 GPIO1 设置为 ePWM1 模块的 EPWMB 信号输出引脚:
```
//配置GPIO1为ePWM1模块的EPWMB信号输出引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //设置为复用功能
GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; //选择复用功能为EPWMB
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; //禁用上拉电阻
```
2. 将 TMS320F28335 的 SCIA 串口的波涛率设置为 115200 波特。假设低速外设时钟 LSPCLK 的频率是 37.5MHz。请写出相关数据的计算过程及 C 语言指令。
计算过程:
LSPCLK = 37.5MHz
波特率 = 115200
BRR = LSPCLK / (波特率 * 8) - 1 = 40
C语言指令:
```
//使能SCI-A引脚复用功能
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
//配置SCI-A
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCICTL1.all = 0x0003;
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA = 1;
SciaRegs.SCIHBAUD = 0;
SciaRegs.SCILBAUD = 40;
SciaRegs.SCICTL1.all = 0x0023;
```
3. 利用 TMS320F28335 的 ADC 模块采集 8 个通道的模拟量输入信号,假设采集顺序为:A7、A4、A6、A5、A2、B2、B0、A3。要求:采用级联、顺序采样方式。请写出相关 C 语言指令,按上要求完成 ADC 模块配置。
```
//配置ADC模块
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //选择内部参考电压
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; //使能内部参考电压缓冲区
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; //使能ADC模块电源
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; //使能ADC模块
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; //使能内部参考电压缓冲区电源
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //选择内部参考电压
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //设置中断触发时间
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; //使能非重叠采样
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1; //使能ADC时钟除以2
AdcRegs.ADCCTL2.bit.ADCRES = 3; //设置采样分辨率为12位
AdcRegs.ADCSOC0CTL.bit.CHSEL = 7; //选择A7通道
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4; //选择A4通道
AdcRegs.ADCSOC2CTL.bit.CHSEL = 6; //选择A6通道
AdcRegs.ADCSOC3CTL.bit.CHSEL = 5; //选择A5通道
AdcRegs.ADCSOC4CTL.bit.CHSEL = 2; //选择A2通道
AdcRegs.ADCSOC5CTL.bit.CHSEL = 10; //选择B2通道
AdcRegs.ADCSOC6CTL.bit.CHSEL = 8; //选择B0通道
AdcRegs.ADCSOC7CTL.bit.CHSEL = 3; //选择A3通道
AdcRegs.ADCSOC0CTL.bit.ACQPS = 63; //设置采样时间
AdcRegs.ADCSOC1CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC3CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC4CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC5CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC6CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC7CTL.bit.ACQPS = 63;
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 7; //设置ADCINT1的触发源为SOC7
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; //使能ADCINT1中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除ADCINT1标志位
AdcRegs.ADCINTSEL1N2.bit.INT2SEL = 0; //设置ADCINT2的触发源为SOCA
AdcRegs.ADCINTSEL1N2.bit.INT2E = 1; //使能ADCINT2中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //清除ADCINT2标志位
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 2; //设置ADCINT1触发SOC0
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 2; //设置ADCINT1触发SOC1
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 2; //设置ADCINT1触发SOC2
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 2; //设置ADCINT1触发SOC3
AdcRegs.ADCINTSOCSEL2.bit.SOC4 = 2; //设置ADCINT1触发SOC4
AdcRegs.ADCINTSOCSEL2.bit.SOC5 = 2; //设置ADCINT1触发SOC5
AdcRegs.ADCINTSOCSEL2.bit.SOC6 = 2; //设置ADCINT1触发SOC6
AdcRegs.ADCINTSOCSEL2.bit.SOC7 = 2; //设置ADCINT1触发SOC7
AdcRegs.ADCSOCFIFOCTL.bit.SOCCOUNT = 8; //设置FIFO中SOC数量为8
AdcRegs.ADCSOCFIFOCTL.bit.CHAINDELAY = 1; //设置级联采样延迟为1个CLK周期
AdcRegs.ADCSOCFIFOCTL.bit.TRIGSEL = 0; //设置FIFO触发源为SOCA
AdcRegs.ADCINTSOCSEL1.bit.SOC8 = 1; //设置ADCINT2触发SOC8
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //设置ADCINT1触发时间
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; //使能内部参考电压缓冲区电源
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; //使能ADC模块电源
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; //使能ADC模块
```
阅读全文