当前位置:网站首页>【STM32】 ADC模数转换
【STM32】 ADC模数转换
2022-08-02 04:03:00 【丘比特惩罚陆】
ADC简介
ADC:模拟数字转换器,是指将连续变量的模拟信号(高低电平)转换位离散的数字信号(0和1)的器件,AD转换就是模数转换,也可以是整流.顾名思义 ,就是把模拟信号转换为数字信号.
那么模拟量可以是什么?总结如下:模拟量可以是电压、电流等电信号,还可以是压力 温度 湿度 位移、声音等非电信号等等。
ADC采集的要求
输入到A/D转换器中的输入信号必须经过各种传感器将各类的物理量转换为电压。因此ADC要求的进度也要很高,A/D转化输出的电压可以有8位(分辨率:256)、10位(分辨率:1024)、12位(分辨率:4096)、16位(分辨率:65536)等等。
转换步骤
取样 、保持、量化、编码
前两个步骤再取样,保持电路中完成;后两个步骤在ADC中完成。
ADC常用类型:
积分型
并行比较型/串并型
电容阵列逐次比较型及压频 变换型
逐次逼近型
ADC主要特征
- 12位分辨率;
- 转换结束,注入转换结束和发生模拟看门狗事件时产生中断;
- 单次和连续转换模式;
- 通过通道0到通道N的自动扫描模式;
- 自校验;
- 带内嵌数据一致性的数据对齐(左对齐或者右对齐);
- 采样间隔可以按通道分别编程;
- 规则转换和注入转换均有外部触发选项;
- 间断模式;
- 双重模式;
- ADC转换时间:

- ADC供电要求:2.4V到3.6V;
- 规则通道转换期间有DMA请求产生;
对于ADC的时钟我们只能采取72/6=12Mhz的ADC 时钟频率 并且只能是6/8分频 不可以用2/4分频 因为已经超过了ADC的最大时钟晶振
注入通道和规则通道:
注入通道:类似单片机的中断事件 同一个ADC只能选择4个注入通道

注入通道转换完成 JEOC标志会置1
规则通道----类似main函数中while(1)里面的程序事件
同一个ADC可以选择16个规则通道

规则通道数据转换完成之后 EOC标志位会置1

单次转换的好处:按照个人需求随意启动;
单次转换的坏处:不能连续的采集数据;
什么是单次转换模式:

多次转换的好处:ADC启动一次后,就可以一直转换;
多次转换的坏处:消耗的资源过大;
什么是多次转换模式:

扫描模式
扫描模式可以干什么?
扫描所有选中的通道进行


注意:1、建议在每次上电后执行一次校验;
2、启动校验前,ADC必须处于关电状态。
数据对齐:

可编程的通道采样时间:
ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以采用不同的采样时间。
外部触发转换:
转换武以由外部事件触发(例如定时器捕获,EXT线)。如果设置了EXTTRIG控制位,则外部事件就能骜他发转奖。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中的某一个,可义触发规则和注入组的采样。

代码如下(示例):
#include "adc.h"
void ADC1_Init(void)
{
//配置IO
GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //引脚1
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; //输出速度为10MHz
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; //浮空输入
GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化
//配置ADC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent ;
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;//配置为单通道
ADC_Init(ADC1,&ADC_InitStruct); //ADC初始化
ADC_Cmd(ADC1,ENABLE);//使能ADC上电工作
//启动前进行校准
//复位校准
ADC_ResetCalibration(ADC1);//复位ADC校准器
while(ADC_GetCalibrationStatus(ADC1));//等待校准器为零 说明完成校准
//复位完开始启动 开启ADC进行校准
ADC_StartCalibration(ADC1);//开启ADC校准
while(ADC_GetCalibrationStatus(ADC1));//获取校准状态
}
//获取光照传感器的值
//返回adc采集到光照强度的值
//取值范围 0--4095
u16 Get_Gz_Data(void)
{
//选择规则通道 ADC1的通道3 转换到通道1 通道转换时间为239
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待数据装换完成 获取规则通道EOC标志
return ADC_GetConversionValue(ADC1);//返回转换结果
}
u16 Get_GZ_data(void)
{
//选择规则通道,ADC1的通道3(IN3),转换通道为1个,通道采集时间为239
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动规则通道开始转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待数据转换完成,获取规则通道EOC标志位
return ADC_GetConversionValue(ADC1); //返回转换结果
}边栏推荐
猜你喜欢

吴恩达机器学习系列课程笔记——第十六章:推荐系统(Recommender Systems)

复制延迟案例(2)-读己之写

MySQL8.0与MySQL5.7区别

3D object detection dataset

ADSP21489仿真:Failed to set breakpoint: Can‘t set breakpoints in the current state: Running

OpenCV内阈值处理方法

七分钟深入理解——卷积神经网络(CNN)

CaDDN代码调试

Your device is corrupt. It cant‘t be trusted and may not work propely.

internship:数据库表和建立的实体类及对应的枚举类之间的联系示例
随机推荐
字典基本操作方法
普氏分析法-MATLAB工具箱函数
吴恩达机器学习系列课程笔记——第十三章:聚类(Clustering)
科研笔记(七) 基于路径规划和WiFi指纹定位的多目的地室内导航
吴恩达机器学习系列课程笔记——第六章:逻辑回归(Logistic Regression)
Deep Blue Academy-Visual SLAM Lecture 14-Chapter 6 Homework
数据复制系统设计(3)-配置新的从节点及故障切换
Jetson Nano 2GB Developer Kit Installation Instructions
科研笔记(六) 基于环境感知的室内路径规划方法
自定义一个下划线分词器
3D object detection dataset
列表总结
力扣 215. 数组中的第K个最大元素
Jetson Nano 2GB Developer Kit 安装说明
Your device is corrupt. It cant‘t be trusted and may not work propely.
吴恩达机器学习系列课程笔记——第九章:神经网络的学习(Neural Networks: Learning)
MySQL read-write separation mysql-proxy deployment
数据可视化之百变柱状图
LeetCode 23: 合并K个升序链表
[Win11] PowerShell无法激活Conda虚拟环境