GD32F103VE使用软件扫描读取多通道AD值

news2024/11/22 21:09:15

GD32F103VE使用软件扫描读取多通道AD值。

GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中;

模拟输入通道:
16个外部模拟输入通道;
1个内部温度传感器通道(Vsense)
1个内部参考电压输入通道(VrefInt)

ADC的VDDA电源引脚需要接入3.3V;
ADC输入模拟量的范围:Vref- 至Vref+之间;

注意:ADC同时使用"规则组通道"和"注入组通道",则"注入组通道"的采样周期不能1.5和7.5个采样周期;

ADC0_CH16为温度传感器通道,Internal temperature sensor output voltage;
ADC0_CH17为内部参考电压通道,Internal voltage reference output voltage;
Vref-引脚必须连接至VSSA引脚,Vref+连接到VDDA,但在64脚以下的CPU(含64脚),其Vref+和Vref-已经在内部连接至VDDA和VSSA;
注意:ST和GD的手册里都写着不同芯片最大偏差45度

#include "ADC.h"
#include "delay.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

/*
GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中;

模拟输入通道:
16个外部模拟输入通道;
1个内部温度传感器通道(Vsense)
1个内部参考电压输入通道(VrefInt)

触发转换:
软件触发;
硬件触发;

转换模式:
单通道转换或多通道扫描转换;
单次模式,选择指定的模拟输入通道后,触发一次,则转换一次;
连续模式,选择指定的模拟输入通道后,连续进行AD转换;用于DMA
同步模式,当同时使用ADC0,ADC1和ADC2时,这3个设备就可以同时进行AD转换;
间断模式;

ADC的VDDA电源引脚需要接入3.3V;
ADC输入模拟量的范围:Vref- 至Vref+之间;

ADC_RSQ0~ADC_RSQ2寄存器规定了"规则组通道"的选择;
ADC_RSQ0的RL[3:0]用来指定"规则通道组"转换序列的长度,即"规则通道组"选择;
连续进行AD转换的通道总数为(RL[3:0]+1),在DMA传输中要知道有多少个通道参与AD转换

ADC_ISQ寄存器规定了"注入组通道"的选择;
ADC_ISQ0的IL[3:0]用来指定"整个注入通道组"转换序列的长度,即"规则通道组"选择
连续进行AD转换的通道总数为(IL[3:0]+1),在DMA传输中要知道有多少个通道参与AD转换

注意:ADC同时使用"规则组通道"和"注入组通道",则"注入组通道"的采样周期不能1.5和7.5个采样周期;

ADC0_CH16为温度传感器通道,Internal temperature sensor output voltage;
ADC0_CH17为内部参考电压通道,Internal voltage reference output voltage;
Vref-引脚必须连接至VSSA引脚,Vref+连接到VDDA,但在64脚以下的CPU(含64脚),其Vref+和Vref-已经在内部连接至VDDA和VSSA;
注意:ST和GD的手册里都写着不同芯片最大偏差45度
*/

void InternalTemperatureSensor_Init(void);
void Read_TemperatureValue(void);
void Read_InternalVoltageValue(void);

uint16_t ADC_Read(uint8_t channel);

void InternalTemperatureSensor_Init(void)
{
	rcu_periph_clock_enable(RCU_ADC0);//使能ADC0时钟
  rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
	//配置ADC时钟8分频
	//由于ADC最大时钟频率为14MHz,经过8分频后,变为1.75MHz

	adc_tempsensor_vrefint_enable();
	//channel 16 and 17 enable of ADC0 
	//使能温度传感器通道和内部参考电压通道
    
//ADC工作模式配置//
	adc_mode_config(ADC_MODE_FREE);//只使用一个ADC,属于独立模式
  adc_special_function_config(ADC0,ADC_SCAN_MODE,ENABLE);//若ADC0使用的是多通道,则配置ADC0为扫描模式
//	adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);//若ADC0使用的是单通道,则配置ADC0为连续转换模式
	adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);//ADC转换结果转换右对齐
	adc_channel_length_config(ADC0,ADC_REGULAR_CHANNEL,1);
	//连续进行AD转换的通道总数为1,在DMA传输中要知道有多少个通道参与AD转换
	//只扫描一个通道
  adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
	//使用软件触发AD转换
	adc_external_trigger_config(ADC0,ADC_REGULAR_CHANNEL,ENABLE);
	//使能ADC规则通道组外部触发,enable ADC regular channel group external trigger

  adc_enable(ADC0);//使能ADC0
	delay_ms(10);     //等待1ms
	adc_calibration_enable(ADC0);//等待ADC0校准完成
}

