stm32 ADC

news2024/11/16 17:47:16

目录

简介

stm32的adc

框图

①电压输入范围

 ②输入通道

​编辑③ADC通道

 ④ADC触发

⑤ADC中断

⑥ADC数据

⑦ADC时钟

 ADC的四种转换模式

hal库代码

标准库代码


简介

        自然界的信号几乎都是模拟信号,比如光亮、温度、压力、声音,而为了方便存储、处理,计算机里面都是数字的 0/1 信号,将模拟信号(连续信号)转换为数字信号(离散信号)的器件就叫模数转换器(Analogto-Digital Converter, ADC)

        按原理可分为:并行比较型 A/D 转换器(FLASH ADC)、逐次比较型 A/D 转换器(SAR ADC)和双积分式 A/D转换器(Double Integral ADC)。

        A/D转换过程通常为4步:采样、保持、量化和编码

        采样是对模拟信号周期性地抽取样值,使模拟信号转化为时间上离散的脉冲信号。采样频率( fS)越高,采样越密集,采样值越多,也就越接近模拟信号。

         ADC的主要有三个性能指标:分辨率、转换时间和转换精度

        分辨率:又称为转换精度, 指ADC能分辨的最小电压,通常使用二进制有效位表示,反应了ADC对输入模拟量微小变化的分辨能力。当最大输入电压一定时,位数越多,量化单位越小,误差越小,分辨率越高。

         转换时间:其倒数为转换速率,指ADC从控制信号到来开始,到输出端得到稳定的数字信号所经历的时间。转换时间通常与ADC类型有关。双积分型ADC的转换时间一般为几十毫秒,属于低速ADC;逐次逼近型ADC的转换时间一般为几十微妙,属于中速ADC;并联比较型ADC的转换时间一般为几十纳秒,属于高速ADC。

        转换精度:指ADC输出的数字量所表示的模拟值与实际输入的模拟量之间的偏差,通常为1个或半个最小数字量的模拟变化量,表示为1LSB或1/2LSB。

stm32的adc

框图

        STM32F10x系列内部有三个12位逐次逼近型ADC,拥有多达18个通道,可测量16个外部模拟输入源和2个内部信号源的A/D转换。每个通道的A/D转换可采用单次、连续、扫描或间断模式执行。 ADC的的转换结果为12位的二进制数,可按左对齐或右对齐存储在16位数据寄存器中。 ADC具有模拟看门狗特性,允许应用程序检测输入电压是否超过用户自定义的阈值上限或下限

①电压输入范围

        

        ADC 输入范围为: VREF- ≤ VIN ≤ VREF+。由 VREF-、 VREF+ 、 VDDA 、 VSSA、这四个外部引脚决定。引脚VDDA和VSSA为专门为模拟电路设计的独立电源,以过滤和屏蔽来自PCB上的毛刺和干扰。 ADC为提高转换精确度,使用VDDA和VSSA供电。一般把 VSSA 和 VREF- 接地,把 VREF+ 和 VDDA 接 3V3,得到 ADC 的输入电压范围为: 0~3.3V      

 ②输入通道

        电压怎么输入到 ADC?通过输入通道。ADCx_IN0~ADCx_IN15为ADC的输入信号通道,每个输入通道连接一个GPIO引脚。需要GPIO设置为对应模拟输入的复用模式,如下图为各ADC通道所对应引脚,STM32F103C8T6只有ADC1和ADC2。其中ADC1有两个内部通道:通道17连接内部参考电压VREFINT,通道16连接了芯片内部温度传感器

③ADC通道

        当 ADC 的多个通道以任意顺序进行转换就诞生了成组转换,这里有两种成组转换类型:
