【GD32】02-ADC模拟数字转换器

ADC

在电子和通信技术中,ADC(模拟数字转换器)是一种将模拟信号转换为数字信号的电子设备。这种转换是电子系统中非常关键的一个环节,因为数字信号更易于处理、存储和传输。ADC的工作原理通常包括采样、保持、量化和编码等步骤。采样是从模拟信号中提取离散的值,保持是确保在采样期间信号值不变,量化是将采样值转换为最接近的数字值,而编码则是将这些数字值表示为二进制代码。ADC的性能指标包括分辨率、转换速率和精度等。

ADC在多个领域都有广泛的应用。在通信领域,ADC用于将模拟信号(如语音信号)转换为数字信号,以便在无线通信、有线通信和光纤通信系统中进行传输。在医疗领域,ADC用于将生物信号(如心电图和脑电图)转换为数字信号,以便于进行医学分析和诊断。此外,在汽车领域,ADC用于检测传感器信号,如发动机转速、车速和油位等,以实现对汽车系统的精确控制。

 以上介绍来自文心一言。

GD32E230C8T6中的ADC

GD32E230C8T6只有一个ADC,但是可以用的外部通道有10个,还是够用的。

那么我们需要看看ADC的不同通道对应着哪些GPIO。

可用的GPIO是GPIOA的0号引脚到7号引脚,以及GPIOB的0和1号引脚。

接下来我们来看看怎么使用ADC。

固件库函数

在介绍ADC相关固件库之前我们需要先打开外设时钟。 

    rcu_periph_clock_enable(RCU_ADC);

还需要指定一下ADC的时钟。

rcu_adc_clock_config

可以选择的选项在上面表格中。关于如何选择,我们还需要看看GD32E230的时钟树。

由于ADC最大只能28MHz,因此配置的时钟频率不能大于28MHz。

ADC相关的固件库函数很多,我这边就挑着讲。

adc_enable

无需参数,调用即可使能ADC外设。

当然了,这个函数我们需要等ADC配置完再调用,可以参考STM32的ADC。这边先讲是因为我按照固件库使用指南的顺序说的,函数具体调用的时机可以参考我最后的示例代码。

adc_disable

有使能就有失能。调用之后就相当于关闭了ADC外设。

adc_calibration_enable

开启ADC校准复位。也就是让ADC开始校准,在STM32中也有类似的做法,不过在GD32的固件库中我们只需要调用这个函数即可。

adc_channel_length_config

配置通道组的长度,一般来说都是用的规则组(ADC_REGULAR_CHANNEL),我们一共用到几个ADC通道,我们第二个参数就填几。

adc_regular_channel_config

设置规则组,设置rank也就是通道序列,还有ADC的通道,一般来说通道几我们的rank也就是几。还有就是采样时间,可供选择的参数可以参考上表,采样周期越长,采样结果越精确,按照实际需求配置就行。

adc_external_trigger_config

配置ADC外部触发。我们选择规则组和使能。

这个函数描述会有点歧义,我们ADC一般是由软件触发的,实际上软件触发也属于外部触发的一种,这边外部触发的外部和外部中断的外部不太一样。

adc_external_trigger_source_config

选择外部触发源,我们选择软件触发。 

adc_software_trigger_enable

开启软件转换。

adc_regular_data_read

读取规则组的ADC的转换值,但是我们需要在ADC转换之后再读取。

adc_flag_get

获取ADC的标志位,我们在读取数据之前需要等待ADC转换结束,用的就是这个函数。

adc_resolution_config

配置ADC分辨率,可以选6,8,10,12位,一般来说我们就多多益善,选择12位的分辨率。

adc_special_function_config

开启ADC特殊功能,我们这边打开扫描模式。如果有用到DMA的话可以选择连续模式。

adc_data_alignment_config

选择数据对齐方式,因为存放ADC转换结果的寄存器是16位,而我们的分辨率是小于16位的,因此我们需要选择把这12位的数据靠左放还是靠右放,一般就是右对齐。

示例代码

我们再梳理一下,首先先调用配置函数,配置函数的顺序无所谓,都可以。

然后是使能ADC,接着是校准。

最后是读取数据,开启软件触发之后我们就等待转换完毕,转换结束之后调用函数读取即可。

#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "OLED.h"


uint16_t getValue(uint8_t  ADC_CHANNEL_x){
    adc_regular_channel_config(0, ADC_CHANNEL_x, ADC_SAMPLETIME_239POINT5); //设置采集通道
    adc_software_trigger_enable(ADC_REGULAR_CHANNEL);                       //开始软件转换
    while ( adc_flag_get(ADC_FLAG_EOC) == RESET ) ;                         //等待 ADC 采样完成 
    uint16_t res = adc_regular_data_read();                                 //读取采样值
    return res;
}

