STM32 ADC 读取模拟量
问题
我有一个调速开关,模拟量输入,因此需要使用 STM32 读取模拟量,并通过串口输入来调试。串口相关知识参考 STM32 串口输出调试信息。
硬件信息:
- CubeMX version 6.12.1
- Keil uVision V5.41.0.0
参考知识
- 【STM32】HAL库 STM32CubeMX教程九—ADC[通俗易懂]
- STM32CubeIDE的ADC经验分享
- STM32CubeMX学习笔记(4)–ADC模数转换器应用
- STM32CubeMX学习笔记(8)——ADC接口使用
参考上面链接,弄懂下面列出的问题。
基础知识
- 什么是 ADC
- STM32 ADC 介绍
- ADC 单通道 与 多通道,单路 ADC 与多路 ADC。
- ADC 数据的最对齐和右对齐
- ADC 注入通道 与 规则通道
- ADC 时钟, = APB2 / Prescale, 最高 14MHz, ADC 的 parameter setting 中设置 Prescale。
- 多个通道,读取顺序是什么,rank 设置
数据读取
- 软件触发,使用函数直接读取
- 开启 ADC 中断回调函数,在其中使用函数读取数据。相当于把上一步代码搬到中断函数中。
- 轮询或者扫描模式
- 使用 Timer 触发定时读取 ADC,参考链接。
注意
There is no hardware ADC calibration for our STM32F4, it is self-calibrated upon reset and once ADC is activated. 来源于:There are no instructions for calibrating ADC in STM32F407。
示例程序
一个模拟量输入
参考:STM32CUBEMX的adc读取 stm32 adc hal。
CubeMX 配置
程序
- 串口中使用了部分字符串处理函数, 在 main.c 添加
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include <string.h>
/* USER CODE END Includes */
- main.c 中定义变量存储 ADC 转换结果。int main 函数中间定义,
/* USER CODE BEGIN Init */
uint16_t adc_value;
/* USER CODE END Init */
- while 循环中读取 模拟量引脚。前三行是读取数据,后面是处理数据,输出到串口。
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
adc_value = HAL_ADC_GetValue(&hadc1);
char str1[5];
sprintf(str1, "%d", adc_value);
HAL_UART_Transmit(&huart1,str1,sizeof(str1),10);// Sending in normal mode
HAL_Delay(3000);
}
/* USER CODE END 3 */
多个模拟量输入
参考:STM32CUBEMX的adc读取 stm32 adc hal。
CubeMX
编程
- 串口中使用了部分字符串处理函数, 在 main.c 添加
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include <string.h>
/* USER CODE END Includes */
- main.c 中定义变量存储 ADC 转换结果。int main 函数中间定义 数组 按顺序存储 ADC 引脚数据。
/* USER CODE BEGIN PV */
uint16_t adc_value[2];
/* USER CODE END PV */
- while 循环中读取 模拟量引脚。前三行是读取数据,后面是处理数据,输出到串口。
/* USER CODE BEGIN 3 */
for(int i=0; i<2; i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 1);
adc_value[i] = HAL_ADC_GetValue(&hadc1);
}
char tmp[5];
sprintf(tmp, "%d", adc_value[0]);
char str1[50] = "Knob: ";
strcat(str1, tmp);
char str2[50] = "---Driving wheel: ";
sprintf(tmp, "%d", adc_value[1]);
strcat(str2, tmp);
strcat(str1, str2);
HAL_UART_Transmit(&huart1,str1,sizeof(str1),10);// Sending in normal mode
HAL_Delay(1000);
}
/* USER CODE END 3 */