stm32之ADC

ADC是什么?模拟数字转换器(Analog-to-Digital Converter)。

一、ADC概述

        stm32f013c8t6有两个ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道、2个内部通道(温度传感器、内部参考电压)。实际stm32f013c8t6只有10个通道(IN0-IN9)+ 2个内部通道。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。

        ADC的输入时钟不得超过14MHz(常用12MHz),它是由PCLK2经分频产生。

1.1、电压输入范围

        ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-VREF+ VDDA VSSA、这四个外部引脚决定。一般把 VSSA VREF- 接地,把 VREF+ VDDA 3V3,得到 ADC 的输入电压范围为:0~3.3V

1.2、通道

外部的 16 个通道在转换时又分为规则通道注入通道,其中规则通道最多有 16 路,注入通道最多
4 路。
规则通道: 规则通道就是很规矩的意思,常用的就是规则通道
注入通道: 可以理解为VIP,有特权的人,可以插队

1.3、转换顺序

        每个ADC 只有一个数据寄存器(DR), 16 个通道一起共用这个寄存器,所以需要指定规则转换通道的转换顺序。规则通道中的转换顺序由三个寄存器控制:SQR1 SQR2 SQR3 ,它们都是 32 位寄存器。 SQR 寄存器控制着转换通道的数目和转换顺序,只要在对应的寄存器位SQx 中写入相应的通道,这个通道就是第x 个转换。
注入通道的转换顺序也是通过注入寄存器来控制

1.4、触发源

        ADC 转换可以由 ADC_CR2(控制寄存器) 的 ADON 这个位来控制,写 1 的时候开始转换,写 0 的时候停止转换。
        ADC 还支持触发转换,这个触发包括内部定时器触发和外部 IO 触发。具体选择哪一种触发源,由 ADC_CR2(控制寄存器 ) 的 EXTSEL[2:0] JEXTSEL[2:0] 位来控制

1.5、转换时间

       ADC是挂载在APB2总线(PCLK2)上的,经过分频器得到ADC时钟(ADCCLK),最高 14 MHz

转换时间  采样时间  + 12.5 个周期
 12.5 个周期是固定的,一般我们设置 PCLK2=72M ,经过 ADC 预分频器能分频到最大的时钟只能
12M ,采样周期设置为 1.5 个周期,算出最短的转换时间为 1.17us

 

1.6、数据寄存器

规则组的数据放在 ADC_DR 寄存器, 注入组的数据放在 JDRx

1.7、模式

扫描模式
关闭:只转换 ADC_SQRx ADC_JSQR 选中的第一个通道
打开:扫描所有被 ADC_SQRx ADC_JSQR 选中的所有通道
单次转换:
        ADC只执行一次转换。该模式既可通过设置 ADC_CR2 寄存器的 ADON ( 只适用于规则通道) 启动也可通过外部触发启动 ( 适用于规则通道或注入通道 ) ,这时 CONT 位为 0 。 一旦选择通道的转换完成:
● 如果一个规则通道被转换:
        ─ 转换数据被储存在 16 ADC_DR 寄存器中
        ─ EOC( 转换结束 ) 标志被设置
        ─ 如果设置了 EOCIE ,则产生中断。
● 如果一个注入通道被转换:
        ─ 转换数据被储存在 16 位的 ADC_DRJ1 寄存器中
        ─ JEOC( 注入转换结束 ) 标志被设置
        ─ 如果设置了 JEOCIE 位,则产生中断。
连续转换:转换一次之后,立马进行下一次转换,此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。每个转换后:
● 如果一个规则通道被转换:
        ─ 转换数据被储存在 16 位的 ADC_DR 寄存器中
        ─ EOC( 转换结束 ) 标志被设置
        ─ 如果设置了 EOCIE ,则产生中断。
● 如果一个注入通道被转换:
        ─ 转换数据被储存在 16 位的 ADC_DRJ1 寄存器中
        ─ JEOC( 注入转换结束 ) 标志被设置
        ─ 如果设置了 JEOCIE 位,则产生中断

二、单规则通道 case

完整代码
描述: PA0(ADC通道0) 接入MQ2(烟雾传感器)的A0口,然后通过串口打印出来
CubeMX主要配置:
main函数主要代码如下:
int main(void)
{uint32_t result;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();MX_USART1_UART_Init();while (1){HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, 50);result = HAL_ADC_GetValue(&hadc1);printf("result = %f\r\n", 3.3/4096 * result);HAL_Delay(500);}
}

2.1、 MX_ADC1_Init

主要是来装配数据,并初始化,两个主要的步骤是HAL_ADC_InitHAL_ADC_ConfigChannel

void MX_ADC1_Init(void)
{ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = DISABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;// adc 通用配置if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}// 规则通道配置sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}}

2.2、HAL_ADC_Init

2.3、HAL_ADC_ConfigChannel

2.4、HAL_ADC_Start

2.5、HAL_ADC_PollForConversion

以上函数暂时不分析了,等有时间再处理,ADC代码太长了。。。

三、双规则通道 case

完整代码
描述:
PA0(ADC通道0) 接入MQ2(烟雾传感器)的A0口,然后通过串口打印出来
PA1(ADC通道1) 接入轨迹检测传感器(烟雾传感器)的A0口,然后通过串口打印出来
CubeMX主要配置:
主要代码如下:
int main(void)
{uint32_t result;uint32_t result1;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();MX_USART1_UART_Init();HAL_ADCEx_Calibration_Start(&hadc1);while (1){HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, 50);result = HAL_ADC_GetValue(&hadc1);HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, 50);result1 = HAL_ADC_GetValue(&hadc1);printf("result = %f\r\n", 3.3/4096 * result);printf("result1 = %f\r\n", 3.3/4096 * result1);HAL_ADC_Stop(&hadc1);HAL_Delay(1000);}
}

