首页 > 其他分享 >STM32-模数转化器

STM32-模数转化器

时间:2024-04-10 23:31:32浏览次数:14  
标签:转化 转换 ADC1 模式 STM32 模数 ADC arg 通道

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,可以通过滑动电阻调节电阻

标签:转化,转换,ADC1,模式,STM32,模数,ADC,arg,通道
From: https://blog.csdn.net/ycjunhua/article/details/137571754

相关文章

  • 基于STM32的智能家居系统设计与实现:手机APP与语音控制家电
    基于STM32的智能家居系统设计与实现:手机APP与语音控制家电一、研究背景与意义随着科技的进步和人们生活水平的提高,智能家居系统逐渐成为现代家庭的新宠。智能家居系统通过集成各种智能设备和传感器,为用户提供更加便捷、舒适和安全的家居环境。本研究旨在设计一个基于STM32微......
  • STM32 HAL库F103系列之OLED显示一个字符
    原理图:OLED对应IO口OLED_CS对应OV_WRST,即:PD6;OLED_RS对应OV_SCL,即:PD3,高电平为命令,低电平为数据;OLED_WR对应OV_RRST,即:PG14;OLED_RD对应DCMI_SDA,即:PG13;OLED_RST对应DCMI_RESET,即:PG15;OLED_D[7:0]对应DCMI_D[7:0],即:PC[7:0]配置步骤:1,确定IO连接关系        开发......
  • 【模板】任意模数多项式乘法:三模 NTT
    前置知识https://www.cnblogs.com/caijianhong/p/template-crt.htmlhttps://www.cnblogs.com/caijianhong/p/template-fft.html题目描述任意模数多项式乘法solution首先我们打开https://blog.miskcoo.com/2014/07/fft-prime-table这篇文章找到\(998244353\)附近的几个质......
  • 2-61.随机生成收割物品和转化的实现
    修改Crop修改CropDataList_SO根据CropBase创建对象起名叫Tree01_Trunk修改CropDataList_SO修改Crop修改CropDataList_SO大树生成范围树干生成范围修改Crop修改ItemManager给掉落物一种下落的感觉项目相关代码代码仓库:https://gitee.com/nbda......
  • 蓝桥杯STM32G431RBT6-各个外设的配置过程
    LED,按键配置LED点亮,按键采集按键值前期准备:通过Cubemx生成一个源文件方便后续直接使用。  源文件准备完毕以后开始进行按键和LED的配置LED对比芯片引脚连接图可以知道8个LED分别连接在GPIOC的如下8个引脚中      Cubemx中......
  • 基于STM32的户外环境监测系统(三)
     光照强度模块   在基于STM32的户外环境监测系统中集成光照强度模块时,需要考虑以下注意事项:选择合适的光照传感器:选择适合户外环境监测的光照传感器,如光敏电阻(LDR)、光敏电容、光电二极管(PD)、光电晶体管等。根据项目需求考虑测量范围、响应频率、精度等因素进行选择。......
  • STM32F4 CubeMax 主从定时器同步 设定脉冲输出控制步进电机
    实验准备开发板:STM32F411E-DISCO或其它开发板(FirmwarePackage根据开发板下载)软件:KeiluVision5、STM32CubeMX(FirmwarePackage:STM32CubeFW_F4V1.23.0)实验原理利用CubeMX根据芯片手册配置定时器同步来实现自定义脉冲数PWM输出对电机进行控制。主定时器产生PWM波,从定时......
  • STM32外部中断小记
    一、EXTI配置步骤//1.配置RCC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟,AFIO:GPIO复用/重映射功能//2.配置EXTIGPIO端口及工作模式(输入模式)//3.配置EXTI中断线、模式(上升沿、下降沿......
  • 负进制转化
    思想:1.用短除法像处理正常进制一样将所有余数算出来  //余数转化为正数2.  负数转化公式:被除数=商*除数+余数        =商*除数+除数-除数+余数       =除数*(商+1)+(余数-除数)举个例子:-7(十进制)转化为(-2进制)7/-2=3+(-1);因为3+1=......
  • STM32F103C8T6 技术参数和性能特点
    STM32F103C8T6是意法半导体(STMicroelectronics)生产的一款基于ARMCortex-M3内核的32位微控制器。它具有以下主要功能: 1.ARMCortex-M3内核:STM32F103C8T6采用32位ARMCortex-M3内核,工作频率最高可达72MHz,提供较高的处理能力。 2.存储器:内置高达64kB的闪......