stm32l0c8xADC特性如下:
有多达16 个通道和3个内部通道(温度传感器、参考电压),PA0、PA4、PA5为高速通道,其他为标准通道。
有单次转换模式和扫描模式,扫描模式下对选定的通道自动进行扫描转换。
ADC频率独立于CPU频率外,即使CPU速度低,ADC也可以达到允许最大采样速率1.14 MSPS。
能耗很低频率(10kSPS,25μA;1MSPS,200μA)。
自动关闭功能保证ADC在有效转换阶段期间外能够关闭。
可由DMA控制器控制,工作电压可低至1.65v
模拟看门狗功能
等等。。。
以下是基于上述mcu的ADC单通道多次转换(非DMA)代码,代码已经通过调试,欢迎指正交流。
1、声明相关变量
float ADC_ConvertedValueLocal;
uint32_t ADC_ConvertedValue;
uint32_t DMA_Transfer_Complete_Count=0;
ADC_HandleTypeDef hadc;
IWDG_HandleTypeDef hiwdg;
2、ADC初始化,需要初始化ADC配置及ADC所用的GPIO通道
本文选用PA1引脚作为采样输入引脚:
/*
* Instance = ADC1.
* OversamplingMode = Disabled
* ClockPrescaler = PCLK clock with no division.
* LowPowerAutoPowerOff = Disabled (For this exemple continuous mode is enabled with software start)
* LowPowerFrequencyMode = Enabled (To be enabled only if ADC clock is lower than 2.8MHz)
* LowPowerAutoWait = Disabled (New conversion starts only when the previous conversion is completed)
* Resolution = 12 bit (increased to 16 bit with oversampler)
* SamplingTime = 7.5 cycles od ADC clock.
* ScanConvMode = Forward
* DataAlign = Right
* ContinuousConvMode = Enabled
* DiscontinuousConvMode = Enabled
* ExternalTrigConvEdge = None (Software start)
* EOCSelection = End Of Conversion event
* DMAContinuousRequests = ENABLE
*/
static void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc.Instance = ADC1;
hadc.Init.OversamplingMode = DISABLE;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DMAContinuousRequests = ENABLE;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_SEQ_CONV;
hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.LowPowerFrequencyMode = DISABLE;
hadc.Init.LowPowerAutoPowerOff = DISABLE;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
/**Configure for the selected ADC regular channel to be converted.
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
3、GPIOA与ADC初始化后,即可在main中调用函数获得转化后的值
void get_ADC_value()
{ int i;
float dat[6], ad_ch1;
/* ### Start conversion ################################# */
HAL_ADC_Start_IT(&hadc);
for(i=0;i<4;i++)
{
dat[i] =(float)ADC_ConvertedValue*3.3/4096;
}
ad_ch1=(dat[0]+dat[1]+dat[2]+dat[3])/4 ;
ADC_ConvertedValueLocal=ad_ch1;
}
/** * AD转换结束回调函数 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_ConvertedValue=HAL_ADC_GetValue(hadc);
}