四、GD32 MCU 常见外设介绍 (6) ADC 模块介绍

news2024/11/15 13:39:27

6.1.ADC 基础知识

12 位逐次逼近式模数转换器模块(ADC),可以采样来自于外部输入通道、内部输入通道的模拟信号,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。

6.2.GD32 ADC 外设原理

GD32 ADC 主要特性

◼ 高性能:

– ADC采样分辨率: 12位、 10位、 8位、或者6位分辨率;

– 前置校准功能;

– 可编程采样时间;

– 数据存储模式:最高有效位对齐和最低有效位对齐;

– 支持规则数据转换的DMA请求。

◼ 模拟输入通道:

– 16个外部模拟输入通道;

– 1个内部温度传感器输入通道(VSENSE);

– 1个内部参考电压输入通道(VREFINT)。

◼ 转换开始的发起:

– 软件触发;

– 硬件触发。

◼ 转换模式:

– 转换单个通道,或者扫描一序列的通道;

– 单次运行模式,每次触发转换一次选择的输入通道;

– 连续运行模式,连续转换所选择的输入通道;

– 间断运行模式;

– 同步模式(适用于具有两个或多个ADC的设备)。

◼ 转换结果阈值监测器功能: 模拟看门狗。

◼ 中断的产生:

– 常规序列转换结束;

– 模拟看门狗事件。

◼ 过采样:

– 16位的数据寄存器;

– 可调整的过采样率,从2x到256x;

– 高达8位的可编程数据移位。

◼ ADC供电要求:

– 2.4V到3.6V,一般供电电压为3.3V。

◼ ADC输入范围: VREF- ≤VIN ≤VREF+。

– VREF- : ADC 负参考电压, VREF- = VSSA

– VREF+ : ADC 正参考电压, 2.6 V ≤ VREF+ ≤ VDDA

ADC 结构框图介绍

6.3.硬件连接说明

ADC的检测需要将输入阻抗和采样周期保持一定的关系,下表列出了以GD32E103为例子 

6.4.软件配置说明

查询法

查询法采用的是转换单个通道,或者扫描一序列的通道,通过不断切换通道的方式去读取对应通道的ADC数值。我们介绍使用库函数来设置 ADC0 的通道来进行 AD 转换的步骤,下面讲解其详细设置步骤:

开启 GPIO口时钟和 ADC0 时钟,设置GPIO口为模拟输入。

rcu_periph_clock_enable(RCU_GPIOA);
 /* enable GPIOB clock */
 rcu_periph_clock_enable(RCU_GPIOB);
 /* enable ADC0 clock */
rcu_periph_clock_enable(RCU_ADC0);
/* config ADC clock */
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4);
/* enable alternate function clock */
rcu_periph_clock_enable(RCU_AF); //使能 GPIO 口复用

这里需要说明一下, ADC 的通道与引脚的对应关系在数据手册可以查到

(1)配置 ADC 输入时钟分频,模式为独立模式,转换长度以及触发方式等

/* reset ADC */
adc_deinit(ADC0);
/* ADC mode config */
adc_mode_config(ADC_MODE_FREE); //独立模式
/* ADC continous function enable */
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE)
/* ADC data alignment config */
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); //ADC 数据右对齐
adc_special_function_config(ADC0,ADC_CONTINUOUS_MODE,DISABLE);
/* ADC channel length config */
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);//设置 ADC 转换的通道数量
/* ADC trigger config */
adc_external_trigger_source_config(ADC0,ADC_REGULAR_CHANNEL,ADC0_1_EXTTRIG_REGULAR_NONE);
//通过软件触发 ADC 转换
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

(2)开启 AD 转换器

在设置完了以上信息后,我们就开启 AD 转换器了

/* enable ADC interface */
adc_enable(ADC0);
delay_1ms(1);//延迟 等待稳定
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC0);//使能 ADC 校准

(3)读取 ADC 值 在上面的步骤完成后, ADC 就算准备好了。所谓的查询法就是不断地进行通道切换