//函数功能:读取ADC0通道号为channel的AD值
uint16_t ADC_Read(uint8_t channel)
{
	uint16_t adcValue = 0;

  adc_regular_channel_config(ADC0,0,channel,ADC_SAMPLETIME_239POINT5);
	//将ADC0中channel通道放在第0位置优先进行AD转换,采样时间为239.5个时钟周期

  adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);
	//触发ADC0设备执行1次AD转换
	while(!adc_flag_get(ADC0,ADC_FLAG_EOC))//等待"ADC0转换标志"建立
	{
	}
	adc_flag_clear(ADC0, ADC_FLAG_EOC);//清除"ADC0转换标志"
	adcValue = adc_regular_data_read(ADC0);//读取ADC0数据

	return adcValue;
}

/*
温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25
V25 = VSENSE在25°C时的数值,这里取1.43V
Avg_Slope = 温度与VSENSE曲线的平均斜率,4.3mV/°C
即:(1.43 - voltage) / 0.0043 + 25;
*/
void Read_TemperatureValue(void)
{
	float f;
	uint16_t tmp;

	tmp = ADC_Read(ADC_CHANNEL_16);  //读取ADC0通道16的AD值
	printf("\r\nADC0_16: %d ", tmp);
	f = tmp;f = f	* 3.3;f = f / 4096;  //转换成电压值单位为V
	printf("\r\nADC0_16_Voltage: %0.3fV", f);
	f = V25 -f;f =f / AvgSlope;f= f+25; //计算温度值
	printf("\r\nTmoerature: %0.1f\r\n", f);
}

void Read_InternalVoltageValue(void)
{
	float f;
	uint16_t tmp;

	tmp = ADC_Read(ADC_CHANNEL_17);  //读取ADC0通道17的AD值
	printf("\r\nADC0_17: %d ", tmp);
	f = tmp;f = f	* 3.3;f = f / 4096;  //转换成电压值单位为V
	printf("\r\nInternalVoltage: %0.3fV\r\n", f);
}
#ifndef __ADC_H
#define __ADC_H

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t

#define V25       1.430   //V
#define AvgSlope  0.0043  //V/°C


extern void InternalTemperatureSensor_Init(void);
extern void Read_TemperatureValue(void);
extern void Read_InternalVoltageValue(void);

#endif

main.c如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "delay.h"

#include "UART3.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "ADC.h"

uint16_t volValue = 0;

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{
	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"

  delay_init();
  INTX_ENABLE();//开启所有中断
	UART3_Init(115200);//初始化UART3
	printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"

	InternalTemperatureSensor_Init();
	while(1)
	{
    Read_TemperatureValue();
    Read_InternalVoltageValue();
    delay_ms(500);
	}
}

 

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

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

相关文章

Algorithem Review 5.2 图论

网络流 设源点为 s s s,汇点为 t t t,每条边 e e e 的流量上限为 c ( e ) c(e) c(e),流量为 f ( e ) f(e) f(e)。割 指对于某一顶点集合 P ⊂ V P \subset V P⊂V,从 P P P 出发指向 P P P 外部的那些原图中的边的集合&a…

WMS系统出库操作规范:提高效率与准确性的关键

WMS系统出库管理是指通过仓库管理系统(Warehouse Management System,简称WMS)对仓库中的货物进行出库操作的管理过程。WMS系统是一种利用自动化和数字化技术提高仓库管理效率和准确性的工具,它提供了对仓库内货物的全面控制和可视…

CentOS7源码安装MySQL详细教程

😊 作者: Eric 💖 主页: https://blog.csdn.net/weixin_47316183?typeblog 🎉 主题:CentOS7源码安装MySQL详细教程 ⏱️ 创作时间: 2023年08月014日 文章目录 1、安装的四种方式2、源码安装…

selenium的环境搭建

selenium是一个自动化测试框架,主要针对web项目进行UI自动化。他的工作原理如下图: 那么我们在学习selenium之前就需要就行一个环境的搭建,就是要下载配置我们的浏览器驱动。进入正题: CNPM Binaries Mirror 在网站中选择对应自…

五种方法,教你如何在Mac上查看文件完整路径

