GD32F103 ADC

news2024/12/25 22:29:47

1. 模拟量于数字量。

模拟量:反应真实世界中的物理量(比如温度,压力,长度)模拟量通常是通过电压,电流等信号来表示。

数字量:通常是0和1来表示某个物理量的变化。

 2. ADC(模拟量转成信号量)

1. 分为并联比较,逐次逼近,计数型,双积分型。

1.并联比较型

Vin 大于 Vr 输出1 ,Vin 小于 Vr 输出0. 而Vin可以设置0~8v。每个比较器的Vr通过分压算出来。就可以控制比较器的输出。

上图是输出8位怎么输出三位呢。

利用D触发的当控制端 = 1 ,数据输入等于数据输出。

利用D触发的当控制端 = 0,保持数据输出不变。

如下电路就只输出三位的组合。

 2. 逐次逼近型

一次一次接近所需的值。如下未知砝码的重量。先用权重大的。慢慢加砝码。直到两边平衡。

VIN相当于待测量的值.于VDAC去比较。如果大于或者小于就去调整逐次逼近电路。

直到VIN = VDAC。B1,B2.....Bn的值就是模数的转换结果。

3. ADC的计数参数

3. DAC(数字量转成模拟量)

1. DAC的技术参数

4. ADC的框图 

GD32的框图

STM32的框图

分为规则通道与注入通道。并且规则通道最多可以16个。注入通道最多4个。规则通道只有一个数据寄存器。而注入每个都有单独的数据寄存器。当EOC标志位1。说明ADC转换完成。并且可以触发中断。要想成功转换还必须设置ADC的触发源。比如:软件触发。

  

 1. ADC的通道与序列

2. ADC上电 

 3. ADC时钟

 4. ADC的运行模式

分为单次运行,连续运行,扫描运行,间断运行。

1. 单次模式

单次转换模式:在这种模式下,ADC 仅进行一次转换。一旦转换完成,ADC 将停止工作。这是最基本的模式,适用于只需要一次转换的应用。

2. 连续模式

连续转换模式:在这种模式下,ADC 连续不断地进行转换。每次转换完成后,ADC 会自动启动下一次转换。这种模式适用于需要连续监测的应用,例如连续采集传感器数据。

 3. 扫描模式

扫描模式:在这种模式下,ADC 会按照预设的顺序对多个通道进行转换。每次转换完成后,ADC 会继续进行下一次转换,直到完成所有通道的转换。这种模式适用于需要定期监测多个通道的应用。

4. 间断模式 

间断运行模式:这种模式下,ADC 会在预定的时间间隔内进行转换。在转换完成后,ADC 会停止工作,直到下一次预定的时间到达。这种模式适用于需要定期进行转换,但转换频率较低的应用。

 5. ADC函数的介绍

1.  adc_mode_config

2.  adc_special_function_config 

3. adc_data_alignment_config 

4. adc_channel_length_config

5. adc_external_trigger_source_config

 

6. adc_external_trigger_config

7. adc_enable

8. adc_calibration_enable 

9. adc_regular_channel_config

10. adc_software_trigger_enable

11. adc_flag_get

12. adc_flag_clear

13. adc_regular_data_read

14. adc_interrupt_flag_get

15. adc_interrupt_flag_clear

16. adc_interrupt_enable

6. ADC的dome

光敏电阻与可调电阻的P7的3,1引脚。获取PA4,PA5的电压。根据分压求出光敏电阻与可调电阻

的电阻值。

 resister_adc.h

#ifndef _RESISTER_ADC
#define _RESISTER_ADC

#include "gd32f10x.h"
#include "systick.h"

void resister_adc_init(void);
void gpio_config(void);
void adc_config(void);

uint16_t read_adc0_data(uint8_t adc_channel); // 读取ADC0转换的结果
float get_photo_r(void);    //获取光敏电阻的阻值
float get_var_r(void);      //获取可调电阻的阻值

#endif

  resister_adc.c

#include "resister_adc.h"

// 是与电阻相连的adc外设及其channel的初始化
void resister_adc_init(void){
	gpio_config();
	adc_config();
}

/* 初始化IO口为模拟输入模式 */
void gpio_config(){
	  rcu_periph_clock_enable(RCU_GPIOA);   // 1.使能rcu时钟
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4 |GPIO_PIN_5);  //2.初始化gpio输入模式
}

/* 初始化adc0 */
void adc_config(){
	rcu_periph_clock_enable(RCU_ADC0);            // 使能时钟
	rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);  // 配置ADC的时钟
	
	/* 配置ADC0的参数 */
	adc_mode_config(ADC_MODE_FREE);            // 自由模式 各个ADC独立
	
	adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);        
	adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); //关闭连续模式
	
	adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);      //对齐方式
	adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);   // 转换数量1 不同采集切换通道
	
	adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); // 触发方式,软件触发
	adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);  // 使能外部触发
	
	/* 使能ADC0 */
	adc_enable(ADC0);
	delay_1ms(2);     //等待稳定
	
	/* 自校准 */
	adc_calibration_enable(ADC0);
}