unsigned short adc0_transfer(unsigned char adc_channel)
{
uint16_t ADC_temp;
 /* ADC regular channel config */
 adc_regular_channel_config(ADC0, 0, adc_channel, ADC_SAMPLETIME_55POINT5);
adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);
 while(!adc_flag_get(ADC0, ADC_FLAG_EOC));//等待转换完成
 /* clear the end of conversion flag */
 adc_flag_clear(ADC0, ADC_FLAG_EOC);
 ADC_temp=adc_regular_data_read(ADC0);
 return ADC_temp;
}

这里还需要说明一下ADC的参考电压,是以Vref作为参考电压。

常规通道转换 DMA 搬运

通过ADC转换,在ADC 转换完成后 触发DMA 进行数据搬运。

DMA 请求,可以通过设置 ADC_CTL1 寄存器的 DMA 位来使能,它用于规则组多个通道的转换结果。 ADC 在规则组一个通道转换结束后产生一个 DMA 请求, DMA 接受到请求后可以将转换的数据从 ADC_RDATA 寄存器传输到用户指定的目的地址。

在和查询法一节的差别,主要在于ADC 的配置方面和DMA的配置

(1)ADC 的配置

/* ADC channel length config */
 adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 4);//常规通道长度配置
 /* ADC regular channel config */
 adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);
 adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5);
 adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_6, ADC_SAMPLETIME_55POINT5);
 adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5);
 /* ADC trigger config */
adc_external_trigger_source_config(ADC0,ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE);
 adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
/* ADC DMA function enable */
 adc_dma_mode_enable(ADC0);//使能 DMA 模式

 /* enable ADC interface */
 adc_enable(ADC0);
 delay_1ms(1);
 /* ADC calibration and reset calibration */
adc_calibration_enable(ADC0);

 (2)DMA的配置

 /* ADC_DMA_channel configuration */
dma_parameter_struct dma_data_parameter;
 /* ADC DMA_channel configuration */
 dma_deinit(DMA0, DMA_CH0);
 /* initialize DMA single data mode */
 dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); //外设地址
 dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
 dma_data_parameter.memory_addr = (uint32_t)(&adc_value); //搬运目标地址
 dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
 dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
 dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; 
 dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
 dma_data_parameter.number = 4;
 dma_data_parameter.priority = DMA_PRIORITY_HIGH;
 dma_init(DMA0, DMA_CH0, &dma_data_parameter);
 /* enable DMA circulation mode */
 dma_circulation_enable(DMA0, DMA_CH0);
 /* enable DMA channel */
dma_channel_enable(DMA0, DMA_CH0);

(3)触发ADC 转换

adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);

 注入通道-中断

在和查询法一节的差别,主要在于ADC 的配置方面和注入通道会产生中断

(1)ADC 的配置

 /* reset ADC */
 adc_deinit(ADC0);
 /* ADC mode config */
 adc_mode_config(ADC_MODE_FREE);
 /* ADC continous function enable */
 adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
 /* ADC data alignment config */
 adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

 /* ADC channel length config *//注入通道配置
 adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 4);//注入通道长度配置
 /* ADC inserted channel config */
 adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
 adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
 adc_inserted_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);
 adc_inserted_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5);
 /* ADC trigger config */ //通过 EXTI 15 进行触发
 adc_external_trigger_source_config(ADC0,ADC_INSERTED_CHANNEL,ADC0_1_EXTTRIG_INSERTED_EXTI_15); 
 /* ADC external trigger enable */
 adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
/* clear the ADC flag */
 adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
 adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
 /* enable ADC interrupt */
adc_interrupt_enable(ADC0, ADC_INT_EOIC);//使能注入通道的中断
/* enable ADC */
adc_enable(ADC0);
delay_1ms(1);
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC0);

(2)ADC 注入通道转换完成服务函数

void ADC0_1_IRQHandler(void)
{
 /* clear the ADC flag */
 adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);//清除注入通道转换完成标志位
 /* read ADC inserted group data register */
 inserted_data[0] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0);
 inserted_data[1] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_1);
 inserted_data[2] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_2);
 inserted_data[3] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_3);
}

