STM8L内部含有一个12位的ADC,拥有25个输入通道,包括一个内部温度传感器,一个内部参考电压
由上图可知,STM8L内部还有一个内部参考电压,这个内部参考电压的电压值是可知的,且是精确的。由数据手册可知,内部参考电压为1.225V。
ADC选择内部参考电压作为测量通道,可以测量到内部电压的转化值Nadc。此时,已经VDD的转化值4096,VREFINT电压值1.225V及对应的转化值Nadc。这些值满足比例关系: VDD/4096=VREFINT/Nadc VDD/4096 =1.225/Nadc VDD=1.225*4096/Nadc STM8L15x系列单片机的相关库函数配置过程如下: This section provides functions allowing to enable/ disable the internal connections between the ADC and the Temperature Sensor and the Vrefint source. A typical configuration to get the Temperature sensor or/and Vrefint channels voltages is done following these steps : 1. Enable the internal connection of Temperature sensor or/and Vrefint sources with the ADC channels: - for the Temperature sensor usingADC_TempSensorCmd() function. - for the Internal Voltage reference usingADC_VrefintCmd() function. 2. Enable the ADC_Channel_TempSensor and/orADC_Channel_Vrefint channels usingADC_ChannelCmd()function. 3. Get the voltage values, usingADC_GetConversionValue().
(1)使能或失能内部参考电压ADC_VrefintCmd() * @brief Enables or disables the Internal Voltage reference. * @param NewState : new state of the Internal Voltage reference. * This parameter can be: ENABLE or DISABLE. * @retval None void ADC_VrefintCmd(FunctionalState NewState); 参数:ENABLE(使能)或DISABLE(失能) (2)选择内部参考电压通道ADC_ChannelCmd() * @brief Enables or disables the selected ADC channel(s). * @param ADCx where x can be 1 to select the specified ADC peripheral. * @param ADC_Channels: specifies the ADC channels to be initialized This parameter can be one of the following values: @arg ADC_Channel_0: Channel 0 @arg ADC_Channel_1: Channel 1 @arg ADC_Channel_2: Channel 2 @arg ADC_Channel_3: Channel 3 @arg ADC_Channel_4: Channel 4 @arg ADC_Channel_5: Channel 5 @arg ADC_Channel_6: Channel 6 @arg ADC_Channel_7: Channel 7 @arg ADC_Channel_8: Channel 8 @arg ADC_Channel_9: Channel 9 @arg ADC_Channel_10: Channel 10 @arg ADC_Channel_11: Channel 11 @arg ADC_Channel_12: Channel 12 @arg ADC_Channel_13: Channel 13 @arg ADC_Channel_14: Channel 14 @arg ADC_Channel_15: Channel 15 @arg ADC_Channel_16: Channel 16 @arg ADC_Channel_17: Channel 17 @arg ADC_Channel_18: Channel 18 @arg ADC_Channel_19: Channel 19 @arg ADC_Channel_20: Channel 20 @arg ADC_Channel_21: Channel 21 @arg ADC_Channel_22: Channel 22 @arg ADC_Channel_23: Channel 23 @arg ADC_Channel_24: Channel 24 @arg ADC_Channel_25: Channel 25 @arg ADC_Channel_26: Channel 26 @arg ADC_Channel_27: Channel 27 @arg ADC_Channel_Vrefint: Vrefint Channel @arg ADC_Channel_TempSensor: Temperature sensor Channel @arg ADC_Channel_00To07: select from channel00 to channel07 @arg ADC_Channel_08To15: select from channel08 to channel15 @arg ADC_Channel_16To23: select from channel16 to channel23 @arg ADC_Channel_24To27: select from channel24 to channel27 @param NewState : new state of the specified ADC channel(s). This parameter can be: ENABLE or DISABLE. void ADC_ChannelCmd(ADC_TypeDef* ADCx, ADC_Channel_TypeDef ADC_Channels, FunctionalState NewState); (3)获得转换数值ADC_GetConversionValue() u16 u16_adc1_value; u16_adc1_value = ADC1_GetConversionValue(); 程序: adc.h头文件: #ifndef _adc_H #define _adc_H #include "stm8l15x.h" void Adc_Init(void); #endif adc.c源文件: #include "adc.h" void Adc_Init(void) { CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);//开启ADC1时钟 ADC_VrefintCmd(ENABLE); //使能内部参考电压 ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_1);//连续转换,12位,转换时钟1分频 ADC_ChannelCmd(ADC1,ADC_Channel_Vrefint,ENABLE);//使能内部参考电压通道 ADC_Cmd(ADC1,ENABLE);//ADC使能 }
主函数: #include "stm8l15x.h" #include "adc.h" int main( void ) { u16 adc1_value=0; float value=0; Adc_Init(); while(1) { ADC_SoftwareStartConv(ADC1); //开启软件转换 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束 ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志 adc1_value=ADC_GetConversionValue(ADC1); //获取转换值 value=1.225*4096/adc1_value; //获得VDD电压,单位V if(value<2.8) { GPIO_ResetBits(GPIOD,GPIO_Pin_4); GPIO_ToggleBits(GPIOD,GPIO_Pin_5); } } } 对上述IAR工程进行编译,并下载到STM8L15x板子中,分别右击变量adc1_value和变量value选择“Add to watch”出现如下窗口(查看相关变量的值):
在程序中设置相关断点,以便查看变量值 运行程序可得:
故测得STM32L15x板子的VDD=3.32291388V
|