STM32 ADC 读取模拟量

问题

我有一个调速开关,模拟量输入,因此需要使用 STM32 读取模拟量,并通过串口输入来调试。串口相关知识参考 STM32 串口输出调试信息

硬件信息:

  • CubeMX version 6.12.1
  • Keil uVision V5.41.0.0

参考知识

参考上面链接,弄懂下面列出的问题。

基础知识

  1. 什么是 ADC
  2. STM32 ADC 介绍
  3. ADC 单通道 与 多通道,单路 ADC 与多路 ADC。
  4. ADC 数据的最对齐和右对齐
  5. ADC 注入通道 与 规则通道
  6. ADC 时钟, = PCLK2 / Prescale, 最高 14MHz, ADC 的 parameter setting 中设置 Prescale。
  7. 多个通道,读取顺序是什么,rank 设置

数据读取

  1. 软件触发,使用函数直接读取
  2. 开启 ADC 中断回调函数,在其中使用函数读取数据。相当于把上一步代码搬到中断函数中。
  3. 轮询或者扫描模式
  4. 使用 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 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值