STM32 ADC

2023-10-30

1.什么是ADC
ADC指模数转换,模拟信号是指时间幅值均连续的信号,对其采样后得到的信号称之为离散时间信号,若再对其进行量化处理则得到数字信号。请注意对模拟信号采样得到的信号不是数字信号,仅仅是离散时间信号。(详情请见数字电子电路,信号与系统,数字信号处理等教材)

2.分辨率
当前的STM32的ADC芯片是12位的,如果参考电压是3.3v那就是说最小量化间隔就是3.3的4096分之一,如果变化量低于一个最小量化间隔则在量化时相对于上一刻无变化。故3.3的4096分之一就是STM32的ADC的分辨率。

3.连续转换,单次转换,扫描模式
一个ADC控制器最多有18个通道,在非扫描模式下是对一个通道进行转换,如果是的单次转换则会在EOC之后停止转换直到再次被触发,如果是连续转换则在一次EOC后立刻进行下次转换;如果是扫描模式则是多多通道进行转换,比如有10个通道,按照顺序依次转换,十个通道均转换完成后视其是单次转换模式还是连续转换模式,如果是连续转换模式则立即进行下一轮转换,如果是单次转换则等待下次触发。

注:扫描模式下每完成一个通道的转换都会把对应通道的EOC标志置位,但EOC中断是在整个一轮转换都完成后触发。规则组通道的数据在ADC_DR寄存器内,注入组的数据在ADC_DRJ寄存器内。如果设置了DMA的位则会在每次转换完成后把规则组的数据传入SRAM,注入组的仍然在ADC_DRJ寄存器内。

4.举例:用ADC测量3.3v电压(即参考电压)
配置:单通道单次转换。(虽然是单次转换也可以搞出连续转换的效果)

//1.main.c
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "adc.h"
#include "usart.h"
int main()
{
	u16 temp;
	float val;
	delay_init();
	my_adc_init();
	uart_init(115200);
	while(1)
	{
		temp=adc_get_val();
		val=(3.3/4096)*temp;
		printf("ADC:%d  转换值:%f\n",temp,val);
		delay_ms(1000);
	}
}
//2.ADC.C
#include "adc.h"
#include "stm32f10x.h"
	void my_adc_init()
	{
		ADC_InitTypeDef ADC_InitType;
		GPIO_InitTypeDef GPIO_InitType;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
		
		GPIO_InitType.GPIO_Mode=GPIO_Mode_AIN;
		GPIO_InitType.GPIO_Pin=GPIO_Pin_1;
		GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
		GPIO_Init(GPIOA,&GPIO_InitType);
		
		RCC_ADCCLKConfig(RCC_PCLK2_Div6);
		ADC_DeInit(ADC1);
		
		ADC_InitType.ADC_ContinuousConvMode=DISABLE;//单次转换
		ADC_InitType.ADC_DataAlign=ADC_DataAlign_Right;
		ADC_InitType.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
		ADC_InitType.ADC_Mode=ADC_Mode_Independent;
		ADC_InitType.ADC_NbrOfChannel=1;
		ADC_InitType.ADC_ScanConvMode=DISABLE;//不开启扫描模式
		ADC_Init(ADC1,&ADC_InitType);
		
		ADC_Cmd(ADC1,ENABLE);
		
		ADC_ResetCalibration(ADC1);//复位校准
		while(ADC_GetResetCalibrationStatus(ADC1));
		
		ADC_StartCalibration(ADC1);//AD校准
		while(ADC_GetCalibrationStatus(ADC1));
		
	}
	
	u16 adc_get_val()
	{
		ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
		ADC_SoftwareStartConvCmd(ADC1,ENABLE);
		
		while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
		ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除或不清除都不影响,但如果是中断标志位的话必须清除
		return ADC_GetConversionValue(ADC1);
	}
	
	
//3.ADC.h
#ifndef adc_h
	#define adc_h
	#include "stm32f10x.h"
	void my_adc_init();
	u16 adc_get_val();
	
#endif

结果:
在这里插入图片描述
这里使用的是PA1,在PA1悬空时可以看到结果是飘忽不定的,当PA1接3.3v时转换结果几乎就是3.3,接地是基本就是0。

