32ADC模数转换器&AD单通道&多通道

2024-02-05 02:28

本文主要是介绍32ADC模数转换器&AD单通道&多通道,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.简介

二.逐次逼近法​编辑

三.结构框图

四.小tips

(1)转换模式

(2)触发控制

 (3)数据对齐

(4)转换时间

(5)校准

(6)硬件电路 

五.相关函数

六.代码实现

(1)单通道

(2)多通道


一.简介

数字电路只有高低电平,没有几伏电压的概念 

PWM就是DAC的功能,同时PWM只有完全导通和完全断开的两种状态,这两种状态都没有功率损耗

12位(0~2的12次方减1=0~4095),位数越高,量化结果就越精细,对应的分辨率就越高

1us对应AD转换频率为1MHz(最快),ADC转换的信号频率不要超过AD最快转换频率

温度传感器可以测量CPU的温度 

规则组:常规使用;注入组:用于突发事件

模拟看门狗可以检测某些通道,当AD值高于或低于设定的上阈值或低于下阈值时,就会申请中断执行对应的操作

二.逐次逼近法

三.结构框图

四.小tips

(1)转换模式

每次转换都需要进行触发,且要判断是否结束,并没有使用到列表

只用在最开始的时候进行触发,每次转换完成后立刻开始下一次转换,并没有使用到列表

扫描模式下,每个单独的通道转换完之后,不会产生标志位,也不会触发中断 

(2)触发控制

 

 (3)数据对齐

(4)转换时间

(5)校准

(6)硬件电路 

五.相关函数

问题: 

数值跳变得太剧烈、

解决:

(1)

施密特触发原理

(2)滤波,让AD值变得平滑

均值滤波,读取多个值,取平均值,作为滤波的AD值

(3)裁剪分辨率,去除数据的尾数

六.代码实现

(1)单通道

AD.c

