32ADC模数转换器&AD单通道&多通道

目录

一.简介

二.逐次逼近法​编辑

三.结构框图

四.小tips

(1)转换模式

(2)触发控制

 (3)数据对齐

(4)转换时间

(5)校准

(6)硬件电路 

五.相关函数

六.代码实现

(1)单通道

(2)多通道


一.简介

数字电路只有高低电平,没有几伏电压的概念 

PWM就是DAC的功能,同时PWM只有完全导通和完全断开的两种状态,这两种状态都没有功率损耗

12位(0~2的12次方减1=0~4095),位数越高,量化结果就越精细,对应的分辨率就越高

1us对应AD转换频率为1MHz(最快),ADC转换的信号频率不要超过AD最快转换频率

温度传感器可以测量CPU的温度 

规则组:常规使用;注入组:用于突发事件

模拟看门狗可以检测某些通道,当AD值高于或低于设定的上阈值或低于下阈值时,就会申请中断执行对应的操作

二.逐次逼近法

三.结构框图

四.小tips

(1)转换模式

每次转换都需要进行触发,且要判断是否结束,并没有使用到列表

只用在最开始的时候进行触发,每次转换完成后立刻开始下一次转换,并没有使用到列表

扫描模式下,每个单独的通道转换完之后,不会产生标志位,也不会触发中断 

(2)触发控制

 

 (3)数据对齐

(4)转换时间

(5)校准

(6)硬件电路 

五.相关函数

问题: 

数值跳变得太剧烈、

解决:

(1)

施密特触发原理

(2)滤波,让AD值变得平滑

均值滤波,读取多个值,取平均值,作为滤波的AD值

(3)裁剪分辨率,去除数据的尾数

六.代码实现

(1)单通道

AD.c

