上面的例子用的是扫描方式,中断方式也很简单,只要把ADC配置函数改一下,再加上ADC中断服务函数就行了。
//ADC初始化 void ADC_Init(void) { SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); //使能ADC模块 SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //设置ADC采样速率
//采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级 ADCSequenceConfigure(ADC_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
//采样步进设置:ADC基址,采样序列编号,步值,温度传感器|中断使能 ADCSequenceStepConfigure(ADC_BASE, 3, 0, ADC_CTL_TS|ADC_CTL_END|ADC_CTL_IE);
//硬件过采样配置 ADCHardwareOversampleConfigure(ADC_BASE, 16);
ADCIntEnable(ADC_BASE, 3); //使能ADC中断 IntEnable(INT_ADC3); //使能ADC采样序列中断 IntMasterEnable(); //使能处理器中断
ADCSequenceEnable(ADC_BASE, 3); //使能采样序列 }
//ADC采样 unsigned long ADC_Sample(void) { unsigned long ulValue; ADCProcessorTrigger(ADC_BASE, 3); //处理器触发采样序列 while (!ADC_EndFlag); //等待采样结束 ADC_EndFlag = false; //清除ADC采样结束标志 ADCSequenceDataGet(ADC_BASE, 3, &ulValue); //读取ADC转换结果 return(ulValue); }
//ADC采样序列3的中断 void ADC_Sequence_3_ISR(void) { unsigned long ulStatus; ulStatus = ADCIntStatus(ADC_BASE, 3, true); // 读取中断状态 ADCIntClear(ADC_BASE, 3); // 清除中断状态 if (ulStatus != 0) // 如果中断状态有效 { ADC_EndFlag = true; // 置位ADC采样结束标志 } }
为了消除ADC ±1 个 LSB误差造成的影响,可以使用硬件平均或软件平均的处理方法,固件库对应的函数分别是
void ADCHardwareOversampleConfigure(unsigned long ulBase, unsigned long ulFactor)
ulBase:ADC模块的基址,取值ADC_BASE ulFactor:采样平均数,取值2、4、8、16、32、64,如果取值0则禁止硬件过采样
和
void ADCSoftwareOversampleConfigure(unsigned long ulBase, unsigned long ulSequenceNum, unsigned long ulFact)
ulBase:ADC模块的基址,取值ADC_BASE ulSequenceNum:ADC采样序列的编号,取值0、1、2(采样序列3不支持软件过采样) ulFactor:采样平均数,取值2、4、8
从串口收到的数据来看,改为硬件平均后,采样值稳定了很多。
[ 本帖最后由 liongt 于 2010-11-17 21:20 编辑 ] |