#include "stm32f10x.h"                  // Device header
uint16_t i;
void AD_Init()
{GPIO_InitTypeDef GPIO_InitStructure;//必须要写在程序的开头位置ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC都是APB2上的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//在AIN模式下GPIO是无效的,专门为ADC服务//断开GPIO,防止GPIO的输入和输出对模拟电压造成干扰GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频设置ADC时钟,ADCCLK=12MHzADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//若想要在多个序列填充多个通道,可以复制19行进行填充,配置不同的采样时间ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//配置ADC独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//是否为扫描模式ADC_InitStructure.ADC_NbrOfChannel=1;//扫描模式下会用到的通道数目ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//配置成单次转换ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不使用外部触发源ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//开启ADC电源ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位校准完成后硬件自动置0ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)== SET);//校准完成后硬件自动置0}
uint16_t ADC_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发转换//软件触发在扫描连续转换模式,要放在ADC_Init结尾while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//软件触发在扫描连续转换模式,可以去除这一句//规则组或注入组完成时都会置1,可以由软件清除或由读取ADC_DR时清除//等待时间=68/12MHz=5.6us,68=55.5+12.5return ADC_GetConversionValue(ADC1);//读取ADC_DR}
float ADC_VA(uint16_t i)
{float Temp;i=ADC_GetValue();Temp = (float)i*3.3/(float)4095;return Temp;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "AD.h" 
uint16_t ADC_Value;
float VA;
int main()
{OLED_Init();AD_Init();OLED_ShowString(1,1,"ADC:");OLED_ShowString(2,1,"Va:0.00V");while(1){ADC_Value=ADC_GetValue();VA=ADC_VA(ADC_Value);OLED_ShowNum(1,5,ADC_Value,5);OLED_ShowNum(2,4,VA,1);OLED_ShowNum(2,6,(int)(VA*100)%100,2);}	
}

(2)多通道

多通道的实现最好采用DMA转运数据,但这里还没有学到,所以不采用真正的多通道实现

可以用单次转换,非扫描模式,每转换一个通道就用ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);

对通道进行更新,多次读值

AD.c

#include "stm32f10x.h"                  // Device header
uint16_t i;
void AD_Init()
{GPIO_InitTypeDef GPIO_InitStructure;//必须要写在程序的开头位置ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//ADC都是APB2上的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//在AIN模式下GPIO是无效的,专门为ADC服务//断开GPIO,防止GPIO的输入和输出对模拟电压造成干扰GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频设置ADC时钟,ADCCLK=12MHz//若想要在多个序列填充多个通道,可以复制19行进行填充,配置不同的采样时间ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//配置ADC独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//是否为扫描模式ADC_InitStructure.ADC_NbrOfChannel=1;//扫描模式下会用到的通道数目ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//配置成单次转换ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不使用外部触发源ADC_Init(ADC1,&ADC_InitStructure);ADC_Cmd(ADC1,ENABLE);//开启ADC电源ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位校准完成后硬件自动置0ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)== SET);//校准完成后硬件自动置0
}
uint16_t ADC_GetValue(uint8_t ADC_Channel)
{ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//规则组或注入组完成时都会置1,可以由软件清除或由读取ADC_DR时清除//等待时间=68/12MHz=5.6us,68=55.5+12.5return ADC_GetConversionValue(ADC1);//读取ADC_DR
}

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "AD.h" 
uint16_t AD1,AD2,AD3,AD4;
float VA;
int main()
{OLED_Init();AD_Init();OLED_ShowString(1,1,"AD1:");OLED_ShowString(2,1,"AD2:");OLED_ShowString(3,1,"AD3:");OLED_ShowString(4,1,"AD4:");while(1){AD1 = ADC_GetValue(ADC_Channel_0);AD2 = ADC_GetValue(ADC_Channel_1);AD3 = ADC_GetValue(ADC_Channel_2);AD4 = ADC_GetValue(ADC_Channel_3);OLED_ShowNum(1,5,AD1,5);OLED_ShowNum(2,5,AD2,5);OLED_ShowNum(3,5,AD3,5);OLED_ShowNum(4,5,AD4,5);Delay_ms(100);}	
}

这篇关于32ADC模数转换器&AD单通道&多通道的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679507

相关文章

物联网——DMA+AD多通道

DMA简介 存储器映像 某些数据在运行时不会发生变化,则设置为常量,存在Flash存储器中,节省运行内存的空间 DMA结构图 DMA访问权限高于cpu 结构要素 软件触发源:存储器到存储器传输完成后,计数器清零 硬件触发源:ADC、定时器、串口 重写计数器时,需关闭DMA DMA请求 数据宽度与对齐 目标宽度小于传输带宽:高位补零,反之,舍弃高位 数据转运与D

ADC——模数转换器

一、转换流程 在处理器中主要进行ADC 1、AD转换流程 :采样、保持、量化、编码 通过比较器获得的电信号转换数字信号,根据自己需求,如果要求速率就可以使用较多的比较器,不要求速率考虑成本就可以使用较少的比较器,将最后的转换结果,通过编码来表示 2、转换需要考虑的指标: 量程:0~3.3V 精度:10位 转换速率:500 KSPS 二、使用处理器上的A/D转换器 10 位

替换Windows AD时,网络准入场景如何迁移对接国产身份域管?

Windows AD是迄今为止身份管理和访问控制领域的最佳实践,全球约90%的中大型企业采用AD作为底层数字身份基础设施,管理组织、用户、应用、网络、终端等IT资源。但随着信创建设在党政机关、金融、央国企、电力等各行各业铺开,对Windows AD域的替换成为企业信息安全建设中不可避免的议题之一。 鉴于AD在企业中的应用程度不同,可将企业分为轻度、中度及深度三类Windows AD

STM32(十):ADC模数转换器

ADC(Analog-Digital Converter)模拟-数字转换器         ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。         12位逐次逼近型ADC,1us转换时间,分辨率:0~2^12-1           输入电压范围:0~3.3V,转换结果范围:0~4095         18个输入通道,可测量16个外

工业必备:SLM34x系列SLM340CK-DG 1A兼容光耦的单通道隔离驱动器

SLM34x系列SLM340CK-DG是单通道兼容光耦的隔离式栅极驱动器产品系列,适用于驱动IGBT、MOSFET。其峰值驱动电流1.0A。与光耦栅极驱动器相比,其性能和可靠性都得到显著的提升,同时保持了对光耦栅极隔离驱动器管脚的兼容。性能提升包括高共模瞬态抗扰度(CMTI)、低传播延迟和较小的脉宽失真。 SLM34x系列SLM340CK-DG的输入级是一个“模拟二极管”,与传统光耦相比,没

【网络安全】服务基础第一阶段——第九节:Windows系统管理基础---- Windows_AD域

目录 一、域与活动目录 1.1 工作组 1.2 域 1.2.1 域(Domain) 1.2.2 域控制器(Domain Controller,DC) 1.2.3 功能和角色 1.2.4 管理和监控 1.2 5 域结构 1.3 组织单元(Organizational Unit,OU) 1.4 物理结构 1.4.1 站点(Sites) 1.4.2 域控制器(Domain C

STM32单片机 ADC模数转换器

GPIO只能读取引脚的高低电平,只有两个值 ADC可对任意电压值进行量化,用变量来表示,相当于是电压表,可以测量引脚的具体电压 ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器。 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 DAC数字电路到模拟电路的桥梁,使用DAC可以将数字变量转换为模拟电压。DA

23:【stm32】ADC模数转换器

ADC模数转换器 1、ADC的简介2、逐次逼近型ADC3、采样时间和转换时间4、STM32中ADC模块5、编程案列5.1、AD单通道5.2、AD多通道 1、ADC的简介 ADC就是一个模数转换器,将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。说的直观一点就是一个电压表,用于测量电压的片上外设。其中转换电压的范围0~3.3v。 其中这些传

Vivado DDS IP核使用和仿真(二、多通道信号发生器)

按照博文https://blog.csdn.net/u013215852/article/details/91042672了解完单通道信号发生器之后,我们来看一下如果用一个IP核同时生成多通道信号怎么做,本文以1MHz和10MHz双通道为例: 1、设置参数,注意与单通道不同的地方 通道设置为2,那么我们想要得到与单通道一样16bit的输出数据,那么根据公式 我们就需要把Frequen

Vivado DDS IP核使用和仿真(一、单通道信号发生器)小补充

请先看上一篇博文:https://blog.csdn.net/u013215852/article/details/91042672 在此博文的最后,生成了同时输出正弦信号和余弦信号,一些读者对此有一些疑问,其实很简单,按照上一篇的设置,如果把output设置为Sine and Cosine,那么IP核会自动将输出的宽度扩大一倍,即16变成了32,根据下图可知高16位为SINE,低16位为COS