6.5.ADC 使用注意事项

  1. ADC通道的采集引脚未配置为模拟输入,GD32要求通道IO口必须配置为模拟输入;

  2. ADC时钟过高,ADC采样时钟高于ADC最高采样时钟获取到的数据不具有参考意义,需要手动分频到合适的ADC 要求的频率;

  3. ADC采样值偏小或不稳定,应该适当的降低ADC时钟,加大采样周期的值;

  4. ADC的查询法在获取ADC数值的时候,不允许重入,即不允许在同一时间调用ADC的数据读取函数;

  5. ADC在使能之后需要进行短暂的延时,时间周期约为2毫秒左右,以保证ADC能正常启动。

本章内容每日持续更新,如有兴趣,请关注收藏

更多GD32 MCU相关咨询:https://www.gd32bbs.com/ 

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

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

相关文章

go语言Gin框架的学习路线(十)

目录 GORM的CRUD教程 查询 普通查询 定义 User 结构体 查询所有用户 查询第一个用户 总结 条件查询 内联条件 额外查询选项 高级查询 链式操作 Scopes 多个立即执行方法 GORM的CRUD教程 CRUD 是 "Create, Read, Update, Delete"(创建、查询…

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室(Matrix Laboratory)”,其对矩阵的操作具有先天性的优势(特别是相对于C语言的数组来说)。在数字图像处理中,为了提高编程效率,我们可以使用多种方式来创…

【UIE模型-傻瓜式教程】飞桨AI Studio中fork实体抽取任务(打车、快递单)并运行教程

文章目录 fork项目环境与数据准备微调训练验证与测试 fork项目 环境与数据准备 安装paddlenlp(尽量装paddlenlp2.4.2,否则会报错!) 下载打车数据 转换数据格式,并划分训练集、验证集和测试集 微调训练 微调训练&#x…

WiFi通信——STM32通过ESP8266-01S与阿里云通信

嵌入式设计中常用的无线通信方式主要由蓝牙、WiFi、Zigbee、Lora、NB-IOT等等。这些是最常用的,也是在实际项目开发中根据项目的数据通信特点来选择相应的无线通信方式。本设计主要是讲解WiFi在嵌入式开发中的使用。 1. ESP8266-01S烧录固件 WiFi通信的频段和蓝牙一…

论文中的流程图参考图片

写论文的时候,在绘制流程图时,一直纠结n是大写还是小写,用不用斜体,号两边要不要空格。今天找到了一张标准的流程图来参考。图片来自 Zhi-Chang Ba et al, Combination of DCE-MRI and NME-DWI via Deep Neural Network for Predi…

学成在线开心学习

环境配置 第一章 项目介绍&环境搭建 项目背景 项目业务框架 项目技术架构 第二章 内容管理模块 本项目使用mybatis-plus的generator工程生成PO类、Mapper接口、Mapper的xml文件 模块工程 模型类的作用 课程查询接口 controller ApiOperation("课程查询接口&qu…

数字化就是要“用数字说话”运营,按“效果付费”经营

随着数字化技术的迅速发展,企业所处的市场环境发生了深刻的变革。在这个数字化转型时期,数据成为了企业决策的关键依据,“用数字说话”已成为企业运营的基本准则。而“效果付费”作为一种基于实际成果的商业模式,正逐渐受到企业经…

【QAC】Dashboard服务端如何配置

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决Dashboard服务端如何配置的问题。 2、 问题场景 客户想使用Dashboard,Dashboard服务端如何配置。 3、软硬件环境 1、软件版本:HelixQAC23.04 2、机器环境:Windows 64bit 3…

Linux_权限3

Linux所对应的文件类型 1.在Win下,有文件类型,通常通过后缀标识 日常用的就是windows系统这里不做举例. 2.Linux的文件类型不通过后缀区分(不代表Linux不用后缀) 其中需要注意的是第一个字符表示文件类型的含义 - :普通文件, 文本, 源代码…

AtCoder Beginner Contest 363(A~D题)

A - Piling Up 思路: 我们只需要找到下一阶段的下限。a / 100 是本阶段1 变成下一阶段&#xff0c;再 * 100变成下限&#xff0c;再与原来的相减即可。 代码: #include<bits/stdc.h> using namespace std; #define N 200010 typedef long long ll; typedef unsigned l…

Biomimetics 综述分享:肌电假肢手的交互操作控制综述

近些年假肢灵巧手成为了热点研究方向。此前有综述研究回顾了包括基于表面肌电信号的预测连续上肢运动的方法、基于表面肌电信号的多任务人机交互应用&#xff0c;以及肌电控制中的各种性能指标。近期&#xff0c;期刊Biomimetics&#xff08;JCR Q1&#xff09;发表了“面向肌电…

定时器+外部中断实现NEC红外线协议解码

一、前言 1.1 功能介绍 随着科技的进步和人们生活水平的提高&#xff0c;红外遥控器已经成为了日常生活中不可或缺的电子设备之一&#xff0c;广泛应用于电视、空调、音响等多种家电产品中。 传统的红外遥控器通常只能实现预设的有限功能&#xff0c;无法满足用户对设备更加智…

Mac 下华为鸿蒙 :DevEco Studio 开发工具下载

1.登录&#xff1a;华为开发者中心--开发--下载工具DevEco Studio 2.下载完成后 &#xff0c;安装&#xff0c;并创建一个新项目。 3.Tools --点击SDK Manager 下载SDK: 如果报&#xff1a;淘宝镜像源错误&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_H…

Threejs——辅助视图的旋转轴

官网的代码&#xff1a;link 实现这个效果 import {CylinderGeometry,CanvasTexture,Color,Euler,Mesh,MeshBasicMaterial,Object3D,OrthographicCamera,Quaternion,Raycaster,Sprite,SpriteMaterial,SRGBColorSpace,Vector2,Vector3,Vector4 } from three;class ViewHelper …

FP5207+音频功率放大器的组合解决方案-适用于便携式音频播放器、无线耳机、智能音箱和车载音响系统等高质量音频输出需求的产品,以提高电池供电的效率和输出功率

随着消费者对智能家居的需求增长&#xff0c;智能音响市场成为重要增长点。同时&#xff0c;音响技术也在不断发展&#xff0c;音响及扬声器的功能和性能不断提升。 蓝牙音箱&#xff0c;这类音箱供电是以锂电池为主&#xff0c;一般选用内置升压的音频功放芯片&#xff0c;音响…

Java聚合快递系统对接云洋系统快递小程序系统源码

&#x1f680; "聚合快递系统"无缝对接云洋系统&#xff0c;快递小程序新体验&#xff01;&#x1f4e6; &#x1f69a; 开篇&#xff1a;快递管理新纪元&#xff0c;一键接入云洋系统&#xff01; 你是否还在为繁琐的快递管理而头疼&#xff1f;多个快递公司账号切…

构建一个具有深色模式的简单React Web应用

在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。 项目概述 我们的目标是创建一个具有以下特性的Web应用: 左侧导航栏,包含四个链…

JavaScript(12)——内置对象

JavaScript内部提供的对象&#xff0c;包含各种属性和方法给开发者调用。 Math Math对象是JavaScript提供的一个“数学”对象 包含的方法有&#xff1a; random:生成0-1之间的随机数 ceil&#xff1a;向上取整 floor&#xff1a;向下取整 max&#xff1a;找最大数 min&#…

Leetcode 721.账户合并(hash+dfs)☆

思路&#xff1a; 最核心的地方在于如何合并&#xff1f;这里是通过具有相同的email进行账户的合并&#xff0c;这个相同的email类似于图中的共同节点将两个账户连接起来&#xff0c;所以将原来 账户名 -> 邮件1 邮件2.。。变成hash 邮件1 ->账户id1&#xff0c;账户id2…

2024年jupyter notebook如何复制单元格cell输出的图片

背景 之前使用jupyter notebook复制图片一直是正常&#xff0c;右键就行&#xff0c;可以找到复制图片或者另存为的选项。 但是最近重新安装了anaconda&#xff0c;发现jupyter notebook升级了&#xff0c;和原来的界面不一样了。 如果有一个图片&#xff0c;我们右键&#x…