目录
概述
1 STM32Cube配置项目
1.1 基本参数配置
1.1.1 ADC1参数配置
1.1.2 ADC2参数配置
1.2 项目软件架构
2 功能实现
2.1 ADC转换初始化
2.2 ADC数据组包
3 测试函数
3.1 Vofa数据接口
3.2 输入数据
4 测试
4.1 ADC1 通道测试
4.2 ADC2 通道测试
概述
本文主要介绍STM32G4系列MCU双ADC多通道数据转换的应用的方法,笔者通过STM32Cube工具配置多路ADC,并使用DAC模块产生1路模拟信号,验证ADC模块数据转换的功能。
1 STM32Cube配置项目
1.1 基本参数配置
1.1.1 ADC1参数配置
1)配置ADC1的端口
2)配置ADC2的端口
3)配置ADC的通道参数
step - 1 : 使能和选择相关的通道
step - 2 :选择如下配置
step-3: 配置数据模式和通道号信息
step-4: 使能DMA通道信息
1.1.2 ADC2参数配置
ADC2的参数配置方法和ADC1相似,这里不再做重复介绍。
1.2 项目软件架构
完成1.1小节的参数配置之后,就可以生成项目代码,其具体架构如下:
2 功能实现
2.1 ADC转换初始化
由于系统采用DMA的方式实现ADC转换功能,所以直接从buff中读取数据即可。初始化代码如下:
代码第32~33行: 定义两个buff,用于存放ADC转换数据的结果
代码38行:初始化ADC1模块
代码39行:启动ADC1的DMA模式ADC数据转换功能
代码41行:初始化ADC2模块
代码42行:启动ADC2的DMA模式ADC数据转换功能
源代码如下:
uint16_t adc1_rawlist[3];
uint16_t adc2_rawlist[5];
void Sample_Init(void)
{
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_rawlist, 2);
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc2, (uint32_t *)adc2_rawlist, 4);
}
2.2 ADC数据组包
编写一个函数,将ADC1转换的数据和ADC2转换的数据转行成一个数据包,方便调用:
代码83~90行:实现数据组包功能
代码92行:使用vofa将数据包显示出来
3 测试函数
3.1 Vofa数据接口
代码21行:定义数据长度
代码22行:定义发送数据端口
代码25~29行:定义vofa数据包的结构
代码40~47行:定义发送数据函数
源代码如下:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : vofaDebug.c
* Description : debug source code interface
******************************************************************************
* @attention
*
* COPYRIGHT: Copyright (c) 2024 mingfei.tang
* CREATED BY: ming fei.tang
* DATE: JUL 05th, 2024
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "vofaDebug.h"
#include "usart.h"
#define LEN 6
#define DEBUG_UART_OBJ huart2
/* Private variables ---------------------------------------------------------*/
typedef struct Frame
{
float fdata[LEN];
unsigned char tail[4];
} Frame_t;
Frame_t Frame_Buff =
{
.tail[0] = 0x00,
.tail[1] = 0x00,
.tail[2] = 0x80,
.tail[3] = 0x7f,
};
/* Public user code ---------------------------------------------------------*/
void Debug_PrintJustFloat(const uint16_t *pData, uint16_t Size)
{
for (uint16_t i = 0; i < Size; i++)
{
Frame_Buff.fdata[i] = pData[i];
}
HAL_UART_Transmit_DMA(&DEBUG_UART_OBJ, (uint8_t *)&Frame_Buff, sizeof(Frame_Buff));
}
/* Private user code for printf log ------------------------------------------*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit_DMA(&DEBUG_UART_OBJ, (uint8_t *)&ch, 1);
return (ch);
}
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive_DMA(&DEBUG_UART_OBJ, (uint8_t *)&ch, 1);
return (ch);
}
void Debug_fresh( void )
{
// int ch;
// HAL_UART_Receive_DMA(&DEBUG_UART_OBJ, (uint8_t *)&ch, 1);
}
/* End of this file */
3.2 输入数据
使用STM32G4的DAC2通道产生一路模式信号,用于作为ADC的输入数据。
1)选择端口和通道
2)配置参数
3)编写输出函数
代码52行:启动DAC数据转换功能
代码53行:初始化端口电平
4)实现正弦波信号函数
源代码文件如下:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : waveLib.c
* Description : main task
******************************************************************************
* @attention
*
* COPYRIGHT: Copyright (c) 2024 tangmingfei2013@126.com
* CREATED BY: mingfei.tang
* DATE: JUL 05th, 2024
******************************************************************************
*/
/* USER CODE END Header */
#include "waveLib.h"
#include "dac.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
#define PI 3.14159
void DAC_SetConvert( uint32_t value)
{
HAL_DAC_SetValue( &hdac2, DAC_CHANNEL_1, DAC_ALIGN_12B_R,value );
}
float dac_triangle_wave( void )
{
static double t = 0;
float angle;
if( t >= 1 )
{
t = 0;
}
t += 0.001;
angle = t*800;
return angle;
}
float asin_wave( void )
{
static double t = -1;
float value, angle;
if( t >= 1 )
{
t = -1;
}
value = asin( t );
angle = (180*value)/3.1415926;
t += 0.001;
return angle;
}
float sin_wave( void )
{
float value, angle;
static double t = -1;
angle = 2*PI*t;
value = 1000*sin( angle )+1500;
t += 0.001;
if( t >= 1 )
{
t = -1;
}
return value;
}
/* End of this file */
4 测试
4.1 ADC1 通道测试
将DAC的数据输出端口连接到ADC1 - PC0端口上,测试输出数据的波形
DAC的波形数据:
ADC`-PC0接口转换的数据波形:
4.2 ADC2 通道测试
将DAC的数据输出端口连接到ADC2 - PC2端口上,测试输出数据的波形
原始数据波形和转换后的数据波形叠加: