最近新做了一块LM3S8962的板子 测试AD部分的时候各通道之间会相互影响,比如说三个通道都上拉到3.3V后,将其中一个通道接地,发现其它通道的转换结果也会变小,代码的主要部分如下:(完整的MDK工程见附件,欢迎下载测试并给出意见,烧进片子后打开串口调试助手即可观察结果)
// ADC初始化 void adcInit(void) { SysCtlPeriEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块 SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC采样速率 ADCSequDisable(ADC_BASE, 0); // 配置前先禁止采样序列
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级 ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
// ADC采样序列步进配置:ADC基址,采样序列0,步值,采样通道 ADCSequStepConfig(ADC_BASE, 0, 0, ADC_CTL_CH0); // 第0步:采样ADC0 ADCSequStepConfig(ADC_BASE, 0, 1, ADC_CTL_CH1); // 第1步:采样ADC1 ADCSequStepConfig(ADC_BASE, 0, 2, ADC_CTL_CH2); // 第2步:采样ADC2 //ADCSequStepConfig(ADC_BASE, 0, 3, ADC_CTL_CH0); // 第3步:再次采样ADC0
ADCSequStepConfig(ADC_BASE, 0, 3, ADC_CTL_CH3 | // 第4步:采样ADC3后 ADC_CTL_END | // 结束,并 ADC_CTL_IE); // 申请中断
ADCIntEnable(ADC_BASE, 0); // 使能ADC中断 IntEnable(INT_ADC0); // 使能ADC采样序列中断 IntMasterEnable(); // 使能处理器中断
ADCSequEnable(ADC_BASE, 0); // 使能采样序列 }
// ADC采样:ulVal[]保存采样结果 void adcSample(unsigned long ulVal[]) { ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列 while (!ADC_EndFlag); // 等待采样结束 ADC_EndFlag = false; // 清除ADC采样结束标志 ADCSequDataGet(ADC_BASE, 0, ulVal); // 自动读取全部ADC结果 }
int main(void) { unsigned long ulVal[5]; char cBuf[30]; unsigned long i, v;
//jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:PLL,20MHz uartInit(); // UART初始化 adcInit(); // ADC初始化
for (;;) { adcSample(ulVal); // ADC采样
for (i = 0; i < 4; i++) { v = (ulVal * 3000) / 1024; // 转换成电压值 sprintf(cBuf, "ch%d = %d(mV) ", i, v); // 采样值格式化为电压值 uartPuts(cBuf); // 通过UART输出电压值 }
uartPuts("\r\n"); SysCtlDelay(1500 * (TheSysClock / 3000)); // 延时约1500ms } }
// ADC采样序列0的中断 void ADC_Sequence_0_ISR(void) { unsigned long ulStatus;
ulStatus = ADCIntStatus(ADC_BASE, 0, true); // 读取中断状态 ADCIntClear(ADC_BASE, 0); // 清除中断状态,重要
if (ulStatus != 0) // 如果中断状态有效 { ADC_EndFlag = true; // 置位ADC采样结束标志 } }
|