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

news2024/12/23 20:20:55

目录

概述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT&#xff08;非阻塞模式&#xff09;&#xff1a; HAL_UART_Transmit_IT 是非阻塞的传输函数&#xff0c;也就是说&#xff0c;当你调用 HAL_UART_Transmit_IT 时&#xff0c;它不会等到数据完全发…

constexpr、const和 #define 的比较

constexpr、const 和 #define 的比较 一、定义常量 constexpr 定义&#xff1a;constexpr用于定义在编译期可求值的常量表达式。示例&#xff1a;constexpr int x 5;这里&#xff0c;x的值在编译期就确定为5。 const 定义&#xff1a;const表示变量在运行期间不能被修改&…

BMS电池管理系统

一.项目简介 1.该项目是基于BQ7692003PWR STM32F103C8T6研发的一块锂电池控制板&#xff0c;本控制板可供五串18650锂电池&#xff08;目前软件仅支持三元锂类型&#xff0c;标称电压为4.2V&#xff09;串联使用&#xff0c;电芯均衡采用被动均衡方式 二.本项目功能 1.监控任…

Milvus向量数据库01-基础概念

Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection&#xff0c;然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …

【OpenCV】模板匹配

理论 模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此&#xff0c;OpenCV 带有一个函数 cv.matchTemplate&#xff08;&#xff09; 。它只是在输入图像上滑动模板图像&#xff08;如在 2D 卷积中&#xff09;&#xff0c;并比较模板图像下的模板和输入图像的补…

深入解析下oracle的number底层存储格式

oracle数据库中&#xff0c;number数据类型用来存储数值数据&#xff0c;它既可以存储负数数值&#xff0c;也可以存储正数数值。相对于其他类型数据&#xff0c;number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。 一、环境搭建 1.…

MySQL Binlog 日志监听与 Spring 集成实战

MySQL Binlog 日志监听与 Spring 集成实战 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种常见的格式&#xff1a;Statement 模式、Row 模式和Mixed 模式。每种模式的设计目标不同&#xff0c;适用于不同的场景&#xff0c;以下是它们的详细对比和…

Vmware Vcenter7.0证书web续期发生错误

1. 故障描述 vSphere Client 版本 7.0.2.00200 vCenter _MACHINE_CERT快到期了&#xff0c;通过web界面更新证书失败 第一步先这样&#xff0c;重新续订一下证书 续订发生错误 2. 解决办法 2.1. 前提工作 登陆ssh到vcenter&#xff0c;重新生成证书 先关掉HA&#xff…

Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展

向Oracle 19g数据库中批量插入数据&#xff0c;当插入近2亿条数据后&#xff0c;报出如下错误&#xff1a; ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间&#xff0c;发现表空间大小已达到32G&#xff0c;表空间无法进行自动扩展了。&#xff08;初始…

数据结构(3)单链表的模拟实现

上一节我们进行了数据结构中的顺序表的模拟式现&#xff0c;今天我们来实现一下另外一个数据结构&#xff1a;单链表。 我们在实现顺序表之后一定会引发一些问题和思考&#xff1a; 1.顺序表在头部和中间插入数据会用到循环&#xff0c;时间复杂O&#xff08;N&#xff09; …

如何高效的向AI大模型提问? - 提示工程Prompt Engineering

大模型的输入&#xff0c;决定了大模型的输出&#xff0c;所以一个符合要求的提问Prompt起到关键作用。 以下是关于提示工程Prompt Engineering主要方法的详细表格&#xff0c;包括每种方法的优点、缺点、应用场景以及具体示例&#xff1a; 主要方法优点缺点应用场景示例明确性…

python正则化表示总结

1.字符 总结&#xff1a; .匹配除“\n”以外的所有字符[…]字符集&#xff0c;…为所给出的范围&#xff0c;如&#xff1a;[a-zA-Z]表示逐个列出所有字符&#xff0c;[0-9]表示逐个列出所有数字[^…]^表示取反&#xff0c;如 [^0-9] 等同于出数字以外所有字符[…]并[…]也可…

BlueOS安装与DVL插件安装

我的blueos端又进不去了&#xff0c;查了查原因SD卡竟然裂开了&#xff01;故重新下载附步骤&#xff1a; 官方网址&#xff1a;BlueOS Documentation DVL插件安装参考&#xff1a;Water Linked DVL A50 Support - Third Party Products / Sonar and Acoustics - Blue Roboti…

学者观察 | Web 3.0生态治理及其安全——北京交通大学副教授李超

导语 李超教授认为Web 3.0中无论是链上治理还是链下治理都有其优劣。链下治理机制更侧重于社区广泛参与和讨论&#xff0c;过程较为繁琐&#xff0c;但能够形成广泛的社区支持和参与&#xff0c;增强决策的合法性和接受度&#xff1b;链上治理机制通过直接在区块链上执行决策&…

C++实现排序算法:冒泡排序

目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后&#xff08;从后往前&#xff09;两两比较&#xff0c;若为逆序&#xff08;即arr[i] < arr[i 1]&#xff09;则交换…

二叉树节点相关算法题|双分支节点个数|所有左叶子之和|每一层节点平均值(C)

双分支节点个数 假设二叉树采用二叉链表存储结构存储&#xff0c;试设计一个算法&#xff0c;计算一棵给定二叉树的所有双分支节点个数 算法思想 计算一棵二叉树中所有双分支节点个数的递归模型 若树为空&#xff0c;结果为0 若当前节点为双分支节点&#xff0c;递归左右孩子…

交互开发---测量工具(适用VTK或OpenGL开发的应用程序)

简介&#xff1a; 采用VTK开发应用程序时&#xff0c;经常需要开发各种各样的测量工具&#xff0c;如果沿用VTK的widgets的思路&#xff0c;绘制出来的的控件不够漂亮&#xff0c;且交互不太灵活&#xff0c;并且随着测量工具的增强&#xff0c;渲染的效率也会有所降低。基于上…

【LEAP模型建模】能源需求/供应预测、能源平衡表核算、空气污染物排放预测、碳排放预测、成本效益分析、交通运输碳排放、电力系统优化等专题应用

采用部门分析法建立的LEAP&#xff08;Long Range Energy Alternatives Planning System/ Low emission analysis platform&#xff0c;长期能源可替代规划模型&#xff09;是一种自下而上的能源-环境核算工具&#xff0c;由斯德哥尔摩环境研究所和美国波士顿大学联合研发。该模…

HarmonyOS-中级(三)

文章目录 合理使用动画和转场Web组件和WebView给应用添加通知和提醒 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月08日12点12分 合理使用动画和转场 动效场景设计&#x…

GC常见垃圾回收算法,JVM分代模型

如何判断是垃圾&#xff1f;引用计数器和Root可达性算法 如何进行清除&#xff1f;标记清除、复制、标记整理 堆分代模型&#xff1f;Eden&#xff0c;Surevivor&#xff0c;Tenuring 一个对象从创建到消亡的过程&#xff1f; 对象什么时候进入老年代&#xff1f; 一、GC&a…