STM32G4系列MCU双ADC多通道数据转换的应用

目录

概述

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端口上,测试输出数据的波形

 原始数据波形和转换后的数据波形叠加:

作者:mftang

物联沃分享整理
物联沃-IOTWORD物联网 » STM32G4系列MCU双ADC多通道数据转换的应用

发表回复