完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、stm32f4 ADC基本介绍
1. stm32F4 ADC主要特性 ● 可配置 12 位、10 位、8 位或 6 位分辨率 ● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断 ● 单次和连续转换模式 ● 用于自动将通道 0 转换为通道“n”的扫描模式 ● 数据对齐以保持内置数据一致性 ● 可独立设置各通道采样时间 ● 外部触发器选项,可为规则转换和注入转换配置极性 ● 不连续采样模式 ● 双重/三重模式(具有 2 个或更多 ADC 的器件提供) ● 双重/三重 ADC 模式下可配置的 DMA 数据存储 ● 双重/三重交替模式下可配置的转换间延迟 ● ADC 转换类型(参见数据手册) ● ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V ● ADC 输入范围:VREF- ≤ VIN ≤ VREF+ ● 规则通道转换期间可产生 DMA 请求 注: VREF- 如果可用(取决于封装),则必须将其连接到 VSSA 。 2. 单个ADC框图 3. ADC通道和引脚对应关系 从上图可以看出,stm32F4系列有三个ADC控制器(ADC1 / ADC2 / ADC3),每个控制器最多能控制16个通道,三个控制器一共支持24个通道(ADC1和ADC2的16个通道相同,ADC3红色标记的8个通道,16+8=24)。 注:其中144脚芯片因为带PF脚,所以多8个通道,为24个外部通道。小于144脚芯片只有16个外部通道。 4. ADC引脚 一般情况下,芯片VDD电压为3.3V,VSS接地,所以相对来说VDDA也为3.3V,VSSA也接地,模拟信号输入(ADCx_IN)不超过VDD3.3V. 二、stm32 ADC基本概念 1. 通道组 16条复用通道将转换分为两组:规则转换和注入转换。每个组包含一个转换序列(RANK), 该序列可按任意顺序在任意通道上完成。 ① 规则通道组: 相当正常运行的程序。最多16个通道。 规则通道和它的转换顺序在 ADC_SQRx 寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中 ② 注入通道组: 相当于中断。最多4个通道。 注入组和它的转换顺序在 ADC_JSQR 寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中 2. ADC时钟 一般常用第一种时钟方案,但ADC的采样频率不能设置太高,否则会不准,STM32F4 ADC时钟是设为最大32MHz 、STM32F1 最大为 14MHz。 因此,F1如果按照默认设置PCLK2为72MHz,则ADC时钟应为6分频或者8分频,F4如果按照默认设置PCLK2为84MHz,则ADC时钟应起码为4分频。 ADC时钟通过 时钟配置寄存器(RCC_CFGR) 配置。 3. 采样时间 4. 单次/连续转换模式 5. 扫描模式 三、ADC编程相关库函数 1. 初始化结构体 ADC中有两个初始化函数需要到初始化结构体,分别为 void ADC_CommonInit(ADC_CommonInitTypeDef ADC_CommonInitStruct)* 这些参数用来配置ADC_CCR寄存器的相关参数 void ADC_Init(ADC_TypeDef ADCx, ADC_InitTypeDef ADC_InitStruct)** typedef struct { uint32_t ADC_Mode; /*!《 多重ADC模式选择 ADC_Mode_Independent @ref ADC_Common_mode */ uint32_t ADC_Prescaler; /*!《 ADC预分频(分频系数) ADC_Prescaler_Div4 @ref ADC_Prescaler */ uint32_t ADC_DMAAccessMode; /*!《 DMA访问模式(是否使用DMA) ADC_DMAAccessMode_Disabled @ref ADC_Direct_memory_access_mode_for_multi_mode */ uint32_t ADC_TwoSamplingDelay; /*!《 采样周期 (两个采样阶段之间延时)ADC_TwoSamplingDelay_5Cycles @ref ADC_delay_between_2_sampling_phases */ }ADC_CommonInitTypeDef; typedef struct { uint32_t ADC_Resolution; /*!《 分辨率 ADC_Resolution_12b @ref ADC_resolution */ FunctionalState ADC_ScanConvMode; /*!《 选择单通道还是多通道 set to ENABLE or DISABLE 是否使用扫描模式,对应ADC_CR1位8:SCAN位 */ FunctionalState ADC_ContinuousConvMode; /*!《 选择是否连续转换 set to ENABLE or DISABLE.单次转换OR连续转换,对应ADC_CR2的位1:CONT */ uint32_t ADC_ExternalTrigConvEdge; /*!《 选择外部触发方式 ,对应ADC_CR2的位29:28,EXTEN,ADC_ExternalTrigConvEdge_None @ref ADC_external_trigger_edge_for_regular_channels_conversion */ uint32_t ADC_ExternalTrigConv; /*!《 选择触发事件 ,对应ADC_CR2的位[19:17] :EXTSEL[2:0],ADC_ExternalTrigConv_T1_CC1 @ref ADC_extrenal_trigger_sources_for_regular_channels_conversion */ uint32_t ADC_DataAlign; /*!《 数据对齐方式 (左对齐/右对齐),对应ADC_CR2的位11:ALIGN,ADC_DataAlign_Right @ref ADC_data_align */ uint8_t ADC_NbrOfConversion; /*!《 规则通道序列长度,对应ADC_SQR1的位[23:20]: L[3:0] This parameter must range from 1 to 16. */ }ADC_InitTypeDef; 四、ADC编程流程 以ADC1的通道5为例(PA5) // 1. 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。 RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); GPIO_Init(。。.); // 2. 复位ADC1,同时设置ADC1分频因子。 ADC_DeInit(); // 3. 初始化ADC_CCR寄存器。 ADC_CommonInit(。。.); // 4. 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。 ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); // 5. 使能ADC ADC_Cmd(ADC1, ENABLE); // 6. 配置规则通道参数,提高采样时间可以提高精确度 ADC_RegularChannelConfig(); // 7. 使能指定的ADC1的软件转换启动功能 ADC_SoftwareStartConv(ADC1); // 8. 等待转换完成,读取ADC值。 ADC_GetConversionValue(ADC1); 注: ADC_DeInit() 等效于RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, ENABLE) ; RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, DISABLE); 可参考固件库函数。 步骤的前5步是ADC初始化(准备阶段),步骤6-8为ADC的实现(工作阶段) 如下为采集一次的例程: /* * 获得ADC值 * ch: @ref ADC_channels * 通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16 * 返回值:转换结果 */ u16 Get_ADC_Value(u8 ch) { /* 设置指定ADC的规则组通道,一个序列,采样时间 */ ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles ); //ADC1,ADC通道,480个周期,提高采样时间可以提高精确度 ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1956 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1740 浏览 1 评论
1205 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
799 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1765 浏览 2 评论
2010浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
856浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
302浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
652浏览 3评论
654浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-11 21:19 , Processed in 0.504184 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191