这篇主要记录一下STM32的ADC采样功能,利用单片机的PA6引脚分别对3.3V和GND的电压进行采集,并将其电压通过串口打印出来。
STM32F103C8 ADC单通道采样
一、ADC采样原理
- 单片机是数字芯片,只认识由0和1组成的逻辑序列,但是我们现实当中有很多模拟的物理量,如温度,这些模拟量该如何被单片机系统处理呢?这就会用到AD转换,AD转换的英文就是Analog to Digital ,由模拟量转化为数字量;而DA,则为Digital to Analog,数字量转化为模拟量。那单片机是如何实现转化的呢?
- AD转换芯片上的数据手册上都会告诉你一个信息,这个芯片是8位的、10位的,还是12位的、16位的。这就代表着单片机AD采样后所能得到的最大值。如果AD采样是8位的那对应的值就为0-255,10位对应的值为0-1023,12位对应的值就为0-4095。对于一个12位AD转换芯片而言,如果输入电压为0,那单片机读到的就是0,如果输入电压是VCC,那单片机读到的就是4095,已经知道了这两个点(0,0),(VCC,4095),根据两点就可以确定一个公式,这时候就可以求出任意电压值所对应的数字量是多少了。
二、STM32CubeMx配置
1、RCC开启外部高速时钟(略)
2、配置STLink调试口(略)
3、配置串口方便调试输出(略)
4、配置工程名、生成路径,之后生成工程(略)
(1-4步的基础配置可以参考前面的文章《STM32基础工程模板创建》)
5、ADC配置
- 我这里用的ADC的通道6,对应芯片的PA6脚
- 配置ADC参数
三、keil代码编写
3、添加ADC采样代码
int main(void)
{
uint16_t ADC_Value = 0; //用于接收采集ADC采样值
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
HAL_ADCEx_Calibration_Start(&hadc1); //添加AD校准函数
HAL_ADC_Start(&hadc1); //启动ADC转换
while (1)
{
ADC_Value = HAL_ADC_GetValue(&hadc1); //获取AD值
printf("ADC1 Reading:%d True Voltage value:%.4f \r\n", ADC_Value, ADC_Value*3.3f/4096);
HAL_Delay(500);
}
}
四、硬件连接
STM32 STM32
PA6 《-----------------------》3.3V
PA6 《----------------------》GND
五、运行效果
- 将PA6引脚分别和开发板的3.3V、GND接在一起,观察电压变化。