规则组和注入组

         规则通道组: 顾名思意,规则通道就是很规矩的意思,一般使用的就是这个通道。最多支持16个通道,在该组的ADC通道,根据序列寄存器SQRx( x=1~3)的配置顺序,依次转换。

        如果转换通道 16 想第一个转换,那么在 SQ1[4:0] 写 16 即可。 SQR2 控制着规则序列中的第 7 到第 12 个转换,对应的位为: SQ7[4:0]~SQ12[4:0],如果转换通道 1 想第 8 个转换,则 SQ8[4:0] 写 1 即可,如果通道 6 想第 10 个转换,则SQ10[4:0] 写 6 即可。具体使用多少个通道,由 SQR1 的位 L[3:0] 决定。触 发 ADC 采 样 后 ,依次按规则通道序列的顺序采集

         注入通道组: 可以理解为插入,插队的意思,是一种不安分的通道,类似中断,如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程,最多支持4个通道。如下图所示, JSQR控制通道顺序1~4,配置方法和规则组一样,当规则通道正在依次转换时, 可注入到转换序列中,优先转换。

        如果 JL=00(1 个转换),那么转换的顺序是从JSQR4[4:0] 开始,而不是从 JSQR1[4:0] 开始,跟 SQR 刚好相反

 ④ADC触发

        输入电压确定了,转换的顺序也设置好了,那接下来就该开始转换了。A/D转换需要触发信号才能开始工作,触发信号的产生方式通常有软件和外部触发。

        软件触发:由软件编程控制,使能触发启动位;ADC 转换可以由 ADC 控制寄存器 2: ADC_CR2 的 ADON 这个位来控制,写 1 的时候开始转换,写 0 的时候停止转换

        外部触发: 这个触发包括内部定时器触发和外部 IO 触发。触发源有很多,具体选择哪一种触发源,由 ADC 控制寄存器 2:ADC_CR2 的 EXTSEL[2:0]规则通道的触发源和JEXTSEL[2:0] 注入通道的触发源来控制。其中 ADC3 的规则转换和注入转换的触发源与 ADC1/2的有所不同,在框图上已经表示出来

⑤ADC中断

        ADC在每个通道转换结束后,可产生相应的中断请求。

规则通道转换结束中断:

        若ADC_CR1寄存器的EOCIE位被置1,注入通道或规则通道转换结束后,将产生EOC中断;

注入转换通道转换结束中断:

        若ADC_CR1寄存器的JEOCIE位被置1,注入通道转换结束后,将产生JEOC中断;

模拟看门狗中断:

        ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,若ADC_CR1寄存器的AWDIE位被置1。置高阈值是2.5V,超出阈值或低于阈值,将产生AWD中断。

⑥ADC数据

        一切准备就绪后, ADC 转换后的数据根据转换组的不同,规则组的数据放在 ADC_DR 寄存器,注入组的数据放在 JDRx。

        ADC转换的结果是一个12位的二进制数,而寄存器是16位的,因此涉及到数据对齐问题。 ADC对齐方式有左对齐和右对齐两种,通常使用右对齐方式,因为数据传输一般是从最低位开始(对应右边开始)。例如, 16位数据寄存器,数据采用右对齐方式,则转换的数据范围为0~212-1,即0~4095。ADC_CR2 的11 位 ALIGN 设置。

规则数据寄存器

        寄存器 ADC_DR 只有一个,是一个 32 位的寄存器,低 16 位在单 ADC 时使用,高 16 位是在 ADC1 中双模式下保存 ADC2 转换的规则数据,双模式就是 ADC1 和 ADC2 同时使用。
        规则通道可以有 16 个这么多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了 DR 里面。所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据传输到内存里面,不然就会造成数据的覆盖。最常用的做法就是开启 DMA 传输。注意,不是所有ADC的规则通道组转换结束后都能产生DMA请求,只有ADC1和ADC3能产生,ADC2转换数据可以在双ADC模式中使用ADC1的DMA请求。

注入数据寄存器

      ADC 注入组最多有 4 个通道,刚好注入数据寄存器也有 4 个,每个通道对应着自己的寄存器,不会跟规则寄存器那样产生数据覆盖的问题。

⑦ADC时钟

 

        根据《参考手册》可知,时钟频率最大72MHZ,一般设置PCLK2=HCLK=72M,ADC可以是 2/4/6/8 分频,ADC最大工作频率为14MHz,所以一般用72MHz/6分频=12MHz

