完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行
● 单次:即只转换一遍,如果是一个通道,即只转换一次,如果是一组通道,即所有通道扫描一遍。 ● 连续:通道循环转换,分为单通道连续,多通道扫描连续 ● 扫描:从通道0到通道n的自动扫描模式。单独扫描和连续(循环)扫描 ● 间断:如果有1-8个通道要转换,可以分成1-2,3-5,6-8等小组,每次触发,转换一个小组,这叫间断 一、ADC开关 通过设置ADC_CR2寄存器的ADON位可给ADC上电。当第一次设置ADON位时,它将ADC从断电状态下唤醒。 ADC上电延迟一段时间后(tSTAB),再次设置ADON位时开始进行转换。也可以通过置位CR2的SWSTART或SWSTARTJ位开始规则通道或注入通道的转换。 通过清除ADON位可以停止转换,并将ADC置于断电模式。 hal库是通过HAL_ADC_Start/HAL_ADC_Start_IT/HAL_ADC_Start_DMA函数中的-------> tmp_hal_status = ADC_Enable(hadc);来唤醒ADC的。 二、通道选择 ● 规则组:通道和转换顺序在ADC_SQRx寄存器中选择。转换的总数写入ADC_SQR1寄存器的L[3:0]位中,在初始化函数HAL_ADC_Init(&hadc1)中设置。先转换哪个通道(即转换顺充),在HAL_ADC_ConfigChannel(&hadc1, &sConfig)中设置SQR3寄存器,用5bit表示一个通道编号,最低的5bit表示最先转换的通道号,次低的5bit表示第二个转换的通道号。 ● 注入组:由多达4个转换组成。转换顺序在ADC_JSQR寄存器中选择。转换总数目必须写入ADC_JSQR寄存器的JL[1:0]位中 STM32的ADC模块通过内部多路模拟开关,可以切换到不同的输入通道并进行转换。加入了多种成组转模式,由程序设定好以后,对多个通道逐个采样转换。 有2种分组的方式:规则通道组和注入通道组。通常规则通道组中可以安排最多16个通道,而注入通道组可以安排最多4个通道。 在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。 举个例子: 你家院子内放了5个温度探头,室内放了3个温度探头;你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;因此你可以使用规则通道组循环扫描室外的5个探头并显示AD转换结果,当你想看室内温度时,通过一个按钮启动注入转换组(3个室内探头)并暂时显示室内温度,当你放开这个按钮后,系统又会回到规则通道组继续检测室外温度。 从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置AD循环扫描的通道,然后在施放按钮后需再次配置AD循环扫描的通道。 一、转换模式 ● 单次转换模式–单通道: 转换结果存入ADC_DR/ADC_DRJ1 寄存器中。 ● 连续转换模式–单通道: 转换结果存入ADC_DR/ADC_DRJ1 寄存器中,转换结束EOC置位,软件清除EOC后自动启动另一次转换 在STM32的ADC库函数中主要由 ADC_InitStructure.ADC_ScanConvMode = DISABLE; 来决定AD采集工作在单次转换模式(DISABLE)或者是连续转换模式(ENABLE) ● 扫描模式:逐个转换所有被ADC_SQRX/ADC_JSQR寄存器选择通道,如果设置了CR1的SCAN位,则循环扫描,需要使用DMA把结果传输到SRAM中。 二、间断模式 例如规则组有0,1,2,3,6,7,9,10八个通道需要转换,可以设置n=3,那么第一次触发只转换0,1,2通道,第二次触发转换3,6,7通道,第三次触发转换9,10通道,并生产结束EOC事件。第四次触发跟第一次触发一样转换0,1,2通道。 规则组和注入组只能有一个使用间断模式。 三、采样时间+转换时间 每通道采样时间间隔1.5周期或可设置更大的值,转换时间为12.5周期,所以一个通道需要14周期,如果一个组里有2个通道,则需要28周期,所以触发的时间间隔要大于28周期。 Cube MX配置完成生成工程后,在转换前需要添加 HAL_ADCEx_Calibration_Start(&hadc1)函数,用于ADC的自校验,如果不校验,结果会有偏差; 规则通道转换的值储存在一个唯一的数据寄存器ADC_DR中,所以当转换多个规则通道时需要使用DMA 1、单通道----中断模式 调用HAL_ADC_Start_IT(&hadc1)函数,启用ADC转换。在回调函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { ADC_ConvertedValue=HAL_ADC_GetValue(&hadc1); } 里获取转换后的数字值。 2、单通道----DMA模式 调用HAL_ADC_Start_DMA(&hadcx,&ADC_ConvertedValue,1);启动ADC,并开始DMA转换,转换结束会保存到ADC_ConvertedValue中,注意它是uint32_t类型的变量。 3、多通道----DMA模式 调用HAL_ADC_Start_DMA(&hadcx,ADC_ConvertedValue,num_ch); 启动DMA转换。 一定要在DMA传输完成中断回调函数中,加入以下停止ADC转换的语句 参考:https://www.cnblogs.com/yangxuli/p/6379474.html 参考:https://blog.csdn.net/apple_2333/article/details/96962574 扫描模式(想采集多通道必须开启):是一次对所选中的通道进行转换,比如开了ch0,ch1,ch4,ch5。Ch0转换完以后就会自动转换通道1,4,5直到转换完。但是这种连续性并不是不能被打断。这就引入了间断模式,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道配置为一组。这样每一组转换之前都需要先触发一次。 Stm32 ADC的单次模式和连续模式。这两中模式的概念是相对应的。这里的单次模式并不是指一个通道。假如你同时开了ch0,ch1,ch4,ch5这四个通道。单次模式转换模式下会把这四个通道采集一边就停止了。而连续模式就是这四个通道转换完以后再循环过来再从ch0开始。 如果有多个通道,又不想使用DMA,则可以使用间断模式,间断配置必须每个通道分为1组,即触发一次,只转换1组即1个通道。读取结果后,再触发下一次。程序如下: for(i=1;i<5;i++) { HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1,0xffff);//等待ADC转换完成 adcBuf=HAL_ADC_GetValue(&hadc1); printf("------ch:%d--%d-------rn",i,adcBuf); } HAL_ADC_Stop(&hadc1); HAL_Delay(1000); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:16 , Processed in 0.851280 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号