STM8L系列单片机集成了AD功能,有一个ADC模块,但是有最多可达28个AD通道,可以配置为单次采样或者连续采样。
ADC的精度最多可配置为12位精度,另外可以选择6位、8位、10位的精度。
下面举例初始化一个ADC的配置函数:
void ADC21Conver_Init()
{
ADC_ChannelCmd(ADC1,
ADC_Channel_0, //关闭其他的采样通道
DISABLE);
ADC_Cmd(ADC1 , DISABLE); //关闭ADC
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1 , ENABLE); //使能ADC1时钟
GPIO_Init(GPIOD , GPIO_Pin_1 , GPIO_Mode_In_FL_No_IT); //配置AD引脚
ADC_Init(ADC1,
ADC_ConversionMode_Single, //单次转换模式
ADC_Resolution_12Bit, //12位精度转换精度
ADC_Prescaler_1 //时钟设置为1分频
);
ADC_ChannelCmd(ADC1,
ADC_Channel_21, //设置为通道21进行采样
ENABLE);
ADC_Cmd(ADC1 , ENABLE); //使能ADC
}
因为只有一个ADC,所以在配置之前需要先之前使用的其他的AD通道,这里如果不关闭之前使用的AD通道的话,无法打开新的AD采集通道。
ADC可以选择时钟为1分频或者2分频,可以选择采样精度和采样方式。
下面列举一个读取ADC采样结果的函数:
void ADC_Data_Read(unsigned int *AD_Value)
{
ADC_SoftwareStartConv(ADC1); //启动ADC
while(ADC_GetFlagStatus(ADC1 , ADC_FLAG_EOC) == 0); //等待转换结束
ADC_ClearFlag(ADC1 , ADC_FLAG_EOC); //清除中断标志
*AD_Value = ADC_GetConversionValue(ADC1); //读取ADC1,通道1的转换结果
}
使用上面两个函数即可实现ADC采样功能,但是有个地方很奇怪,每次采集ADC值的时候第一次采集到的数据都是不准确的,所以第一次采集到的值是不能使用的。
另外STM8L内部还提供了1.2V的参考电压,但是在使用这个参考电压的时候有一些不稳定的现象。
比如在采集这个参考电压时,如果在读取函数前面加延时,延时的时间不一样得到的采样结果是不一样的,另外,这个参考我根据外面提供的VCC作为参考电压来计算的话,得到的值也不是1.2V,这个地方不知道是我的配置出了问题还是这个参考电压本身有问题。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』