int main(void){
    systick_config();       //延时函数初始化
    OLED_Init();            //OLED初始化
    
    rcu_periph_clock_enable(RCU_GPIOA);   //开启GPIOA的外设时钟
    rcu_periph_clock_enable(RCU_ADC);     //开启ADC的外设时钟
    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV4);  //指定ADC的时钟为5分频的APB2(72MHz/4)

    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);     //将ADC的对应通道的对应引脚设为模拟输入
    adc_special_function_config(ADC_SCAN_MODE, ENABLE);                     //开启扫描模式
    adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE);                //开启规则组外部触发
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);  //配置规则组为软件触发
    adc_regular_channel_config(0, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5); //设置规则组通道
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);                         //数据右对齐
    adc_resolution_config(ADC_RESOLUTION_12B);                              //配置分辨率为12位
    adc_channel_length_config(ADC_REGULAR_CHANNEL, 1);                      //配置规则组长度为1
    
    adc_enable();                       //使能ADC    
    adc_calibration_enable();           //开启校准
    
    uint16_t val;
    OLED_ShowString(1,1,"Hello World");
    while(1){
        val=getValue(ADC_CHANNEL_0);
        OLED_ShowNum(2,1,val,6);
        delay_ms(1000);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…

最简单的Winapi编程窗口程序

以下是一个简单的使用 WinAPI 创建窗口的程序示例&#xff0c;大致了解下win32的一个窗口编程大致流程&#xff1a; #include <Windows.h>// 窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_DES…

Ubuntu24 文件目录结构——用户——权限 详解

目录 权限 用户 文件目录结构 一个目录可以有程序&#xff0c;目录&#xff0c;文件&#xff0c;以及这三者的链接。可以看到还分别有使用者和权限信息。 每个文件和目录都有与之关联的三个主要属性&#xff1a;所有者&#xff08;owner&#xff09;、组&#xff08;group&a…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章编号&#x…

【JavaEE】Spring Boot 入门:快速构建你的第一个 Spring Boot 应用

目录 第一个SpringBoot程序介绍项目创建创建项目目录介绍输出Hello World 第一个SpringBoot程序 介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring 我们看下Spring官⽅(https://spring.io/)的介绍 可以看到, Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单…

【MySQL数据库】详解数据库审核工具SQLE的部署及接口调用

SQLE部署及使用 1. 部署SQLE SQLE相信大家都不陌生吧&#xff0c;它是一款开源&#xff0c;支持多场景审核&#xff0c;支持标准化上线流程&#xff0c;原生支持 MySQL 审核且数据库类型可扩展的 SQL审核工具。我们可以基于此工具进行数据库SQL审核&#xff0c;提升SQL脚本质量…

LangChain:模型 I/O 封装使用解析和感触

目录 模型 API&#xff1a;LLM vs. ChatModel OpenAI 模型封装 多轮对话 Session 封装 换个国产模型 模型的输入与输出 Prompt 模板封装 PromptTemplate ChatPromptTemplate MessagesPlaceholder 从文件加载 Prompt 模板 TXT模板 Yaml模板 Json模板 输出封装 Out…

使用模拟SPI接口驱动串行接口的LCD( STM32F4)

目录 概述 1. 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 2 代码实现 2.1 STM32CubeMX 6.11生成工程 2.2 IO模拟SPI接口 2.3 实现LCD的驱动 3 测试 测试代码下载地址&#xff1a; stm32-f407-lcd-ft6336-proj资源-CSDN文库 gitee下载地址&#xff1a; h…

48. 旋转图像/240. 搜索二维矩阵 II

48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 &#xff1a; 输入&#xff1a;matrix [[5,1,9,11],[2,4,…

NodeMCU ESP8266 获取I2C从机地址

文章目录 前言关于地址位读写位程序总结前言 I2C总线上可以挂载很多的从设备,每个设备都会有一个自己唯一的一个地址; 关于地址位 通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址; 读写位 该位…

81.网络游戏逆向分析与漏洞攻防-移动系统分析-飞天遁地的实现与面向计算

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

服装定制|基于SSM+vue的服装定制系统的设计与实现(源码+数据库+文档)

服装定制系统 目录 基于SSM&#xff0b;vue的服装定制系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

【CTF Web】QSNCTF 文章管理系统 Writeup(SQL注入+Linux命令+RCE)

文章管理系统 题目描述 这是我们的文章管理系统&#xff0c;快来看看有什么漏洞可以拿到FLAG吧&#xff1f;注意&#xff1a;可能有个假FLAG哦 解法 SQL 注入。 ?id1 or 11 --取得假 flag。 爆库名。 ?id1 union select 1,group_concat(schema_name) from information_sch…

【机器学习】集成学习在信用评分领域实例

集成学习在信用评分领域的应用与实践 一、引言二、集成学习的概念与原理三、集成学习在信用评分中的应用实例四、总结与展望 一、引言 在当今金融数字化快速发展的时代&#xff0c;信用评分成为银行、金融机构等评估个人或企业信用风险的重要工具。然而&#xff0c;单一的信用评…

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…

STM32快速入门(定时器之输出PWM波形)

STM32快速入门&#xff08;定时器之输出PWM波形&#xff09; 前言 本节主要讲解STM32利用通用定时器&#xff0c;利用CCR和CNT寄存器&#xff0c;输出指定占空比和频率的PWM波形。其功能的应用有&#xff1a;实现LED呼吸灯的效果、控制步进电机、控制直流电机转速等。 导航 …

基于FPGA的NC图像质量评估verilog实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 vivado2019.2和matlab2022a测试&#xff0c;结果如下&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale …

解决vue3项目打包后部署后某些静态资源图片不加载问题

目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符&#xff0c;导致无…

高精度原理介绍及代码实现

目录 高精度 引入 使用场景 实现原理 高精度加法 数据存储 加法实现 总代码 高精度减法 与加法的不同点&#xff1a; 总代码 高精度乘法 总代码 高精度除法 总结 总注意点 减法注意点 高精度 引入 所谓高精度并不是很高级难懂的东西&#xff0c;只是对传统的…