// 读取ADC0转换的结果
uint16_t read_adc0_data(uint8_t adc_channel){
	/*配置adc0的通道*/
	adc_regular_channel_config(ADC0, 0, adc_channel, ADC_SAMPLETIME_1POINT5);
	
	/*触发adc0的转换*/
	adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
	
	/*等待EOC置位,即ADC0转换完成*/
	while(!adc_flag_get(ADC0, ADC_FLAG_EOC));
	/*清零EOC*/
	adc_flag_clear(ADC0, ADC_FLAG_EOC);
	
	/*读常规通道数据寄存器值并返回*/
	return adc_regular_data_read(ADC0);
}

/*获取光敏电阻的阻值, 
* return:光敏电阻阻值,单位是千欧
*/
float get_photo_r(void){
	uint16_t adc_value = 0;
	uint8_t i;
	for(i=0; i<8; i++){
    	adc_value += read_adc0_data(ADC_CHANNEL_5);
	}
	
	adc_value = adc_value / 8;
	
	float v_photo_res = adc_value * 3.3f / 4096.0f;  //得到模数转换的结果对应的电压值 基准电压3.3v  4096 = 2的12次方
	float result = (v_photo_res * 10) / (3 - v_photo_res);
	return result; 
}

/*获取可调电阻的阻值, 
* return:可调电阻阻值,单位是千欧
*/
float get_var_r(void){      
	uint16_t adc_value = 0;
	uint8_t i;
	for(i=0; i<8; i++){
    	adc_value += read_adc0_data(ADC_CHANNEL_4);
	}
	
	adc_value = adc_value / 8;
	
	float v_var_res = adc_value * 3.3f / 4096.0f;  //得到模数转换的结果对应的电压值
	float result = (v_var_res * 10) / (5 - v_var_res);
	return result; 
}

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

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

相关文章

通过HTTP发送大量数据的三种方法

在网络的早期时期&#xff0c;人们发送的文件大小仅为几KB。到了2023年&#xff0c;我们享受着高分辨率的MB级别图像&#xff0c;并在几GB的4K&#xff08;即将是8K&#xff09;视频中观看。 即使有良好的互联网连接&#xff0c;下载一个5GB的文件仍然需要一些时间。如果你拥有…

Photoshop 2024正式发布!内置最新PS AI,创意填充等功能无限制使用!

PS正式版目前更新到了2024&#xff0c;版本为25.0。 安装教程 1、下载得到安装包后&#xff0c;先解压。鼠标右键&#xff0c;【解压到当前文件夹】 2、双击 Set-up 开始安装 3、这里可以更改安装位置。如果C盘空间不够大&#xff0c;可以把它安装到C盘以外。更改好后&#x…

SpringBoot面试题3:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? Spring Boot 的核心注解是 @SpringBootApplication。 @SpringBootApplication 是一…

【idea】 java: 找不到符号

idea 启动时提示 java: 找不到符号 java: 找不到符号 符号: 方法 getCompanyDisputeCount() 位置: 类型为com.yang.entity.AreaAnalyse的变量 areaAnalyse 在setting ——> Compiler ——>Shared build process VM options: 添加&#xff1a; -Djps.track.ap.dep…

Vue3<script setup>语法糖下,实现父子组件通信以及数据监听的三种方法。

在Vue3的script setup语法糖中&#xff0c;没有办法通过Vue2的ref、props、parent、中央时间总线等等众多方法&#xff0c;通过this指针简单的实现父子组件的通信&#xff0c;网络上也很少有关于script setup语法糖的相关教程&#xff0c;所以决定自己写一个详细教程&#xff0…

【算法|动态规划No.19】leetcode413. 等差数列划分

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

JAVA反序列化漏洞

JAVA反序列化漏洞 原文资料&#xff1a;xiu–》xiu博客 文章目录 JAVA反序列化漏洞idea类继承反序列化漏洞person类Test类 什么是反序列化漏洞 idea 类继承 public class Person {public int age;public String name;public void talk(){System.out.println("Person 说话…

RK3588 USB WIFI调试

一.安卓wifi框架 要使用一个wifi功能需要涉及的部分有内核部分wifi驱动&#xff0c;应用部分wpa_supplicant服务。其中wifi驱动又包含很多部分&#xff0c;分为通讯接口的驱动SDIO、USB、PCIE等&#xff0c;还有上下电部分的驱动&#xff0c;wifi模组提供部分的驱动。应用部分不…

random生成随机数的灵活运用

