前言
本文以STM32F1系列为例,通过一个小实验简单介绍ADC单通道采集
实验目标:
使用ADC1采集通道1的电压值,通道1连接光敏电阻1
文章目录
- 前言
- 一、实验视频
- 二、实验概述
- 三、详细步骤
-
- [1. ADC初始化函数的编写](#1. ADC初始化函数的编写)
- 2.adc对应MSP函数的编写
- 3.配置ADC采样通道
- 4.封装一个获取ADC值的函数
一、实验视频
ADC单通道采集实验
二、实验概述
(1)流程框图

(2)硬件接线
光敏电阻的A0接STM32的PA1、vcc接3.3v,GND接STM32的GND
三、详细步骤
1. ADC初始化函数的编写
c
void adc_init(void)
{
adc_handle.Instance=ADC1;
adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;
adc_handle.Init.ContinuousConvMode = DISABLE;
adc_handle.Init.DiscontinuousConvMode = DISABLE;
adc_handle.Init.NbrOfConversion = 1;
adc_handle.Init.NbrOfDiscConversion = 0;
adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
HAL_ADC_Init(&adc_handle);
HAL_ADCEx_Calibration_Start(&adc_handle);
}
2.adc对应MSP函数的编写
c
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
//句柄
RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
//使能时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_ADC1_CLK_ENABLE();
gpio_handle.Mode = GPIO_MODE_ANALOG;
gpio_handle.Pin = GPIO_PIN_1;
HAL_GPIO_Init(GPIOA,&gpio_handle);
//配置ADC具体的工作时钟
adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; //72Mhz进行6分频之后,12Mhz是stm32ADC常用时钟频率
HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
}
3.配置ADC采样通道
c
//通道设置函数
void adc_channel(uint32_t channel,uint32_t rank ,uint32_t stime)
{
ADC_ChannelConfTypeDef adc_channel_handle;
adc_channel_handle.Channel = channel; // ADC_CHANNEL_1
adc_channel_handle.Rank = rank; // ADC_REGULAR_RANK_1
adc_channel_handle.SamplingTime = stime; //
HAL_ADC_ConfigChannel(&adc_handle,&adc_channel_handle);
}
4.封装一个获取ADC值的函数
c
//获取ADC转化值
uint16_t adc_value(void)
{
//调用通道配置函数
adc_channel(ADC_CHANNEL_1,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_239CYCLES_5);
//启动ADC转换器
HAL_ADC_Start(&adc_handle);
//使用阻塞的方式等待规则组转换完成
HAL_ADC_PollForConversion(&adc_handle,10);
//返回转化后的结果
return (uint16_t)HAL_ADC_GetValue(&adc_handle);
}