5.为什么单次转换能够连续工作:
奥秘在于adc.c下的adc_get_val()函数。该函数是在main.c的while循环里被调用的,每调用一次就会设置一次规则通道配置以及软件触发转换使能
在这里插入图片描述
如果把这两行放到my_adc_init()里面执行就是转换一次就停止了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 ADC 的相关文章

  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • 算法-树结构

    算法 树结构 一 概述 一维结构 数组 链表 跳表 栈 队列等 这些结构都是 线性存储结构 二维结构 树 图 是一种非线性存储结构 存储的是具有 一对多 关系的数据元素的集合 树 Tree 结点 使用树结构存储的每一个数据元素都被称为 结点
  • ubuntu下安装NerdTree和动态语法检测工具ALE

    1 文件浏览插件NerdTree的安装 1 NerdTree的安装 在 vimrc文件中添加 Plugin scrooloose nerdtree 然后重启Vim 输入并运行命令 PluginInstall 完成安装 2 配置NerdTre
  • 微信小程序之摇骰子源代码分享

    通过这个案例你可以知道 按钮事件 切换image图片 陀螺仪事件 与按钮事件逻辑相同 啥者不用说了 直接上代码 https github com lzc alioo weiapp2 备注 图片是网上百度的 不够好 有小伙伴有好图片替换的话欢
  • springboot+mina框架服务端的实现(一) ------ pom依赖、mina配置类、自定义协议以及编解码器的实现

    来吧 一步一步搭建mina服务端 原理往后再说 参考博客 矢落叶 博客 首先利用springboot的插件新建一个maven项目 一 pom xml 所需依赖 首先加入mina核心依赖
  • 【教程】在VSCode中使用码云进行代码管理

    教程 在VSCode中使用码云进行代码管理 前言 本教程核心内容 本文主要是整合了网上教程 从Git安装开始 配置关联本地仓库到码云 最终用上VScode这个流程 非常基础和简单 照着操作就行了 起因 平时常写python脚本 原先用Sub
  • 因果推断总结

    目录 因果关系的三个层级 因果推断的三个假设 因果性的常见谬误 因果推断偏差原因 因果推断的两种流派 因果推断前提假设 因果推断的方法与实操流程 因果关系的三个层级 因果推断是基于统计学方法刻画变量之间的因果关系 因果关系存在三个层级 第一
  • Java堆,方法区,直接内存

    Java的内存区中 为线程共有的有三部分 Java堆 方法区 直接内存 其中方法区中包含运行时常量池 直接内存并不属于Java的常规内存区 1 Java堆是被所有线程共享的一块内存 在启动虚拟机时创建 通常 所有的对象实例及数组都要在堆上分
  • [pytorch报错]ValueError: num_samples should be a positive integer value, but got num_samples=0

    项目场景 在mmeg中运行自定义数据集报错情况 问题描述 运行代码后 mmSeg提示说 2021 12 08 18 39 33 991 mmseg INFO Loaded 0 images 说明模型没有加载数据 数据地址出错 报错信息 Fi
  • 轮胎的魔术公式(Magic Fomula)模型

    本篇结合Adams中的TR rear pac89 tir文件 介绍一下魔术公式的基本知识 使用魔术公式的轮胎模型主要有Pacejka 89 Pacejka 94 MF Tyre MF Swift四种 1 Pacejka 89和 94轮胎模型
  • java常用框架总结

    今天想看看现在常用的框架有哪些 发现网上文章不多决定根据自己的理解写一篇文章 如有错误希望大家包涵 1 java的5大框架 springboot都不说了 网上资料很多 2 缓存工具 Ehcache redis 3 消息队列中间工具 Rabb
  • 层次聚类AgglomerativeClustering()树形图可视化与children_属性解析

    层次聚类函数AgglomerativeClustering 我们主要来讲解层次聚类的可视化画图和层次聚类后返回的children 属性 children 属性的理解需要借助可视化图形 1 层次聚类的可视化画图 1 1步骤 step1 使用
  • Linux中修改jar包中的文件内容

    1 命令行中输入vim jar包路径 2 回车 打开jar包中的文件目录 并定位到要修改的文件位置 3 回车 打开文件内容进行修改 4 修改后 Ctrl wq保存退出上步 再次Ctrl q退出 完成修改
  • 计算机二级页表页框大小,两级页表

    本文是在基本分页存储管理的基础上对分页管理的优化 在上篇文章中说到 操作系统会为每个进程建立一张页表 实现页号和内存块号之间的对应关系 本文从单级页表存在的问题引出两级页表 以及两级页表如何实现地址的变换 1单级页表存在的问题 假设某计算机
  • 两层和三层的讨论

    下面的东西都是转贴的 包括那个声明 都跟我没关系 google搜出来的 在这之前我的确觉得DataSetProvider ClientDataSet和我理解中的三层有点差别 看完这些讨论 我的结论是 DataSetProvider Clie
  • 2023华为OD机试真题-跳格子2JAVA、Python、C++)

    题目描述 小明和朋友玩跳格子游戏 有 n 个连续格子组成的圆圈 每个格子有不同的分数 小朋友可以选择从任意格子起跳 但是不能跳连续的格子 不能回头跳 也不能超过一圈 给定一个代表每个格子得分的非负整数数组 计算能够得到的最高分数 输入描述
  • BFS常见模板题(初学BFS推荐,附例题由浅入深)

    BFS类题目 主要考查对广度搜索的理解 BFS相比于暴力枚举来说效率更高 BFS只要将范围矩阵扫一次即可得出答案 本文通过队列来实现求解 当然也可以用其他方式实现广度搜索 First question 馋嘴羊 BFS思路 可能会比较抽象 建
  • 图论之Dijkstra

    Dijkstra模板 include
  • JavaScript V8 > 牛客OJ在线编程常见输入输出练习场

    C 处理输入输出 牛客OJ在线编程常见输入输出练习场 A A B 1 B A B 2 C A B 3 D A B 4 E A B 5 F A B 6 G A B 7 H 字符串排序 1 I 字符串排序 2 J 字符串排序 3 牛客OJ在线编
  • C语言函数大全-- _w 开头的函数(4)

    w 开头的函数 4 1 wstrtime 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 wstrtime s 2 1 函数说明 2 2 演示示例 2 3 运行结果 3 wsetlocale 3 1 函数说明 3 2 演示示例 3
  • STM32 ADC

    1 什么是ADC ADC指模数转换 模拟信号是指时间幅值均连续的信号 对其采样后得到的信号称之为离散时间信号 若再对其进行量化处理则得到数字信号 请注意对模拟信号采样得到的信号不是数字信号 仅仅是离散时间信号 详情请见数字电子电路 信号与系