在MacOS上,Finder显示文件默认是不带路径展示的,你进入某个文件夹只会显示文件夹的名称而已,如下图: 那如何获取或者显示文件的完整路径呢?在MacOS中有五种方法可以显示文件完整路径。 第一种:使用【终端】…

go入门实践四-go实现一个简单的tcp-socks5代理服务

文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后&#…

excel填数据转json格式

定制化比较严重,按需更改 excel文件如下 代码 # -*- coding: utf-8 -*- import oss2 import shutil import sys import xlwt import xlrd import json from datetime import datetime, timedeltafile1 "C:\\Users\\cxy\\Desktop\\generate.xls" #打开表…

【Spring专题】手写简易Spring容器过程分析——引导篇

目录 前言说在前面阅读准备 思路整理手写源码示例一、手写前的准备1.1 注解1.2 测试Bean1.3 调用实例 二、构造方法(构建基本流程)三、实现scan()方法3.1 doGetScanPackage():获取扫描路径3.2 doLoadClassFromDiskAndScan():从电脑…

【100天精通python】Day34:使用python操作数据库_ORM(SQLAlchemy)使用

目录 专栏导读 1 ORM 概述 2 SQLAlchemy 概述 3 ORM:SQLAlchemy使用 3.1 安装SQLAlchemy: 3.2 定义数据库模型类: 3.3 创建数据表: 3.4 插入数据: 3.5 查询数据: 3.6 更新数据: 3.7 删…

24届最新计算机毕业设计选题推荐 -计算机专业毕业设计题目参考大全

大家好,我们是竹林可以(计算机毕ye设ji代做团队),大四的同学马上要开始毕业设计开题啦,大家要好好准备哦。 学长学姐们给大家详细整理了计算机毕设最新选题,我们专注毕ye设ji多年,积累了丰富的…

【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍登场角色应用场景 案例实现案例一类图实现 案例二:借贷平台源码剖析传统方式实现分析状态修改流程类图实现 案例三:金库警报系统系统的运行逻辑伪代码传统实现方式使用状态模式 类图实现分析问题问题一问题二 总结文章说明…

element-ui的el-dialog,简单的封装。

el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子,用一个变量控制是否显示,再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量,甚至关闭之后还要清空一些变量,应该可以简化一点。我写…

数据结构:力扣OJ题(每日一练)

目录 题一:环形链表 思路一: 题二:复制带随机指针的链表 思路一: 本人实力有限可能对一些地方解释的不够清晰,可以自己尝试读代码,望海涵! 题一:环形链表 给定一个链表的头节点…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具,报表就只是报表,而奥威BI数据可视化工具,一张报表就约等于一个平台,可随时展开多维动态自助分析,按需分析,立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…

Camtasia2023最新专业的电脑屏幕录制和视频剪辑软件

Camtasia专业的屏幕录制和视频剪辑软件3000多万专业人士在全球范围内使用Camtasia展示产品,教授课程,培训他人,以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和!Camtasia是一款功能强大的屏幕录制和视频编辑软件…

办理流量卡也是有条件的,这五种情况就不能办理流量卡!

流量卡资费虽然便宜,但也不是谁都可以办得,以下这几种情况是办不了的! 看到网上的流量卡资费便宜,也想随手申请一张,别想得太简单了,流量卡也不是那么好办理的,换句话来讲,办理流量…

【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

云原生时代下的Java"拯救者" 在云原生时代,其实Java程序是有很大的劣势的,以最流行的spring boot/spring cloud微服务框架为例,启动一个已经优化好,很多bean需要lazy load的application至少需要3-4秒时间,内…

Chrome小技巧---多用户登录同一网站不串信息

测试中经常需要用到浏览器需要登录多个账号 但是有一个问题就是会串号 通过添加不同的用户再用这用户登录,就不串号了: 还可以在浏览器的偏好设置中添加启动地址 这样每次打开,就进到设置的地址中了

如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库

数据库操作一直是一个比较敏感的话题,动不动“删库跑路”,可见数据库操作对于一个项目而言是非常重要的,我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库,而你们刚好使用的是阿里云的Mongodb,那么这篇文章…

用ThreadLocal做链路追踪(演变升级版)

前言 1、ThreadLocal是线程变量,线程之间彼此隔离,天生线程安全。因为它是跟着线程走的,考虑到这点,它很适合做链路追踪(TraceId) 2、当我们写的接口接收到其它地方(可能是前端、也可能是其它服…