HAL ADC连续转换模式 Continuous Conversion Mode

在学习Continuous Conversion Mode时,根据网上的例程和配置,我发现Continuous Conversion Mode ENABLE 和DISABLE输出结果好像没有区别。后来自己验证下来的结果,做个笔记

Continuous Conversion Mode:使能后,相比于单次转换模式,连续转换模式在打开ADC后一直转换。假如你单通道,在完成一次ADC转换后就停止了,而连续转换模式会一直转换,当你是多通道AN1 ,AN2,AN3,单次转换模式在把三个通道转换完一次后停止,而连续转换模式在转换完AN3后,会从新再次去转换。下面用个例程比较

例程一:

        while (1)
        {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        HAL_ADC_Start(&hadc);
      HAL_ADC_PollForConversion(&hadc,50);//
             if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))
             {
                 value_adc=HAL_ADC_GetValue(&hadc);
                 voltage=(float)value_adc/4095*3.3*11;
                
                printf("%f\r\n",voltage);
                printf("%d\r\n",value_adc);
                    HAL_Delay(500);
             }

输出结果

输出结果:

 留意此时ADC的值是在变化的,看着好像在连续的采样,但是你看程序,ADC的开启和等待转换的函数都是放在while()里的,我在网上查好像都是这样的例程。这时候你发现Continuous Conversion Mode选择ENABLE 和DISABLE没有区别。但是当你把  HAL_ADC_Start(&hadc);放到while()上面去,连续转换模式还是DISABLE,你就会发现此时ADC的值不变了,只是进行了一次转换.

其实就是转换了一次,printf函数一直在输出那次的ADC转换而已

此时,你把连续扫描模式ENABLE ,程序不动。你会发现ADC再次连续转换 

 

 

此时的输出结果是连续转换的,但是我发现此时ADC的值偏大,后来研究一下是采用周期太短的问题。之前Continuous Conversion Mode DISABLE,在while里连续转换,它的真正采用周期并不是你设置的ADC采用周期,而是你while()的循环周期,你多久 循环一次就进行一次采用。当你Continuous Conversion Mode DISABLE ENABLE时,就是上面ADC偏大的那种情况,此时你把周期调长,就可以了.(此时 HAL_ADC_Start(&hadc)放在while里和while外都一样)

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,以下是一个单通道连续转换ADC代码示例: ```c #include "stm32f4xx.h" void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //使能ADC1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能GPIOC时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //配置PC0作为ADC输入通道 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); //ADC配置 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12位模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //禁用扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式为右对齐 ADC_InitStructure.ADC_NbrOfConversion = 1; //转换通道数为1 ADC_Init(ADC1, &ADC_InitStructure); //配置ADC1通道11为采样通道,采样时间为15个时钟周期 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_15Cycles); //使能ADC1 DMA ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); //使能ADC1 ADC_Cmd(ADC1, ENABLE); //开始ADC转换 ADC_SoftwareStartConv(ADC1); } int main(void) { ADC_Configuration(); uint16_t adc_value; while (1) { //等待转换完成 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); adc_value = ADC_GetConversionValue(ADC1); //读取转换结果 } } ``` 在这个示例中,我们使用PC0作为ADC输入通道,并且配置了ADC1为12位模式、禁用扫描模式、开启连续转换模式、软件触发、右对齐、转换通道数为1。然后在主循环中使用ADC_GetFlagStatus函数等待转换完成,并使用ADC_GetConversionValue函数读取转换结果。 需要注意的是,由于使用了连续转换模式,所以在初始化时需要先配置采样通道,然后再开始转换。另外,由于使用了DMA,所以不需要在主循环中读取转换结果,转换结果会自动保存到指定的内存区域中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值