STM32F0xx的AD转换程序。
该例程使用的是PB01引脚,AD功能为ADC_IN9,查数据手册,如下图所示。
首先初始化引脚:
void adc_init( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init( GPIOB, &GPIO_InitStructure );
ADC_Configuration();
}
然后,初始化ADC的功能:
void ADC_Configuration( void )
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit( ADC1 );
ADC_StructInit( &ADC_InitStructure );
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
ADC_Init( ADC1, &ADC_InitStructure );
ADC_ChannelConfig( ADC1, ADC_Channel_9, ADC_SampleTime_239_5Cycles );
ADC_GetCalibrationFactor( ADC1 );
ADC_Cmd( ADC1, ENABLE );
while ( !ADC_GetFlagStatus( ADC1, ADC_FLAG_ADRDY ) );
ADC_StartOfConversion( ADC1 );
}
ADC_ChannelConfig( ADC1, ADC_Channel_9, ADC_SampleTime_239_5Cycles );
其中ADC的通道配置函数,配置为ADC1,通道9,采样周期为ADC_SampleTime_239_5Cycles。
接下来直接使用获取AD值的函数,ADC_GetConversionValue( ADC1 ); 该函数位于#include "stm32f0xx_adc.h"的文件中。
下述函数为获取8次ADC的值,求和后求平均,然后转换为电压值(单位:V)avg*3300/4096 。
uint32_t ADC_Check( void )
{
uint32_t ResultVolt = 0;
uint8_t i;
for ( i = 0; i < 8; i++ )
{
while ( ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) == RESET );
ResultVolt += (uint32_t)ADC_GetConversionValue( ADC1 );
}
// 求平均
ResultVolt = ResultVolt >> 3;
// 求得1000倍电压值
//ResultVolt = (ResultVolt*3300) >> 12;
return ResultVolt;
}