采样时间

        A/D转换在采样时信号需要保持一段时间,采样时间越长,转换结果越稳定,但转换速率也就越慢。STM32的ADC每个通道的采样时间都可以进行设置,可设置为采样周期的1.5倍、 7.5倍、 13.5倍、 28.5倍、41.5倍、 55.5倍、 71.5倍或239.5倍,如果要达到最快的采样,那么应该设置采样周期为 1.5 个周期,这里说的周期就是 1/ADC_CLK。 ADC转换总时间可以表示为:

 ADC的四种转换模式

        单次模式: ADC只执行一次转换;
        连续模式:当前ADC转换结束后,立即进入下一个转换;
        扫描模式:用来扫描一组通道。通道可以来自规则通道组,也可来自注入通道组。开启扫描模式后,ADC将自动扫描该组所有通道,如此时转换模式设置为单次转换,则扫描本组所有通道后, ADC自动停止;若将转换模式设置为连续模式,则在扫描本组所有通道后,再从第一个通道开始扫描;
        间断模式:用来间歇转换一组通道。通道可以来自规则通道组,也可来自注入通道组。假设该组包含0、 1、 2、 3、 5、 6、 7、 8,共8个通道,而设置转换通道数为3,则第一次触发,转换0、 1、 2通道;第二次触发,转换3、 5、 6通道;第三次触发,转换7、 8通道,并产生EOC中断;

hal库代码

// ADC 通道宏定义
#define ADC_IN_CHANNEL  ADC_CHANNEL_16

ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma;

/*初始化ADC1的参数:触发方式、数据格式、转换模式,通道配置及其采样时间*/
void adc1_in_16_init(void)
{
    ADC_ChannelConfTypeDef sconfig;
    hadc1.Instance              = ADC1;
    hadc1.Init.DataAlign        = ADC_DATAALIGN_RIGHT;/*选择ADC采集到的数据对齐格式,这里设置为右对齐*/
    hadc1.Init.ScanConvMode     = ADC_SCAN_DISABLE;/* 失能ADC的扫描模式,只涉及一个ADC,无需对通道组进行扫描;*/
    hadc1.Init.ContinuousConvMode = DISABLE;/*失能ADC连续转换模式,不需要该ADC连续转换,只采集一次*/
    hadc1.Init.NbrOfConversion  = 1;/*使能ScanConvMode的情况下, 用于设置规则通道转换序列数,因为扫描模式被禁用,所以ADC只会执行单个通道的转换。*/
    hadc1.Init.DiscontinuousConvMode = DISABLE;/*失能规则组转换序列的间断模式,不需要间断扫描;*/
    hadc1.Init.NbrOfDiscConversion = 1;/*通道间转换次数。在启用间断转换模式的情况下,这个值表示在一个转换序列中,ADC会在多少个通道之间进行转换。在这里设定为1,表示ADC会在一个通道上进行一次转换*/
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;/*外部触发源的选择(软件触发ADC采样)*/
    HAL_ADC_Init(&hadc1);
    
    sconfig.Channel = ADC_IN_CHANNEL;/*设置ADC(模数转换器)的输入通道*/
    sconfig.Rank = ADC_REGULAR_RANK_1;/*放在规则通道组的第一个转换位置*/
    sconfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;/*采样时间*/
    
    HAL_ADC_ConfigChannel(&hadc1,&sconfig);
    
    HAL_ADCEx_Calibration_Start(&hadc1);/*启动ADC的校准过程*/
}

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    RCC_PeriphCLKInitTypeDef  PeriphClkInit = {0};
    /*配置的外设时钟选择为ADC外设*/
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    /* 选择 ADC 时钟源 72MHz/6=12MHz*/
    PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
    
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
    if(hadc->Instance == ADC1)
    {
        __HAL_RCC_ADC1_CLK_ENABLE();    // 使能ADC1的时钟
    }
}

标准库代码

// ADC GPIO宏定义
// 注意:用作ADC采集的IO必须没有复用,否则采集电压会有影响
#define    ADC_PORT                      GPIOB
#define    ADC_PIN                       GPIO_Pin_0

// ADC 通道宏定义
#define    ADC_CHANNEL                   ADC_Channel_8

