它有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);
它有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);
举报