random返回的 [0,1) 之间的一个随即小数 思考&#xff1a;请写出获取 a-b 之间的一个随机整数&#xff0c;a,b均为整数&#xff0c;比如 a2 , b7 即返回一个数 x > [2,7]Math.random()*(b-a) 返回的就是 [0,b-a](int)(aMath.random()*(b-a1)) 》 (int)(2Math.random()*6) Ma…

常用傅里叶变换表

傅里叶展开 傅里叶变换 傅里叶逆变换 时域信号 弧频域信号 线性变换 时域平移 频域平移 伸缩变换 微分性质 逆变换的微分性质 卷积定理 原函数变换结果 单位阶跃函数&#xff1a; 符号函数&#xff1a; 矩形函数&#xff1a; 辛格函数&#xff1a;

系统架构师备考倒计时22天(每日知识点)

测试阶段划分 单元测试&#xff1a;依据详细设计&#xff0c;模块测试&#xff0c;模块功能、性能、接口等集成测试&#xff1a;依据概要设计&#xff0c;模块间的接口系统测试&#xff1a;依据需求文档&#xff0c;在真实环境下&#xff0c;验证完整的软件配置项能否和系统正…

了解变分自动编码器 (VAE)

一、介绍 在过去的几年中&#xff0c;由于&#xff08;并暗示&#xff09;该领域取得了一些惊人的进步&#xff0c;基于深度学习的生成模型引起了越来越多的兴趣。依靠大量的数据、精心设计的网络架构和智能训练技术&#xff0c;深度生成模型表现出了令人难以置信的能力&#x…

Active Session History (ASH) 读书笔记

本文为博文Active Session History (ASH)的读书笔记。 AWR&#xff0c;ADDM&#xff0c;SQL Trace是对过去事件的分析&#xff0c;[G]V$视图包含大量实时信息&#xff0c;但使用界面不友好&#xff0c;对初学者较难。因此Oracle 10g推出了ASH&#xff0c;属于Oracle Diagnosti…

Linux网络编程系列之UDP广播

一、什么是UDP广播 UDP广播是一种网络通信的方式&#xff0c;在广域网或局域网中&#xff0c;UDP广播可以向多个目标主机发送数据包&#xff0c;使得网络中的所有设备都能接收到广播消息。一定是采用UDP协议。 二、特性 1、面向无连接&#xff1a;UDP广播不需要建立连接&#…

PLC易学但是后期如何发展?

今日话题 PLC易学但是后期如何发展&#xff1f; PLC学习简便&#xff0c;但重要性不容小觑。除基础外&#xff0c;以下为几个技术方向&#xff1a; 大规模系统&#xff1a;包括冗余PLC、网络架构和服务器。掌握虚拟化、网络设计和模块化。 特色系统&#xff1a;如电力行业…

FastAdmin前台分片传输上传文件getshell

漏洞概述 FastAdmin框架存在有条件RCE漏洞&#xff0c;由于FastAdmin的前台文件上传功能中提供了分片传输功能, 但在合并分片文件时因对文件路径的拼接处理不当导致可上传任意文件。 漏洞复现 漏洞需要一个低权限的账号 所以我们需要在前台注册一个普通用户 注册成功后进行…

1. 树的建立与基本操作

程序的输入是一个表示树结构的广义表。假设树的根为 root &#xff0c;其子树森林 F &#xff1d; &#xff08; T1 &#xff0c; T2 &#xff0c; … &#xff0c; Tn &#xff09;&#xff0c;设与该树对应的广义表为 L &#xff0c;则 L &#xff1d;&#xff08;原子&#…

TLS/SSL 详解

目录 基础理论入门HTTPS对称加密非对称加密证书TLS握手过程握手总结 TLS 定义(记录层/握手层)HTTPS HTTP over TLS加密记录层分片 (Fragmentation)记录压缩和解压缩 (Record compression and decompression)空或标准流加密 (Null or standard stream cipher)CBC 块加密 (分组加…

NV21图片格式深入解析与代码实战-RGB转NV21与画框

1.NV21格式图片解析 NV21图像格式属于 YUV颜色空间中的YUV420SP格式 每四个Y分量共用一组U分量和V分量&#xff0c;Y连续排序&#xff0c;U与V交叉排序 重点总结 uv交错模式4Y共用一组uv(2个)大小&#xff1a;UV Y 的一半 排列方式如下 Y Y   Y Y   Y Y   Y Y Y Y   Y Y…

001数据安全传输-多端协议传输平台:Openssl安装和配置 - EVP代码测试

001数据安全传输-多端协议传输平台&#xff1a;Openssl安装和配置 - EVP代码测试 文章目录 001数据安全传输-多端协议传输平台&#xff1a;Openssl安装和配置 - EVP代码测试1. 安装1.1 windows下安装openssl1.2 Linux下安装OpenSSL 2. VS中使用openssl3. 测试 1. 安装 1.1 win…