主要外设:

  • ADC:Analog to Digital Converter 模数转换器
  • DAC:Digital to Analog Converter 数模转换器

ADC_IN`

主要功能:测外部引脚的电压

数据通路:每个ADC有多个外部引脚、少量内部引脚

引脚ADC_IN→GPIO AF→GPIO输入电路→规则通路→

ADC的转换原理

  • 主要有逐次逼近型、双积分型、电压频率转换型
  • stm32内部集成ADC:逐次逼近型ADC

`传感器→运放→模拟信号→多路模拟开关→采样保持→AD转换器→数字信号→IO引脚

ADC的通道

  • 各通道的A/D转换可以单次、连续、扫描或间断模式执行
  • 分为:规则通道组(正常程序)、注入通道(中断)

ADC数据对齐

  • AD转换后存储数据的对齐方式(大小端)

触发ADC转换方式

  • 软件触发
  • 外部事件(如定时器事件、 EXTI 中断事件)触发转换:禁止、上升沿、下降沿、双边沿触发

‍STM32部分型号芯片具有VREF+、 VREF-参考电压引脚。而且,参考电压必须低于VDDA电压。

VREF+ 与 VDDA通过0Ω电阻连接,同样,VREF- 与 VDDS也要通过0欧电阻连接。

在STM32引脚处的状态即为浮空状态,读取出来的电压就是一个不确定值(通常为1/2VDD电压)。

PCLK2→APB2

PCLK2→预分频系数CCR 的ADCPRE→ADCCLK→倍频系数SMPR→ADC采样时间

  • 数字接口时钟(APB2):用于寄存器读/写访问,每个ADC独立使能

  • 模拟电路时钟(ADCCLK)用于ADC转换部分模拟电路,所有ADC共用

  • ADC采样时间:进行一次AD转换花费的时间

  • ADC分辨率:CR1的RES位,分辨率越低转换所需周期数(下图含最小采样时间)越少

    12bit(最少15个ADCCLK周期)

    10bit(最少13个ADCCLK周期)

    8bit(最少11个ADCCLK周期)

    6bit(最少9个ADCCLK周期)

  • AD转换:将电压平均分成若干段,最终电压会转换成一个数:3.3v/分辨率=测量电压/测量数值 → 所以测量电压值=3.3v/分辨率*测量数值

  • 分辨率越高越好,转换需要花费时间会边长,如12bit的分辨率为 2^12=4096 所以测量精度为3.3v/4096=0.8mv

  • stm32绝大多数型号支持12bit、少数高端型号支持最高16bit

    ADC的3种中断

  • 规则转换与注入转换结束、模拟看门狗事件、DMA请求

硬件设计

将PA0(ADC1_IN0)与+3V3引脚或GND引脚相连接

CubeMX的配置

  1. 引脚分配:

    Pinout View:自动分配PA0为ADC1的第0输入通道

2.外设配置:

Analog→ADC1→模式→勾选IN0

Analog→ADC1→参数设置(ADC设置)→预分频=PCLK2的4分频、分辨率12bit(15ADC时钟周期)、数据对齐=右对齐

Analog→ADC1→参数设置(ADC规则通道模式)→channel=channel0、采样时间=480cycles

用户代码

//USBR CODE3:后台程序(无限循环)
HAL_ADC_Start(&hadc1);//启动ADC转换
HAL_ADC_PollForConversion(&hadc1,10);//等待转换完成 10ms超时
uint32_t AD_Value=HAL_ADC_GetValue(&hadc1);
printf("ADC1_IN0 ADC值:%d,电压值%.4fV.\n",AD_Value,(double)AD_Value/4096*3.3);
HAL_Delay(1000);

ADC:温度传感器通道

主要功能:测量MCU内部温度

数据通路:

片内温度传感器、VREFINT内部参考电压、VBAT→规则通路→

Avg_Slope=-(V25-Vsensor)/(25-Tsensor)

  • Avg_Slope为电压和温度的变化的平均斜率的绝对值、V25为内部温度25℃时的典型电压值
  • 通过查询数据手册可知:V25 = 0.76V Avg_Slope = 2.5 mV/°C

CubeMX的配置

  1. 引脚分配:

    Pinout View:无

2.外设配置:

Analog→ADC1→模式→勾选Temperature sensor channel

Analog→ADC1→参数设置(ADC设置)→预分频=PCLK2的4分频、分辨率12bit(15ADC时钟周期)、数据对齐=右对齐

Analog→ADC1→参数设置(ADC规则通道模式)→channel=channel Temperature sensor、采样时间=480cycles

用户代码

//USBR CODE3:后台程序(无限循环)
HAL_ADC_Start(&hadc1);//启动ADC转换
HAL_ADC_PollForConversion(&hadc1,10);//等待转换完成 10ms超时 uint32_t ADC_value=HAL_ADC_GetValue(&hadc1);
double ADC_voltage=(double)ADC_value/4096*3.3;
printf("ADC值:%d,电压值%.4fV.\n",ADC_value,ADC_voltage);
printf("MCU Internal Temperature=%.2f ℃\r\n",(0.76 - ADC_voltage)/0.0025 + 25); HAL_Delay(1000);

DAC

硬件设计

STM32 F411不支持DAC

CubeMX的配置

  1. 引脚分配:

    Pinout View:无

2.外设配置:

Analog→DAC→模式→勾选OUT1 Configuration

Analog→DAC→参数设置(DAC out1设置)→输出缓冲disable、触发None

用户代码

HAL_DAC_Start(&hdac,DAC_CHANNEL_1);   //开启DAC通道1
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,200); //设置初始值为200,对应电压为200/4096*3.3V

