STM32
直播中

徐磊

7年用户 915经验值
私信 关注
[问答]

ADC具有哪些中断模式?

ADC具有哪些中断模式?

回帖(1)

许海明

2021-11-16 10:05:23
  它有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);
举报

更多回帖

×
20
完善资料,
赚取积分