搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
凡人多烦事01
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
对于无法json化的(集合)怎么办_json文件不支持集合
2
设计模式 -- 行为型模式
3
numa架构_numa知乎
4
Android studio笔记:工程介绍和控件(ProgressBar)_android studio进度条
5
java源码模拟面试解析指南,快手支付中台java面试题_支付中台面试
6
IDEA创建project和多个module(相互依赖打包)_idea两个model之间如果相互依赖
7
【C++】STL-string模拟实现_gcc4.7 stl string实现
8
分页查询_mysql第6到10个数据
9
MySQL中复制表/结构的写法_mysql复制表结构的sql语句
10
Docker中快速搭建hadoop3.2.1集群_dockercompose 单机部署hadoop3.3.2
当前位置:
article
> 正文
STM32-模数转化器
作者:凡人多烦事01 | 2024-04-11 09:56:57
赞
踩
STM32-模数转化器
ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换
为离散的数字信号的器件。
ADC相关参数说明:
分辨率:
分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16
位等,它说明模数转换器对输入信号的分辨能力,位数越多,表示分辨率越高,恢复模拟信
号时会更精确。
精度:
精度表示 ADC 器件在所有的数值点上对应的模拟值和真实值之间的最大误差值,
也就是输出数值偏离线性最大的距离。
转换速率:
转换速率是指 A/D 转换器完成一次从模拟到数字的 AD 转换所需时间的倒数。例
如,某 A/D 转换器的转换速率为 1MHz,则表示完成一次 AD 转换时间为 1 微秒。
7.1、STM32ADC介绍
是12bit逐次逼近型模拟数字转换器,有多达18个通道,可测量16个外部和2个内部信
号源,各通道的A/D转换可以单次、连续、扫描或间断模式执行,ADC的结果可以左对齐或
右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
ADC供电要求:2.4V到3.6V
ADC输入范围:VREF- ≤ VIN ≤ VREF+‘
7.2、ADC框架
组成部分:
7.2.1、ADC引脚
对于stm32f103系列单片机来讲,能测量的转化的电压范围0-3.3V。
注:超出转换测量范围需要额外增加外围电路,使其电压范围纠正到0-3.3V内,然后再进行转换测量。
引脚
7.2.2、ADC输入通道
ADC有16个外部输入通道和2路内部通道(温度传感器、内部参考电压)。
16个通道对应两种转换组:规则组和注入组,经由规则通道和注入通道转换,转换后
的数据写入对应的规则通道数据寄存器和注入通道数据寄存器*4
规则组:由多达16个转换组成
注入组:由多达4个转换组成
一般情况下我们都使用的是规则通道进行转换,转化顺序和转化总数由ADC_SQRx寄
存器进行设置;注入通道是在规则通道转换的时候强行插入的转换通道,转化顺序和转化总
数由ADC_JSQR寄存器进行设置。
利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换后。
如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫
描方式进行转换,然后恢复上次被中断的规则组通道转换;如果在注入转换期间产生一规则
事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
转换模式包括:单次转换模式、连续转换模式、间断模式和扫描模式 。
具体参考数据手册
11.3.4、11.3.5、11.3.8、11.3.10
对齐方式
:由于ADC为12bit精度,寄存器有效位16位,所有会涉及对齐方式:左对齐和右
对齐
DMA请求 :因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则
通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。
只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到
用户
指定的目的地址。
通道,和内部通道(温度传感器和Vrefint即参考电压通道)
7.2.3、ADC时钟
ADC时钟
可编程的通道采样时间
:ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可
以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改;每个通道可以分别用不
同的时间采样。
总转换时间如下计算:
TCONV = 采样时间+ 12.5个周期
例如:采样周期设置为1.5周期
TCONV = 1.5+12.5 = 14个周期
频率为14MHz时,转换一次的时间为1us
7.2.4、触发转换方式
转换可以由外部事件触发(例如定时器捕获,EXTI线)。如果设置了EXTTRIG控制位,则
外部事
件就能够触发转换。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中
的
某一个,可以触发规则和注入组的采样
7.2.5、ADC中断
规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都
有
独立的中断使能位。
转换结束以后可以触发中断,中断事件送至NVIC,切断中断控制器进行管理,最终给到cpu进行处理
7.2.6、双ADC模式
在有2个或以上ADC模块的产品中,可以使用双ADC模式,在双ADC模式里,根据
ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从
的交替触发或同步触发。
共有6种可能的模式:
─ 同步注入模式
─ 同步规则模式
─ 快速交叉模式
─ 慢速交叉模式
─ 交替触发模式
─
独立模式
还有可以用下列方式组合使用上面的模式:
─ 同步注入模式 + 同步规则模式
─ 同步规则模式 + 交替触发模式
─ 同步注入模式 + 交叉模式
7.3、STM32ADC固件库函数介绍
7.3.1、ADC初始化
1
void
ADC_Init
(
ADC_TypeDef
*
ADCx
,
ADC_InitTypeDef
*
ADC_InitStruct
)
ADC初始化结构体:
1
typedef struct
2
{
3
uint32_t ADC_Mode
;
//
工作模式
4
FunctionalState ADC_ScanConvMode
;
//ADC
扫描(多通道)使能
/
失能
5
FunctionalState ADC_ContinuousConvMode
;
//
连续转换使能
/
失能
6
uint32_t ADC_ExternalTrigConv
;
//ADC
触发信号选择
7
uint32_t ADC_DataAlign
;
//ADC
数据对齐模式
8
uint8_t ADC_NbrOfChannel
;
//ADC
采集通道
9
}
1、ADC_Mode
1
ADC_Mode_Independent
//ADC1
和
ADC2
工作在独立模式
2
ADC_Mode_RegInjecSimult
//ADC1
和
ADC2
工作在同步规则和同步注入模式
3
ADC_Mode_RegSimult_AlterTrig
//ADC1
和
ADC2
工作在同步规则模式和交替触发模式
4
ADC_Mode_InjecSimult_FastInterl
//ADC1
和
ADC2
工作在同步规则模式和快速交替模式
5
ADC_Mode_InjecSimult_SlowInterl
//ADC1
和
ADC2
工作在同步注入模式和慢速交替模式
6
ADC_Mode_InjecSimult
//ADC1
和
ADC2
工作在同步注入模式
7
ADC_Mode_RegSimult
//ADC1
和
ADC2
工作在同步规则模式
8
ADC_Mode_FastInterl
//ADC1
和
ADC2
工作在快速交替模式
9
ADC_Mode_SlowInterl
//ADC1
和
ADC2
工作在慢速交替模式
10
ADC_Mode_AlterTrig
//ADC1
和
ADC2
工作在交替触发模式
2、ADC_ScanConvMode
1
//ADC
的扫描模式
,
不断扫描
ADC1,2,3,
扫描多用在多通道上
2
ENABLE
3
DISABLE
3、ADC_ContinuousConvMode
1
//
连续转换模式
,ADC
通道连续采集
,
一次采集转化完继续采集
2
ENABLE
3
DISABLE
4、ADC_ExternalTrigConv
1
//
外部触发转换选择
2
ADC_ExternalTrigConv_T1_CC1
//
选择定时器
1
的捕获比较
1
作为转换外部触发
3
ADC_ExternalTrigConv_T1_CC2
//
选择定时器
1
的捕获比较
2
作为转换外部触发
4
ADC_ExternalTrigConv_T1_CC3
//
选择定时器
1
的捕获比较
3
作为转换外部触发
5
ADC_ExternalTrigConv_T2_CC2
//
选择定时器
2
的捕获比较
2
作为转换外部触发
6
ADC_ExternalTrigConv_T3_TRGO
//
选择定时器
3
的
TRGO
作为转换外部触发
7
ADC_ExternalTrigConv_T4_CC4
//
选择定时器
4
的捕获比较
4
作为转换外部触发
8
ADC_ExternalTrigConv_Ext_IT11
//
选择外部中断线
11
事件作为转换外部触发
9
ADC_ExternalTrigConv_None
//
转换由软件而不是外部触发启动
5、ADC_DataAlign
1
#define
ADC_DataAlign_Right
((
uint32_t
)
0x00000000
)
2
#define
ADC_DataAlign_Left
((
uint32_t
)
0x00000800
)
6、ADC_NbrOfChannel
1
ADC
要转化的通道数目
,
可以设置为
1
‐
16
7.3.2、使能/失能ADC外设
1
void
ADC_Cmd
(
ADC_TypeDef
*
ADCx
,
FunctionalState NewState
)
7.3.3、使能/失能ADC的DMA功能
1
void
ADC_DMACmd
(
ADC_TypeDef
*
ADCx
,
FunctionalState NewState
)
7.3.4、ADC中断功能配置
1
void
ADC_ITConfig
(
ADC_TypeDef
*
ADCx
,
uint16_t
ADC_IT
,
\
2
FunctionalState NewState
)
@arg ADC_IT_EOC: End of conversion interrupt mask
@arg ADC_IT_AWD: Analog watchdog interrupt mask
@arg ADC_IT_JEOC: End of injected conversion interrupt mask
7.3.5、ADC获取转换值
1
uint16_t
ADC_GetConversionValue
(
ADC_TypeDef
*
ADCx
);
7.3.6、ADC获取和清除中断标志
1
ITStatus
ADC_GetITStatus
(
ADC_TypeDef
*
ADCx
,
uint16_t
ADC_IT
);
2
void
ADC_ClearITPendingBit
(
ADC_TypeDef
*
ADCx
,
uint16_t
ADC_IT
);
7.3.7、ADC预分频配置
1
void
RCC_ADCCLKConfig
(
uint32_t
RCC_PCLK2
)
@arg RCC_PCLK2_Div2: ADC clock = PCLK2/2
@arg RCC_PCLK2_Div4: ADC clock = PCLK2/4
@arg RCC_PCLK2_Div6: ADC clock = PCLK2/6
@arg RCC_PCLK2_Div8: ADC clock = PCLK2/8
7.3.8、ADC使能/失能软件触发转换
1
void
ADC_SoftwareStartConvCmd
(
ADC_TypeDef
*
ADCx
,
FunctionalState
NewState
)
7.3.9、ADC使能/失能外部触发转换
1
void
ADC_ExternalTrigConvCmd
(
ADC_TypeDef
*
ADCx
,
FunctionalState NewState
)
7.3.10、ADC规则转换通道配置
1
void
ADC_RegularChannelConfig
(
ADC_TypeDef
*
ADCx
,
uint8_t ADC_Channel
,
\
2
uint8_t Rank
,
\uint8_t ADC_SampleTime
)
ADC_Channel:
1
@arg ADC_Channel_0
:
ADC
Channel0 selected
2
@arg ADC_Channel_1
:
ADC
Channel1 selected
3
@arg ADC_Channel_2
:
ADC
Channel2 selected
4
@arg ADC_Channel_3
:
ADC
Channel3 selected
5
@arg ADC_Channel_4
:
ADC
Channel4 selected
6
@arg ADC_Channel_5
:
ADC
Channel5 selected
7
@arg ADC_Channel_6
:
ADC
Channel6 selected
8
@arg ADC_Channel_7
:
ADC
Channel7 selected
9
@arg ADC_Channel_8
:
ADC
Channel8 selected
10
@arg ADC_Channel_9
:
ADC
Channel9 selected
11
@arg ADC_Channel_10
:
ADC
Channel10 selected
12
@arg ADC_Channel_11
:
ADC
Channel11 selected
13
@arg ADC_Channel_12
:
ADC
Channel12 selected
14
@arg ADC_Channel_13
:
ADC
Channel13 selected
15
@arg ADC_Channel_14
:
ADC
Channel14 selected
16
@arg ADC_Channel_15
:
ADC
Channel15 selected
17
@arg ADC_Channel_16
:
ADC
Channel16 selected
18
@arg ADC_Channel_17
:
ADC
Channel17 selected
Rank:通道采样顺序:1-16
ADC_SampleTime:
1
@arg ADC_SampleTime_1Cycles5
:
Sample time equal to
1.5
cycles
2
@arg ADC_SampleTime_7Cycles5
:
Sample time equal to
7.5
cycles
3
@arg ADC_SampleTime_13Cycles5
:
Sample time equal to
13.5
cycles
4
@arg ADC_SampleTime_28Cycles5
:
Sample time equal to
28.5
cycles
5
@arg ADC_SampleTime_41Cycles5
:
Sample time equal to
41.5
cycles
6
@arg ADC_SampleTime_55Cycles5
:
Sample time equal to
55.5
cycles
7
@arg ADC_SampleTime_71Cycles5
:
Sample time equal to
71.5
cycles
8
@arg ADC_SampleTime_239Cycles5
:
Sample time equal to
239.5
cycles
7.4、ADC实例
7.4.1、ADC单通道中断采集
1、ADC通道初始化
需要知道那些功能模块调用初始化函数
引脚先看原理图,先查看模拟量接到了那个通道上了,你接到了那个通道就对那个通道进行采集
比如ADC1/2使用ps4通道,设置ps4的引脚为模拟输入的引脚,还需要开启gpio的时钟就需要调用gdc的初始化函数,开启ADC的时钟转换完成,触发中断,NVIC也需要配置
使用的ADC1的通道4的pA4引脚,
开启对应的时钟,ADC1,GPIOA的时钟在APB2总线上
对ADC1的总线时钟进行分频,最大14m
gpio设置,gpio引脚为gpiopin4,模式为模拟输入的模式
设置初始化结构体,模式为独立模式;扫描转换模式关掉了;连续转换设置为使能了;外部触发事件关掉了;对齐方式选择为右对齐;转换的通道模式为1,;
开启中断的转换通道,设置为ADC1,通道4,1是转换顺序设置为第一次转换,转换的周期为1.5个周期
转换完成中断
使能了ADC
配置了NVIC,设置了NVIC的优先级
初始化好ADC通道,通过软件的方式开启ADC的模式转换,将转换好的结果存放到数据寄存器中,触发一个中断
到ADC中断中判断规则转换是否完成,如果是转换完成,就去读它的数据值,读取成功后赋值给一个变量,最终去清除转换的标志位
将读到的值转换成电压值,将转换的电压值通过串口的方式读取出来看有没有问题
7.4.2、ADC多通道DMA采集
配置pa4和pa5的两个引脚,再配置adc1和adc5;再开启dma的方式,通过的dma的方式将数据存放到内存上,不需要开启中断功能
开启时钟,开发ADC1的时钟,开启GPIOA的时钟到APB2上,还要开启DMA1的时钟
查看DMA1的配置,ADC1对应ADC1通道
再配置gpio4和5,这两个引脚是模拟输入的功能,
配置ADC,模式为独立模式;扫描转换模式开启了多通道扫描;开启了连续采集的功能;外部触发事件关掉了;对齐方式选择为右对齐;通道数为2;
规则通道的配置,ADC1和5,周期都是1.5个周期;转换顺序是先转换4再去转换2
开启ADC1的DMA功能,再开启ADC1
关闭了NVIC功能
开启了DMA功能
设置了DMA的外设的地址,ADC的DR的地址,将DR的值读到内存上
内存的地址,放两个转换好的值
外设的方向设置为把这个外设作为圆,从ADC1的dr中拷贝数据到内存中
buffer的大小为2个,两个通道为2
外设的地址是否递增关掉了
使能了内存的递增
ADC1的DR寄存器再转换通道4和通道5,又先后的顺序,先转换通道4再转换通道5,转换完通道4的数据就存放到DR寄存器中,再开启DMA功能,我们会把数据存放到指定的内存上,开辟的内存是定义的一个数组,把内存的地址给它,它通过DMA的方式将数据从DR上存放到数组里面,这个内存地址递增,转换通道5,转换通道5的数据存放到DR寄存器上,我们在通过DMA的方式将数据从DR上存放到数组中,转换完一次我们就可以读内存的数据了
一次拷贝的地址大小为16bit位的数据
开启的DMA模式为循环模式,循环的模式采集和读取模式
DMA的内存拷贝关掉
初始化dma通道成功
开启DMA通道为dma1
dma和ADC1初始化好了,就可以去读取DR中的数据到内存中,读取通道中断数据到数组中进行计算 就是转换后的dr值,再去测量电压值,完成多通道的adc的采集
接线方式
接入的pa4和pa5,可以通过滑动电阻调节电阻
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/凡人多烦事01/article/detail/404286?site
推荐阅读
article
Arduino
开发
环境
IDE
安装使用_用
arduinoide
stm32
是否需要
java
环境
...
Arduino
开发
环境
IDE
安装使用
Arduino
IDE
安装
IDE
软件介绍
IDE
软件介绍:几个常用功能介绍:Ardui...
赞
踩
article
STM32
RC522
智能门锁...
为宿舍的老旧门锁添加一个自动开锁装置,实现用手机刷NFC即可实现自动开锁(夏天就只需要一个手机就可以食堂、宿舍走了)需求...
赞
踩
article
STM32
DIY
USB
键盘
,
效果杠杠滴~_
stm32
usb
键盘
...
一、前言一般来说使用IO作为设备的按键输入就够用了
,
但是我就是想实现制作的按键
键盘
就像按实际
键盘
的某些按键一样
,
这样在...
赞
踩
article
STM32
+
ov7725
图像识别
(
HSL
原理)_
stm32
图像识别
...
一、前言嗯,玩一玩
ov7725
摄像头,看到个帖子有关于
图像识别
的,就想玩玩二、环境https://blog.csdn.n...
赞
踩
article
STM32
,
max30102
心率血氧,
mpu6050
运动状态监测,
esp8266
-12s上传
阿里
云...
stm32c8t6 _
max30102
采集
不准
max30102
采集
不准
...
赞
踩
article
【
毕业
设计
】基于
单片机
的
智能
鱼缸
系统
设计
与实现 - 嵌入式 物联网
stm32
c51_
智能
鱼缸
毕业...
Hi,大家好,这里是丹成学长,今天向大家介绍一个
单片机
项目, 大家可用于 课程
设计
或
毕业
设计
基于
单片机
的
智能
鱼缸
系...
赞
踩
article
STM32
中断
时间...
TIM_Period //计数周期,即ARR的值。TIM_Prescaler //预分频器,即PSC的值。
中断
时间 =...
赞
踩
article
四旋翼
无人机
学习第5节
--
STM32
最小系统外围电路
分析
_
vcap
stm32
...
四旋翼
无人机
学习第5节
--
STM32
最小系统外围电路
分析
_
vcap
stm32
vcap
stm32
...
赞
踩
article
STM32
四轴
无人机
的
设计
——代码整体
设计
_基于
stm32f411
单片机
的
四轴
无人机
设计
思路...
1、前言从现在开始我们要接触一个完整
的
工程,所以我们要对整个工程进行分析,将硬件
设计
、软件
设计
模块化,一个模块一个模块
的
...
赞
踩
article
基于
STM32
的
MPU6050
姿态
计算方法及应用_基于
stm32
的
mpu6050
...
在这个示例中,`gyro`代表陀螺仪测得
的
姿态
角速度,`accel`代表加速度计求得
的
姿态
角度,`alpha`是互补滤波...
赞
踩
article
GPIO
(
STM32
)点亮
LED
灯、
按键
KEY
...
GPIO
(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输...
赞
踩
article
[
STM32
+
HAL
]
DengFOC
移植
之
闭环
位置
控制
...
【代码】[
STM32
+
HAL
]
DengFOC
移植
。[
STM32
+
HAL
]
DengFOC
移植
之
闭环
位置
控制
...
赞
踩
article
STM32
F401
/
411
外设
内部互联矩阵摘要...
STM32
F401
/
411
外设
内部互联矩阵摘要
STM32
F401
/
411
外设
内部互联矩阵摘要 ...
赞
踩
article
【
STM32
】【C】【
嵌入式
】分享一下我的
项目
经验
--
基于
stm32
桌面主从
机械
臂
设计
(一弹)_st...
本文为原创文章,转载需要注明转载出处 前言:
嵌入式
开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还...
赞
踩
article
【
STM32
】【C】【
嵌入式
】分享一下我的项目经验
--
基于
stm32
桌面主从
机械
臂设计(三弹)
_
#d...
本文为原创文章,转载需要注明转载出处前言:
嵌入式
开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要...
赞
踩
article
STM32
+
OLED
屏
多级
菜单
显示(三)_
stm32
oled
菜单
...
前面的基础知识讲完了,现在正式开始使用索引法实现
多级
菜单
的第一步,定义
多级
菜单
的数据类型,通过typedef声明的结构体...
赞
踩
article
VSCode
搭建
STM32
开发环境_
vscode
stm32
仿真...
本节记录一下
VSCode
搭建
STM32
开发环境的过程,整个开发链如下:
VSCode
编辑代码 -> ARM GC...
赞
踩
article
HAL
STM32
定时器
PWM
DMA
输出方式_hal
pwm
dma...
HAL
STM32
定时器
PWM
DMA
输出_hal
pwm
dmahal
pwm
dma ...
赞
踩
article
stm32
IIC
协议...
IIC
协议是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,是一个多主机的半双工通信方式 每个挂接在总线上的...
赞
踩
article
Stm32
HAL
库 访问内部
flash
空间
...
在一些时候,需要存储一些数据,但是又不想接外部的
flash
,那我们可以知道,其实还有内部的
flash
可以使用,需要注意的...
赞
踩
相关标签
arduino
编程语言
开源
stm32
嵌入式硬件
单片机
stm32 usb
usb键盘
stm32 usb键盘
物联网
毕业设计
智能鱼缸
无人机