dsp28335 adc中断方式采样代码
时间: 2023-07-09 07:45:37 浏览: 464
以下是基于DSP28335的ADC中断方式采样代码:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define ADC_SOC_NUMBER 8 // ADC采样通道数
#define ADC_SAMPLE_TIMES 10 // 每个通道采样次数
Uint16 ADC_Convert_Result[ADC_SOC_NUMBER * ADC_SAMPLE_TIMES] = {0}; // 保存采样结果数组
void InitAdc(void)
{
EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 开启内部参考电压
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 内部参考电压选择 AVREF+ 和 AVSS
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // 开启 ADC 电源
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // 开启 ADC
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 0; // 不开启 ADC 时钟分频
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0; // 不开启 ADC 转换重叠模式
AdcRegs.ADCCTL2.bit.INTPULSEPOS = 0; // ADC 中断触发位于 ADCSOC0 的末尾
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // ADC 中断触发源为 ADCSOC0
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; // 开启 ADC 中断
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; // ADC 中断非循环模式
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0; // ADCSOC0 触发源为软件触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // ADCSOC0 选择 ADCINA0 通道
AdcRegs.ADCSOC0CTL.bit.ACQPS = 14; // ADCSOC0 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0; // ADCSOC1 触发源为软件触发
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; // ADCSOC1 选择 ADCINA1 通道
AdcRegs.ADCSOC1CTL.bit.ACQPS = 14; // ADCSOC1 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0; // ADCSOC2 触发源为软件触发
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2; // ADCSOC2 选择 ADCINA2 通道
AdcRegs.ADCSOC2CTL.bit.ACQPS = 14; // ADCSOC2 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 0; // ADCSOC3 触发源为软件触发
AdcRegs.ADCSOC3CTL.bit.CHSEL = 3; // ADCSOC3 选择 ADCINA3 通道
AdcRegs.ADCSOC3CTL.bit.ACQPS = 14; // ADCSOC3 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0; // ADCSOC4 触发源为软件触发
AdcRegs.ADCSOC4CTL.bit.CHSEL = 4; // ADCSOC4 选择 ADCINA4 通道
AdcRegs.ADCSOC4CTL.bit.ACQPS = 14; // ADCSOC4 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0; // ADCSOC5 触发源为软件触发
AdcRegs.ADCSOC5CTL.bit.CHSEL = 5; // ADCSOC5 选择 ADCINA5 通道
AdcRegs.ADCSOC5CTL.bit.ACQPS = 14; // ADCSOC5 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0; // ADCSOC6 触发源为软件触发
AdcRegs.ADCSOC6CTL.bit.CHSEL = 6; // ADCSOC6 选择 ADCINA6 通道
AdcRegs.ADCSOC6CTL.bit.ACQPS = 14; // ADCSOC6 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = 0; // ADCSOC7 触发源为软件触发
AdcRegs.ADCSOC7CTL.bit.CHSEL = 7; // ADCSOC7 选择 ADCINA7 通道
AdcRegs.ADCSOC7CTL.bit.ACQPS = 14; // ADCSOC7 采样窗口为 15 个 ADC 时钟
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除 ADC 中断标志位
EDIS;
}
void AdcSample(void)
{
int i, j;
for (i = 0; i < ADC_SOC_NUMBER; i++)
{
for (j = 0; j < ADC_SAMPLE_TIMES; j++)
{
AdcRegs.ADCSOCFRC1.all = 1 << i; // 触发 ADCSOC
while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0) { } // 等待 ADC 转换完成
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除 ADC 中断标志位
ADC_Convert_Result[i * ADC_SAMPLE_TIMES + j] = AdcResult.ADCRESULT0; // 保存采样结果
}
}
}
__interrupt void AdcIsr(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断
}
int main(void)
{
InitSysCtrl();
InitPieCtrl();
InitPieVectTable();
InitAdc();
IER |= M_INT1; // 开启 ADC 中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // 启用 ADC 中断
EINT; // 开启全局中断
while (1)
{
AdcSample(); // ADC 采样
}
}
```
在该代码中,首先通过 `InitAdc()` 函数对 ADC 进行初始化配置,包括参考电压、ADC 电源、ADC 中断、ADC 采样通道、采样窗口等。在 `AdcSample()` 函数中,通过循环采样每个通道多次,将采样结果保存在 `ADC_Convert_Result` 数组中。在 `AdcIsr()` 中断服务函数中,清除中断标志,以便下次采样。最后,在 `main()` 函数中,启用 ADC 中断,并在死循环中不断采样。
阅读全文