STM32外设:信号转换器 ADC、DAC的更多相关文章

  1. ADC/DAC的一些参数

    1.LSB,Least Significant Bit LSB是指最低位一个bit的权值,比喻ADC是一把尺子,那LSB则是它的最小刻度.LSB=Vfs/(2^N),Vfs为full scale vo ...

  2. ADC/DAC设计常见40问

    本文章是关于ADC/DAC设计经典问答,涵盖时钟占空比.共模电压.增益误差.微分相位误差.互调失真等常见问题. 1. 什么是小信号带宽(SSBW)? 小信号带宽(Small Signal Bandwi ...

  3. STM32入门系列-STM32外设地址映射

    片上外设区分为四条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2和AHB挂载高速外设.相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外 ...

  4. 嵌入式硬件之ADC/DAC

    嵌入式硬件之ADC/DAC 写在前面 这几天在做一个寒假练项目,其中涉及到了音频的处理,ADC.DAC再次进入到了我的视野,并引起了我新的思考. 1.初次相识 记得去年七月份,本科毕业刚离校,就到研究 ...

  5. STM32 基DMA的DAC波形发生器

    DAC是STM32系列的一个基本外设,可以将数字信号转化成模拟信号,这次我将使用DAC来输出一个特定波形. 首先确定工作方法,由于我目前在做的简易示波器在输出波形的同时还需要显示输入信号,所以不能占用 ...

  6. STM32之DMA+ADC

    借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不 ...

  7. stm32之TIM+ADC+DMA采集50HZ交流信号

    http://cache.baiducontent.com/c?m=9d78d513d98207f04fece47f0d01d7174a02d1743ca6c76409c3e03984145b5637 ...

  8. STM32定时器触发ADC多通道连续采样,DMA缓存结果

    STM32的ADC使用非常灵活,采样触发方面:既支持软件触发,定时器或其他硬件电路自动触发,也支持转换完成后自动触发下一通道/轮转换.转换结果存储方面:既支持软件读取和转存,也支持DMA自动存储转换结 ...

  9. 对于adc dac使用细节

    1. 要更具内部线路图决定引脚分配,adc和dac绑定在一个线路上,所以设计的时候最好尽量间隔三个引脚以上,如果adc必须放到一起,请使用开关控制,但是dma等可能不能正常工作. 2.dac输出内部缓 ...

  10. STM32 DMA USART ADC

    转载自:http://www.cnblogs.com/UQYT/articles/2949794.html 这是一个综合的例子,演示了ADC模块.DMA模块和USART模块的基本使用. 我们在这里设置 ...

随机推荐

  1. xss-labs靶场

    在线XSS-labs靶场:https://xssaq.com/yx/ 靶场搭建 靶场是直接使用docker搭建的 docker pull vulfocus/xss-labs 启动靶场 docker r ...

  2. 解放生产力orm并发更新下应该这么处理求求你别再用UpdateById了

    解放生产力orm并发更新下应该这么处理求求你别再用UpdateById了 背景 很多时候为了方便我们都采用实体对象进行前后端的数据交互,然后为了便捷开发我们都会采用DTO对象进行转换为数据库对象,然后 ...

  3. SpringBoot 测试实践 - 2:单元测试与集成测试

    单元测试 vs. 集成测试 只编写单测,无法测试方法之间的集成情况,而且某些需求可能会修改多个方法,这可能会影响方法对应的单测,涉及到大量的相关单测的修改,这样的维护成本很高 可以把重心放在完善集成测 ...

  4. FastJson不成想还有个版本2啊:序列化大字符串报错

    背景 发现陷入了一个怪圈,写文章的话,感觉只有大bug或比较值得写的内容才会写,每次一写就是几千字,争取写得透彻一些,但这样,我也挺费时间,读者也未必有这么多时间看. 我想着,日常遇到的小bug.平时 ...

  5. 利用RATF框架实现web状态的监控

    之前,我们已经说明了如何实现一个我们的接口测试框架RATF,当然这个框架不止可以用于管理我们的接口测试代码,我们还可以用他来对我们的web进行简单粗暴的监控. 原理: 1. 通过使用配置文件,对要监控 ...

  6. RabbitMQ保姆级教程最佳实践

    一.消息队列介绍 1.消息队列概念 1.MQ全称为Message Queue,消息队列(MQ)是⼀种应⽤程序对应⽤程序的通信⽅法. 应⽤程序通过读写出⼊队列的消息(针对应⽤程序的数据)来通信,⽽⽆需专 ...

  7. 时髦称呼:SQL递归"语法糖"的用法

    Oracle函数sys_connect_by_path 详解 语法:Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行.其语法一般为:       s ...

  8. Java虚拟机(JVM):第三幕:自动内存管理 - 垃圾收集器与内存分配策略

    前言:Java与C++之间有一堵高墙,主要是有内存动态分配和垃圾收集技术组成的.墙外的人想要进来,墙内的人想要出去. 一.概述 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的.内存的分配和 ...

  9. [SWPUCTF 2021 新生赛]老鼠走迷宫(详细版

    附件下载 https://wwvc.lanzouj.com/iYLez1br84jg 解题思路 用pyinstxtrator解析exe 重点:将无后缀的5先修改后缀为pyc,然后随便找一个pyc文件补 ...

  10. 基于LangChain的LLM应用开发3——记忆

    此情可待成追忆,只是当时已惘然.我们人类会有很多或美好或痛苦的回忆,有的回忆会渐渐模糊,有的回忆午夜梦醒,会浮上心头. 然而现在的大语言模型都是没有记忆的,都是无状态的,大语言模型自身不会记住和你对话 ...