由于项目需要监测一些模拟量所以要用到ADC,这两天试了试LM3S8962的ADC功能,有一些收获,不敢独享和拿出来和大家分享。
ADC用于将连续变化的模拟电压转换成离散的数字量。LM3S8962集成有一个 10 位的 ADC 模块,支持 8 个输入通道,以及一个内部温度传感器。ADC 模块含有一个可编程的序列发生器,可在无需控制器干涉的情况下对多个模拟输入源进行采样。每个采样序列均对完全可配置的输入源、触发事件、中断的产生和序列优先级提供灵活的编程。
Stellaris系列的ADC 模块提供系列特性:
8 个模拟输入通道
单端和差分输入配置;
内部温度传感器;
高达 1Msps(每秒采样一百万次)的采样率;
4个可编程的采样转换序列, 入口长度1到8, 每个序列均带有相应的转换结果FIFO;
灵活的触发控制:处理器(软件) 、定时器、模拟比较器、PWM、GPIO;
硬件可对多达 64 个采样值进行平均计算(牺牲速度换取精度);
转换器采用内部的 3V参考电压;
分开的模拟电源和模拟地,跟数字电源和数字地分离。
直接上示例程序:
//ADC初始化
void ADC_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); //使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //设置ADC采样速率
ADCSequenceDisable(ADC_BASE, 3); //配置前先禁止采样序列
//采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequenceConfigure(ADC_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
//采样步进设置:ADC基址,采样序列编号,步值,温度传感器|中断使能
ADCSequenceStepConfigure(ADC_BASE, 3, 0, ADC_CTL_TS|ADC_CTL_END|ADC_CTL_IE);
//使能采样序列
ADCSequenceEnable(ADC_BASE, 3);
}
//ADC查询采样
unsigned long ADC_Sample(void)
{
unsigned long ulValue;
ADCProcessorTrigger(ADC_BASE, 3); //处理器触发采样序列
while(!ADCIntStatus(ADC_BASE, 3, false)); //等待采样结束
ADCSequenceDataGet(ADC_BASE, 3, &ulValue); //读取ADC转换结果
return(ulValue);
}
//温度发送到串口
void SendCelsius(unsigned long ulValue)
{
unsigned long ulTmp;
ulTmp = 151040UL - 225*ulValue;
printf("Temperature=%d.%d\n", ulTmp/1024, (ulTmp % 1024) / 102);
}
int main(void)
{
unsigned long ulValue;
SysCtlClockSet(SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ|SYSCTL_SYSDIV_4); //50MHz
ADC_Init();
//while
while(1)
{
ulValue=ADC_Sample();
SendCelsius(ulValue);
Delay_nMS(1000);
}
}