STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程
- 📌相关篇《【硬件开源电路】STM32G070RBT6开发板》
📋对于STM32G070RBT6来说,它的ADC是12位,ADC最多有16个外部通道和3个内部通道。支持单次,连续以及间断模式扫描。
- 🌼STM32CubeMX配置过程
- 🌷业务代码补充演示
📚工程概要
📑通过ADC DMA采集PA0 ~ PA3的外部电压信号(单片机能承受的电压信号范围:0 ~ 3.6V) ,然后通过串口1分别打印每个通道的数据以及转换后的电压值。
🔨启用以下4个通道:
PA0 ------> ADC1_IN0
PA1 ------> ADC1_IN1
PA2 ------> ADC1_IN2
PA3 ------> ADC1_IN3
- 🌿在DMA功能模块当中添加
ADC1
- 🌿使能串口1功能
默认配置的串口1引脚位PC4和PC5,可以根据个人需求将串口1复用到:PA9和PA10,或者PB6和PB7
📝相关业务代码补充
- 🌿在usart.c文件当中,在指定的位置放置如下实现函数
📑主要功能是实现在需要调试信息输出的地方,Printf函数串口打印,在需要使用printf打印的地方,需要包含其stdio.h头文件,本函数依赖Miicro LIB,需要在Keil中,
Target-
勾选“Micro Lib
”选项。
#include "stdio.h"
/*可调用printf*/
int fputc(int ch,FILE *f)
{
/*&huart1指的是串口1,如果用别的串口就修改数字*/
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 0xffff);
return ch;
}
- 🌿编译器版本根据个人安装的版本选择,STM32CubeMX生成的是5.37的,如果安装的是最新的那么就选择ARM Compiler 6版本的。
- 🌿主函数
while
中添加如下代码
for(int i=0; i<ADC_BUFFER_SIZE; i++) {
voltage[i] = (float)adc_dma_buffer[i] * (3.3/4096);
printf(" PA%1d ADC_value: %u voltage: %.2fv\r\n", i,adc_dma_buffer[i], voltage[i]);
}
printf("\r\n");
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//板载led状态翻转
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&adc_dma_buffer, ADC_BUFFER_SIZE);//如果DMA设置的是循环模式,可以将此函数放置到while前面,启用一次即可。
HAL_Delay(800);
📚STM32G070工程源码
链接:https://pan.baidu.com/s/1yFeJYatGv5E90IMMWFw_Ag
提取码:goq2
📙STM32F4 ADC DMA单通道采样例程
- 🔰ADC 单通道采样和多通道采样软件配置差异:
- 🔖
Scan Conversion Mode
需要使能Enable
:此项选择扫描模式使能,代表启用对多通道路ADC输入分别扫描,如果不使能,其将会只读取一个输入的值。- 🔖
Number of Conversion
设置: 如果有多少路输入就选择多少,此处选择数字之后,下面的Rank
才会出来启用的通道。
- 🌿DMA设置和上面的相同:
- 📝main函数代码:
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t AdcBuf=0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
// HAL_ADCEx_Calibration_Start(&hadc1); //F401没有
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&AdcBuf,1) ;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
float Voltage = AdcBuf*3.3f/4095;//通过转化的值计算电压值
printf("\n\rCH0 AdcBuf:%d ,Voltage=%.2fV\n\r",AdcBuf,Voltage);//输出电压值
HAL_Delay(500) ;
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}
/* USER CODE END 3 */
}
📘STM32F401测试工程:
链接:https://pan.baidu.com/s/1Zaf0b8xrXssGs6e5FCsyPw?pwd=ema3
提取码:ema3