dsp28335芯片 adc采样代码
时间: 2023-07-09 12:45:39 浏览: 500
DSP28335源代码
以下是基于DSP28335芯片的ADC采样的代码示例:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define ADC_usDELAY 5000L
void InitAdc(void);
void AdcOffsetSelfCal(void);
void AdcConversion(void);
void main(void)
{
InitSysCtrl();
InitAdc();
AdcOffsetSelfCal();
while(1)
{
AdcConversion();
}
}
void InitAdc(void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC时钟使能
AdcRegs.ADCTRL1.bit.RESET = 1; // ADC模块复位
AdcRegs.ADCTRL1.bit.SUSMOD = 3; // ADC暂停模式
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0; // ADC时钟预分频
AdcRegs.ADCTRL3.bit.ADCEXTSOC = 0; // 内部触发
AdcRegs.ADCMAXCONV.all = 0; // 最大转换数
AdcRegs.ADCCTRL2.bit.ADCNONOVERLAP = 1; // 使能非重叠模式
AdcRegs.ADCCTRL2.bit.INTPULSEPOS = 1; // 中断脉冲位置
AdcRegs.ADCTRL1.bit.ACQPS = 14; // 采样保持时间
EDIS;
}
void AdcOffsetSelfCal(void)
{
EALLOW;
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 内部参考电压为AVREF+
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 开启参考电压缓冲区
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // 电源使能
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // ADC使能
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // 选择ADCINA0信号源
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0xF; // 选择软件触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样保持时间
AdcRegs.ADCSOC0CTL.bit.SEQCTRL = 1; // 自校正序列
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // EOC0中断
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; // 使能EOC0中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除EOC0标志位
AdcRegs.ADCSOCFRC1.all = 0x0001; // 启动SOC0
while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0); // 等待EOC0中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除EOC0标志位
AdcRegs.ADCOFFTRIM.all = AdcRegs.ADCOFFTRIM.all; // 写入校准值
EDIS;
}
void AdcConversion(void)
{
EALLOW;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // 选择ADCINA0信号源
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0xF; // 选择软件触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样保持时间
AdcRegs.ADCSOC0CTL.bit.SEQCTRL = 0; // 普通序列
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // EOC0中断
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; // 使能EOC0中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除EOC0标志位
AdcRegs.ADCSOCFRC1.all = 0x0001; // 启动SOC0
while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0); // 等待EOC0中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除EOC0标志位
Uint16 adc_result = AdcRegs.ADCRESULT0; // 读取ADC结果
EDIS;
}
```
这段代码中,`InitAdc()`函数初始化ADC模块的各项参数;`AdcOffsetSelfCal()`函数进行ADC的自校准;`AdcConversion()`函数进行ADC的转换并读取结果。需要注意的是,ADC的转换需要一定的时间,因此需要等待转换完成后再读取结果。
阅读全文