| STM32L0开发系列——01 ADC采集 前言
 使用芯片:STM32L051C8T6
 软件平台:KEIL V5、STM32CubeL0
 库函数:HAL
 
 一、原理图
 本文介绍在STM32上使用ADC1的第1通道,对电池电量进行采集。
 
 
 
 二、ADC通道与引脚对应关系
 
 
 
 
 三、ADC相关
 1、 ADC 可由 APB 时钟或 HSI16 时钟提供。
 2、 ADC 转换时间: 12 位分辨率对应的转换时间为 0.87 µs (1.14 MHz), 10 位分辨率
 对应的转换时间为 0.81 µs,若降低分辨率,可进一步缩短转换时间。
 
 四、实验步骤
 1、系统时钟配置
 
 
 复制代码//******************************************************************************            
//name:             SystemClock_Config           
//introduce:               系统时钟配置        
//parameter:        none  
//return:           none         
//changetime:       2019.05.21                      
//******************************************************************************
void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;
  RCC_OscInitTypeDef RCC_OscInitStruct;
  __PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
        RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON; //ADC的时钟源
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
  __SYSCFG_CLK_ENABLE();
}
注意:一开始程序中没有配置HSI时钟,采集不到电压
 
 2、ADC文件
 
 
 3、main中测试
 
 复制代码while(1)
{
        BATTER_VALUE = GET_ADC(ADC_CHANNEL_1);
        temp=(float)BATTER_VALUE*(3.3/4096)*2;        
        printf("temp=%0.2f\r\n",temp);
                        
        HAL_Delay(100);
}
 四、实验结果
 
 由于ADC的精度是12bit(4096)、参考电压为3.3V,因此实际读出的电量值为BATTER_VALUE3.3/40962.
 试验成功
 
 
 
 
 |