四、双规则通道 case(关闭扫描模式)

完整代码

核心代码如下

uint16_t ADC_Read(uint32_t Channel)
{ADC_ChannelConfTypeDef sConfig = {0};sConfig.Channel = Channel;                                         /* 通道 */sConfig.Rank = ADC_REGULAR_RANK_1;                              sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;                  /* 采样时间 */if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)             {Error_Handler();}HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);return (uint16_t)HAL_ADC_GetValue(&hadc1);
}while (1){result = ADC_Read(ADC_CHANNEL_0);result1 = ADC_Read(ADC_CHANNEL_1);printf("result = %f\r\n", 3.3/4096 * result);printf("result1 = %f\r\n", 3.3/4096 * result1);HAL_Delay(1000);}

五、注入通道

待补充

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

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

相关文章

【Cpp】位图Bitmap

code #include <iostream> #include <vector> #include <stdio.h> #include <stdint.h>class Bitmap { private:std::vector<uint8_t> data; // 存储位图数据的字节数组uint32_t size; // 位图的大小&#xff08;以位为单位&#x…

大数据从入门到精通(超详细版)之Hive的案例实战,ETL数据清洗!!!

前言 嗨&#xff0c;各位小伙伴&#xff0c;恭喜大家学习到这里&#xff0c;不知道关于大数据前面的知识遗忘程度怎么样了&#xff0c;又或者是对大数据后面的知识是否感兴趣&#xff0c;本文是《大数据从入门到精通&#xff08;超详细版&#xff09;》的一部分&#xff0c;小…

基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、图像数据传输 4.2、直方图统计算法 4.3、时序控制和电路设计 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescal…

使用 PyTorch 的计算机视觉简介 (5/6)

一、说明 本文主要介绍CNN中在pytorch的实现&#xff0c;其中VGG16网络&#xff0c;数据集来源&#xff0c;以及训练过程&#xff0c;模型生成和存储&#xff0c;模型调入等。 二、预训练模型和迁移学习 训练 CNN 可能需要大量时间&#xff0c;并且该任务需要大量数据。但是&am…

Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例

Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例 第18章-Qt MyselfQQ18.1 概述18.2 、发送文件18.3 、接收文件18.4 、保证传输的安全和稳定18.5 、总结 本章相关例程源码下载1.Qt5开发及实例_CH1801.rar 下载 第18章-Qt MyselfQQ 18.1 概述 MyselfQQ是一个基于Qt5框架开发的轻量…

如何快速走出网站沙盒期(关于优化百度SEO提升排名)

网站沙盒期是指新建立的网站在百度搜索引擎中无法获得好的排名&#xff0c;甚至被完全忽略的现象。这个现象往往发生在新建立的网站上&#xff0c;因为百度需要时间来评估网站的质量和内容。蘑菇号www.mooogu.cn 为了快速走出网站沙盒期&#xff0c;需要优化百度SEO。以下是5个…

【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容

小编在写这篇博客时&#xff0c;经过了九一八&#xff0c;回想起了祖国曾经的伤疤&#xff0c;勿忘国耻&#xff0c;振兴中华&#xff01;加油&#xff0c;逐梦少年&#xff01; 前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;…

平均精度(AP)

什么是平均精度(AP) 平均精度 (AP)并不是精度 (P)的平均值。 平均精度 (AP) 是按类别计算的。 mAP&#xff08;mean average precision&#xff09;是一个平均值&#xff0c;常用作目标检测中的检测精度指标mAP 指标通过对于一个平均目标来检测任务中多个目标所对应不同 AP&a…

Nginx 防止跨站脚本 Cross-Site Scripting (XSS)

1、修改 nginx 配置 在 nginx.conf 配置文件中&#xff0c;增加如下配置内容&#xff1a; add_header X-XSS-Protection "1; modeblock";X-XSS-Protection 的字段有三个可选配置值&#xff0c;说明如下&#xff1a; 0&#xff1a; 表示关闭浏览器的XSS防护机制&…

(1) ESP32获取图像,并通过电脑端服务器显示图像

目录​​​​​​​ 一、所需器件工具 二、客户端与服务器进行UDP通信 1、客户端代码 2、服务器端代码 3、效果展示 三、客户端拍照&#xff0c;通过UDP传输到服务器进行显示 1、客户端获取图像并UDP传输 2、电脑端服务器显示图像 3、效果展示 四、代码链接 一、所需器…

rk3568环境配置和推理报错: RKNN_ERR_MALLOC_FAIL

前言 最近在部署算法在板子侧遇到的一些问题汇总一下&#xff1a; 一、版本问题 经过测试现在将自己环境配置如下&#xff1a; 本地linux安装rknn-toolkit2-1.5.0 本地Linux使用的miniconda新建的一个python虚拟环境&#xff08;自行网上查找相关方法&#xff09; 安装好自…

Linux 链表示例 LIST_INIT LIST_INSERT_HEAD

list(3) — Linux manual page 用Visual Studio 2022创建CMake项目 * CmakeLists.txt # CMakeList.txt : Top-level CMake project file, do global configuration # and include sub-projects here. # cmake_minimum_required (VERSION 3.12)project ("llist")# I…