void ad_config(void)
{
    ADC_APBxClock_FUN(ADC_CLK,ENABLE);

    /*规则组的 输入通道,序列、采样时间,这里采样时间为55.5个周期*/
    ADC_RegularChannelConfig(ADC1,ADC_CHANNEL,1,ADC_SampleTime_1Cycles5);
    
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;/*独立模式*/
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;/*数据右对齐*/
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/*不使用外部触发,内部软件触发*/
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;/*连续enable或单次disable*/
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;/*enable扫描或非扫描disable*/
    ADC_InitStruct.ADC_NbrOfChannel = 1;/*扫描模式下用的几个通道1-16,非扫描只有序列第一个有校*/
    
    ADC_Init(ADCx,&ADC_InitStruct);
    ADC_Cmd(ADCx, ENABLE);
    /*手册建议上电后要校准*/
    ADC_ResetCalibration(ADCx);/*开始复位校准*/

    while(ADC_GetResetCalibrationStatus(ADCx));/*等待复位完成标志位,0表示复位校准完成*/

    ADC_StartCalibration(ADCx);/*开始校准*/

    while(ADC_GetCalibrationStatus(ADCx));/*完成标志位*/
}


void ad_init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    /*adc clk时钟配置,6分频:adcclk = 72mhz/6 = 12mhz*/
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;/*模拟输入*/
    GPIO_InitStruct.GPIO_Pin = ADC_PIN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(ADC_PORT,&GPIO_InitStruct);
    ad_config();
}

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

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

相关文章

容器:软件性能测试的最佳环境

容器总体上提供了一种经济的和可扩展的方法来测试产品在实际情况下的性能,同时还能保持较低的资源成本和开销成本。 软件性能和可伸缩性是我们谈论应用程序开发时经常遇到的话题。一个很大的原因是应用程序的性能和可伸缩性直接影响其在市场上的成功。一个应用程序…

搭建Qt5.7.1+kylinV10开发环境、运行环境

1.下载Qt源码 Index of / 2.编译Qt 解压缩qt-everywhere-opensource-src-5.7.1.tar.gz 进入到qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs这个目录下, 2.1找到以下目录 复制他,然后改名linux-x86-arrch64,博主这里名字取的有些问…

历年网规上午真题(2017年)

解析:D/C 计算机主要性能指标:时钟频率(主频)、运算速度、运算精度、内存大小、数据处理速率(PDR)等 数据库主要指标:最大并发、负载均衡能力、最大连接数等 解析:A 敏捷开发是一种应对快速变化的需求的一种软件开发方法,是一种以人为核心、迭代、循序渐进的开发方…

