打印
[STM32L0]

关于AD的多通道切换

[复制链接]
1377|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zbcaich|  楼主 | 2020-8-30 15:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我在用ST的IKA02A1学习AD,开发板上分别是3个模块信号,参考电压对应着AD通道4,CO信号对应着AD通道8,温度信号对应着AD通道10。在AD初始化时,开启连续转换模式,后面直接读AD值,按理转换顺序应该是4-8-10这样子,但实际上却是4-10-8,请问大神们这是什么原因,代码主循环如下:
while (1)
  {
          HAL_ADC_DeInit(&hadc);                                                //关闭ad模块
        HAL_UART_DeInit(&huart2);                                        //关闭串口模块
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        HAL_IWDG_Refresh(&hiwdg);                                        //清看门狗
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);    //进入低功耗模式
        //rtc定时唤醒
       
        HAL_GPIO_TogglePin(LED_OUT);
        MX_ADC_Init();                                                                //重新初始化ad模块
        //定义3个转换通道4、8、10,扫描方式为0-18,意即转换秩序是4-8-10,但下面实际是4-10-8,费解
          MX_USART2_UART_Init();                                                //重新初始化串口模块
        HAL_ADC_Start(&hadc);                                                //启动ad转换 通道4是参考电压 通道8是co输出 通道10是温度探头
        while(!READ_BIT(ADC1->ISR, ADC_ISR_EOC));
        data[0]=HAL_ADC_GetValue(&hadc);                                //参考电压  通道4
        while(!READ_BIT(ADC1->ISR, ADC_ISR_EOC));
        data[1]=HAL_ADC_GetValue(&hadc);                                //本来这里应该是CO浓度通道8,但实际这里成了温度通道10
        Tem_T=(1864-(float)data[1]*3200/4095)/11.71;
        while(!READ_BIT(ADC1->ISR, ADC_ISR_EOC));
        data[2]=HAL_ADC_GetValue(&hadc);                                //本来这里应该是温度通道10,但实际这里成了co浓度通道8
        printf("REF=%d;CO=%d;T_V=%d;Temp=%0.1f\r\n",data[0],data[2],data[1],Tem_T);
        HAL_ADC_Stop(&hadc);
  }

使用特权

评论回复
沙发
zbcaich|  楼主 | 2020-8-30 15:56 | 只看该作者
本帖最后由 zbcaich 于 2020-8-30 15:58 编辑

开发板是ST的UNLECO for STM32L053,输出如图:

STM32L053_AD_TEST.png (61.71 KB )

STM32L053_AD_TEST.png

使用特权

评论回复
板凳
zbcaich|  楼主 | 2020-8-30 20:34 | 只看该作者
设置成禁止连续模式,然后每次都启动转换,就一切正常了。但这不是事,原来的问题还是没弄明白,就是开启连续转换,从低到高,转换通道的结果不是预想的那样。

使用特权

评论回复
地板
shipeng1989| | 2020-8-31 09:00 | 只看该作者
你这种情况最好开DMA去获取AD否则就不应该采用连续模式,无法保证读取与转换的时序同步,在你处理数据的过程中如果还有中断发生这时可能已经完成了2次AD转换了。

使用特权

评论回复
5
香水城| | 2020-8-31 10:18 | 只看该作者
可以肯定扫描时的转换顺序时确定的, 要么4\8\10,要么 10、8、4,具体取决于你的配置。

你感觉是那样,应该是误会,可能跟你的代码处理有关。比方就像楼上所言,采用DMA传输 再看看结果如何?

使用特权

评论回复
6
zbcaich|  楼主 | 2020-8-31 10:27 | 只看该作者
多谢2位大侠的关注,我用DMA试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

56

帖子

3

粉丝