#include "stm32f10x.h"                  // Device header
uint16_t i;
void AD_Init()
{GPIO_InitTypeDef GPIO_InitStructure;//必须要写在程序的开头位置ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC都是APB2上的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//在AIN模式下GPIO是无效的,专门为ADC服务//断开GPIO,防止GPIO的输入和输出对模拟电压造成干扰GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频设置ADC时钟,ADCCLK=12MHzADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//若想要在多个序列填充多个通道,可以复制19行进行填充,配置不同的采样时间ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//配置ADC独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//是否为扫描模式ADC_InitStructure.ADC_NbrOfChannel=1;//扫描模式下会用到的通道数目ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//配置成单次转换ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不使用外部触发源ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//开启ADC电源ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位校准完成后硬件自动置0ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)== SET);//校准完成后硬件自动置0}
uint16_t ADC_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发转换//软件触发在扫描连续转换模式,要放在ADC_Init结尾while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//软件触发在扫描连续转换模式,可以去除这一句//规则组或注入组完成时都会置1,可以由软件清除或由读取ADC_DR时清除//等待时间=68/12MHz=5.6us,68=55.5+12.5return ADC_GetConversionValue(ADC1);//读取ADC_DR}
float ADC_VA(uint16_t i)
{float Temp;i=ADC_GetValue();Temp = (float)i*3.3/(float)4095;return Temp;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "AD.h" 
uint16_t ADC_Value;
float VA;
int main()
{OLED_Init();AD_Init();OLED_ShowString(1,1,"ADC:");OLED_ShowString(2,1,"Va:0.00V");while(1){ADC_Value=ADC_GetValue();VA=ADC_VA(ADC_Value);OLED_ShowNum(1,5,ADC_Value,5);OLED_ShowNum(2,4,VA,1);OLED_ShowNum(2,6,(int)(VA*100)%100,2);}	
}

(2)多通道

多通道的实现最好采用DMA转运数据,但这里还没有学到,所以不采用真正的多通道实现

可以用单次转换,非扫描模式,每转换一个通道就用ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);

对通道进行更新,多次读值

AD.c

#include "stm32f10x.h"                  // Device header
uint16_t i;
void AD_Init()
{GPIO_InitTypeDef GPIO_InitStructure;//必须要写在程序的开头位置ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC都是APB2上的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//在AIN模式下GPIO是无效的,专门为ADC服务//断开GPIO,防止GPIO的输入和输出对模拟电压造成干扰GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频设置ADC时钟,ADCCLK=12MHz//若想要在多个序列填充多个通道,可以复制19行进行填充,配置不同的采样时间ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//配置ADC独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//是否为扫描模式ADC_InitStructure.ADC_NbrOfChannel=1;//扫描模式下会用到的通道数目ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//配置成单次转换ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不使用外部触发源ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//开启ADC电源ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位校准完成后硬件自动置0ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)== SET);//校准完成后硬件自动置0
}
uint16_t ADC_GetValue(uint8_t ADC_Channel)
{ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//规则组或注入组完成时都会置1,可以由软件清除或由读取ADC_DR时清除//等待时间=68/12MHz=5.6us,68=55.5+12.5return ADC_GetConversionValue(ADC1);//读取ADC_DR
}

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "AD.h" 
uint16_t AD1,AD2,AD3,AD4;
float VA;
int main()
{OLED_Init();AD_Init();OLED_ShowString(1,1,"AD1:");OLED_ShowString(2,1,"AD2:");OLED_ShowString(3,1,"AD3:");OLED_ShowString(4,1,"AD4:");while(1){AD1 = ADC_GetValue(ADC_Channel_0);AD2 = ADC_GetValue(ADC_Channel_1);AD3 = ADC_GetValue(ADC_Channel_2);AD4 = ADC_GetValue(ADC_Channel_3);OLED_ShowNum(1,5,AD1,5);OLED_ShowNum(2,5,AD2,5);OLED_ShowNum(3,5,AD3,5);OLED_ShowNum(4,5,AD4,5);Delay_ms(100);}	
}

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

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

相关文章

vue使用es的reduce方法编译报错Error: Can‘t resolve ‘core-js/modules/es.array.reduce.js‘

哈喽 大家好啊 最近在vue使用es的reduce方法编译报错Error: Cant resolve core-js/modules/es.array.reduce.js 报错如图所示: 解决方案: npm install --save core-js 然后重新编译下将正常了 参考原文: 使用import异步加载语法报错_module not foun…

Android Split APK介绍

文章目录 Split APKSplit APK 详细介绍概念Android App Bundle(AAB)Split APK 的优势动态分发减小安装包大小模块化和渠道分发 Split APK 的类型基于屏幕密度### 基于 CPU 架构基于语言 实现 Split APK Split APK Split APK 是 Android 中一种应用程序安…

SpringBoot实战第二天

今日战报 继续完善用户相关接口开发: 1.完成获取用户信息功能 2.完成更新用户信息功能 3.完成更新用户头像功能 4.完成更新用户密码功能 获取用户信息 接口文档 如接口文档所示,我们需要做的就是从header中的Authorization中读取token,解码…

问题:测风站应设置在平直的巷道中,其前后()范围内不得有障碍物和拐弯等局部阻力。 #微信#媒体

问题:测风站应设置在平直的巷道中,其前后()范围内不得有障碍物和拐弯等局部阻力。 参考答案如图所示

stable-diffusion | v1-5-pruned.ckpt和v1-5-pruned-emaonly.ckpt的区别

https://github.com/runwayml/stable-diffusion?tabreadme-ov-file#reference-sampling-script 对于 1.5 模型,其中可能包括四部分:标准模型、文本编码器、VAE模型、EMA模型。 标准模型:生成图片的核心模块,潜空间中的前向扩散和…

【lesson32】MySQL用户管理

文章目录 用户管理介绍用户用户信息创建用户 删除用户修改用户密码数据库的权限给用户授权回收权限 用户管理介绍 用户 用户信息 MySQL中的用户,都存储在系统数据库mysql的user表中 //操作语法 mysql> use mysql; Database changed mysql> select host,use…

VR全景技术可以应用在哪些行业,VR全景技术有哪些优势

引言: VR全景技术(Virtual Reality Panorama Technology)是一种以虚拟现实技术为基础,通过360度全景影像、立体声音、交互元素等手段,创造出沉浸式的虚拟现实环境。该技术不仅在娱乐领域有着广泛应用,还可…

Git使用命令大全

命令大全参考阮一峰的博客,根据自己的使用习惯作了调整。 Git常用命令 其他常用的命令 配置Git # 显示当前的Git配置 $ git config --list# 编辑Git配置文件 $ git config -e [--global]# 设置提交代码时的用户信息 $ git config [--global] user.name "[nam…

第14章_视图

第14章_视图 1.常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录数据字典就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护, 程序员通常不…

MDK Keil uVision5 cannot read project file 解决办法

MDK Keil uVision5 cannot read project file 解决办法 问题描述 我的系统重装过后是英文版的Windows 10,在打开别人/以前中文系统环境下保存的Keil Project文件(uvprojx文件)会报错,内容大致是 Cannot read project file D:\xx…

十、VTK创建圆锥体vtkConeSource 带颜色

为圆锥体的每一面,添加一种颜色: 上述效果的代码: #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkLine.h> #include <vtkPolyData.h> #include <vtkPolyDataWriter.h> #include <vtkPolyDataMapper.h> #incl…

机器学习复习(6)——numpy的数学操作

加减法运算 # 创建两个不同的数组 a np.arange(4) #list(0,1,2,3 b np.array([5,10,15,20]) # 两个数组做减法运算 b-a 运行结果&#xff1a; 计算数组的平方 #b*2代表数组b每个元素乘以2 #b**2代表数组b每个元素的2次方 b**2 运行结果&#xff1a; 计算数组的正弦值 #…

Java 数据结构 二叉树(二)红黑树

目录 数据结构图-树 简介 规则 旋转 重新着色 红黑树构建过程 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xf…

UnityShader(十五)纹理的属性

目录 面板属性&#xff1a; 多级渐远纹理技术&#xff08;mipmapping&#xff09; Filter Mode&#xff08;滤波模式&#xff09; 面板属性&#xff1a; 在Unity中导入一些纹理资源后可以在它的材质面板上调整其属性 如图&#xff1a; 在这个面板上有许多可以调整的属性&am…

西瓜书学习笔记——核化线性降维(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 核化线性降维是一种使用核方法&#xff08;Kernel Methods&#xff09;来进行降维的技术。在传统的线性降维方法中&#xff0c;例如主成分分析&#xff08;PCA&#xff09;和线性判别分析&#xff08;LDA&#xff09;&#xff0c;数据被映…

C++学习Day03之构造函数的调用规则

目录 一、程序及输出1.1 编译器会给一个类 至少添加3个函数1.2 自己提供了 有参构造函数1.3 自己提供了 拷贝构造函数 二、分析与总结 一、程序及输出 1.1 编译器会给一个类 至少添加3个函数 编译器会给一个类 至少添加3个函数 默认构造&#xff08;空实现&#xff09; 析构函…

ACM训练题:曲线

这题只需要注意一个点&#xff0c;就是所有二次函数的二次系数都是大于0的&#xff0c;这说明这是个下凸函数&#xff0c;而且最小值旁边都是单调的&#xff0c;对于求区间凸函数极值问题&#xff0c;套三分模板即可。 AC代码&#xff1a; #include<bits/stdc.h> usin…

2023年全球软件开发大会(QCon上海站2023):核心内容与学习收获(附大会核心PPT下载)

在信息化和全球化日益加速的今天&#xff0c;软件开发技术日新月异&#xff0c;对全球各行各业产生了深远影响。2023年全球软件开发大会&#xff08;QCon上海站2023&#xff09;无疑成为行业内外瞩目的焦点。本次大会汇集了全球顶级的软件开发专家、企业领袖、研究者&#xff0…

cesium-加载谷歌影像

cesium在开发的时候有可能会加载不同的影像&#xff0c;今天就先看一下加载谷歌的吧。 使用谷歌有个好处就是基本不会出现此区域无卫星图的情况 闲言话语不多说&#xff0c;看代码 <template><div id"cesiumContainer" style"height: 100vh;"&g…

力扣题目训练(7)

2024年1月31日力扣题目训练 2024年1月31日力扣题目训练387. 字符串中的第一个唯一字符389. 找不同401. 二进制手表109. 有序链表转换二叉搜索树114. 二叉树展开为链表52. N 皇后 II 2024年1月31日力扣题目训练 2024年1月31日第七天编程训练&#xff0c;今天主要是进行一些题训…