深度学习之基于Yolov5闯红灯及红绿灯检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、闯红灯及红绿灯检测系统![请添加图片描述](https://img-blog.csdnimg.cn/8f260c2ed5ed4d8596e27d38abe42745.jpeg)四. 总结 一项目简介 基于Y…

生成独立运行的QT程序

前言 使用windeployqt程序生成独立运行的QT程序。 方法 1.在QT Creator使用release构建运行一下代码,不使用debug模式,将release文件夹中生成的***.exe文件复制到一个新的文件夹下。 2.打开 Qt 5.14.2(MinGW 7.3.0 64-bit) 进入exe文件所在的目录执…

Java精品项目62基于Springboot+Vue实现的大学生在线答疑平台(编号V62)

Java精品项目62基于SpringbootVue实现的大学生在线答疑平台(编号V62) 大家好,小辰今天给大家介绍一个基于SpringbootVue实现的大学生在线答疑平台(编号V62),演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目…

Temu新规,12岁以下儿童产品必需提供CPC认证

近日Temu发布儿童用品合规通知:为保障Temu平台消费者的合法权益,保障儿童类商品在目的国的正常销售及合规要求,针对以12岁及以下儿童为主要使用对象的产品, 卖家需提供CPC认证,要求说明: 1、所有产品均需…

linux 下 物理迁移 mysql 数据库 不能启动问题

1、授权问题 # chown -R 777 /app/db/mysql 2、/etc/my.cnf配置问题 [mysqld] basedir/app/db/mysql datadir/app/db/mysql/data socket/app/db/mysql/mysql.sock.lock innodb_buffer_pool_size128M innodb_force_recovery 1 symbolic-links0 [mysqld_safe] log-error/app/…

半方差函数详解

1 引言 托布勒的地理第一定律指出,“一切都与其他事物有关,但近处的事物比远处的事物更相关。 在半变异函数的情况下,更接近的事物更可预测,变异性更小,而遥远的事物则难以预测,相关性也较低。 例如&…

做CSGO游戏搬砖前,这五个问题必须了解

相信经常看我文章的人或多或少都已经了解steam搬砖项目,也叫CSGO游戏搬砖项目,还有人叫它:国外steam游戏汇率差项目,无论怎么称呼,都是同一个项目。虽然我已经实操Steam搬砖项目超过三年,带领了数百名学员踏…

文字间隔css

文字间隔 letter-spacing: 3px

linux入门---线程的同步

目录标题 什么是同步生产者和消费者模型三者之间的关系消费者生产者模型改进生产者消费者模型特点条件变量的作用条件变量有关的函数条件变量的理解条件变量的使用 什么是同步 这里通过一个例子来带着大家了解一下什么是同步,在生活中大家肯定遇到过排队的情景比如…

看完就牛了,自动化测试框架详解

一、引言 随着IT技术的快速发展,软件开发变得越来越快速和复杂化。在这种背景下,传统的手工测试方式已经无法满足测试需求,而自动化测试随之而生。 自动化测试可以提高测试效率和测试质量,减少重复性的测试工作,从而…

移动云:IDC容器安全行业代表,领跑云原生安全技术演进

近日,全球领先的IT电信市场研究和咨询公司IDC发布了《中国容器安全市场洞察,2023》报告(简称《报告》),分析了国内容器安全市场现状以及主要供应商并提供了行动建议。移动云云原生应用安全获得本次IDC报告认可&#xf…

壁纸头像表情包插画流量主小程序开源版开发

壁纸头像表情包插画流量主小程序开源版开发 以下是壁纸头像表情包插画流量主小程序的功能列表: 用户注册和登录:用户可以注册和登录自己的账号,可以使用账号保存自己的喜爱的壁纸、头像、表情包、插画等内容。 壁纸浏览和下载:用…

详解全志R128 RTOS异构多核通信原理

RTOS 异构多核通信 异构多核通信介绍 R128 所带有的 M33 主核心与 C906, HIFI5 DSP 核心是完全不同的核心,为了最大限度的发挥他们的性能,协同完成某一任务,所以在不同的核心上面运行的系统也各不相同。这些不同架构的核心以及他们上面所运…

【基带开发】AD9361 复乘 com_cmpy_a12_b12

IP核 tb_com module tb_com();reg ad9361_l_clk,rst; initial beginad9361_l_clk0;forever #4.545 ad9361_l_clk~ad9361_l_clk; end initial beginrst1;#9.09 rst0; end wire [63 : 0] m_fll_phase_shift_dout; // fll 输出 dout // FLL Phase Shift com_cmpy_a12_b12 FLL_P…

Docker学习——①

文章目录 1、什么是虚拟化、容器化?2、为什么要虚拟化、容器化?3、虚拟化实现方式3.1 应用程序执行环境分层3.2 虚拟化常见类别3.3 常见虚拟化实现3.3.1 主机虚拟化(虚拟机)实现3.3.2 容器虚拟化实现3.3.3 空间隔离实战--基础知识3.3.4 PID 隔离3.3.5 Mo…

如何将各种小程序(微信小程序)项目转换为 uni-app 项目

使用【miniprogram-to-uniapp】可以将微信小程序项目转为 uni-app 项目(新版本 HBuilderX 工具已经支持各种小程序转换插件) HBuilderX 插件地址:miniprogram-to-uniapp v2 - DCloud 插件市场 核心原理:使用 Babel 获取AST(词法分析),然后或…

2023年江西省职业院校技能竞赛“网络安全”赛项样题

二、竞赛注意事项 1.竞赛期间禁止携带和使用移动存储设备、计算器、通信工具及 参考资料。 2.请根据大赛所提供的竞赛环境,检查所列的硬件设备、软件清 单、材料清单是否齐全,计算机设备是否能正常使用。 3.在进行任何操作之前,请阅读每个部分…