硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4994|回复: 7
收起左侧

[ADC] STM32H7的ADC问题

[复制链接]

7

主题

30

回帖

51

积分

初级会员

积分
51
发表于 2020-10-26 17:51:56 | 显示全部楼层 |阅读模式
本帖最后由 ZHANGHAO 于 2020-10-27 08:38 编辑

我用STM32H743的ADC采集电压,参考电压用的3.6V,来检测两个3.3V
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.NbrOfConversion = 2;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc1.Init.OversamplingMode = DISABLE;

这是ADC的配置,ADC的时钟是50M



我用的DMA传输数据
          HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
          HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_Value, 100);

这是ADC相关的值的定义
        __attribute__((at(0x24000000))) uint16_t AD_Value[100]={0};
          uint32_t AD_IN2;
          uint32_t AD_IN5;

在主函数里面把ADC的数值打印出来
                AD_IN2 = 0;
                AD_IN5 = 0;
                HAL_IWDG_Refresh(&hiwdg1);
                for(int i = 0; i < 100;){
                        AD_IN2 = AD_IN2 + AD_Value[i++];
                        HAL_IWDG_Refresh(&hiwdg1);
                        AD_IN5 = AD_IN5 + AD_Value[i++];
                        HAL_IWDG_Refresh(&hiwdg1);
                }
                AD_IN2 = AD_IN2 / 50;
                AD_IN5 = AD_IN5 / 50;               
          ReadRtcTime(CurrentTime);
                HAL_UART_Transmit(&huart1,(uint8_t *)CurrentTime,strlen(CurrentTime),0xffff);

                printf("\r\n******** ADC DMA Example ********\r\n\r\n");
    printf(" ADC1 IN2 = %1.3fV \r\n", AD_IN2*3.6f/65535);
    printf(" ADC1 IN5 = %1.3fV \r\n", AD_IN5*3.6f/65535);




刚开始的时候系统主频设置的是480M,但是现在发现这个主频电流太大,但是降到240的时候打印出来的数据是空,并且打印的数据也不全,下面是不正常的打印
        ADC1 IN2 = 2020-10-20 11:35:10
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:12
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:13
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:14
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:15
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:16
******** ADC DMA Example ******** ADC1 IN2 = 2020-10-20 11:35:17
******** ADC DMA Example ******** ADC1 IN2 =

        
               

正常打印出来应该像下面这样的
******** ADC DMA Example ********

ADC1 IN2 = 3.317V
ADC1 IN5 = 3.291V
2020-10-20 11:54:07
******** ADC DMA Example ********

ADC1 IN2 = 3.294V
ADC1 IN5 = 3.267V
2020-10-20 11:54:08
******** ADC DMA Example ********

ADC1 IN2 = 3.297V
ADC1 IN5 = 3.272V
2020-10-20 11:54:09
******** ADC DMA Example ********

ADC1 IN2 = 3.295V
ADC1 IN5 = 3.270V
2020-10-20 11:54:10
******** ADC DMA Example ********

ADC1 IN2 = 3.319V
ADC1 IN5 = 3.292V

我进入仿真模式看到的AD_Value的值是对的,但是打印不行,50平均的运算也不行,不知道什么地方的问题


我把采集位数由16降到12,由降到8位都是这样的问题,我只是把主频降了下,其余的都没有动,不知道是怎么回事,帮忙看看,我想降主频还能正常采集ADC,谢谢了

QQ图片20201026174546.png

这是ADC时钟配置

这是ADC时钟配置
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-10-27 02:34:05 | 显示全部楼层
1、你说的参考电压是REF电压基准接的电压,这个为什么你要选择的是3.6V,而不是和MCU一样的3.3之类的。
2、另外就是16bit分辨率的情况下,ADC时钟是50MHz是超频。
回复

使用道具 举报

7

主题

30

回帖

51

积分

初级会员

积分
51
 楼主| 发表于 2020-10-27 08:37:21 | 显示全部楼层
eric2013 发表于 2020-10-27 02:34
1、你说的参考电压是REF电压基准接的电压,这个为什么你要选择的是3.6V,而不是和MCU一样的3.3之类的。
2 ...

1、为什么选3.6V,因为我的电池电压是3.6V如果参考电源是3.3V测试不了3.6V的电压,如果分压的话,就会一直有一个电流,因为是低功耗的东西,就想把电流降到最低,我就用了一个升压芯片把参考电压升到了3.6V
2、ADC时钟是用的cubeMXP配置生成的,用的PLL2P,在ADC初始化的时候有个分频因数选的2分频
回复

使用道具 举报

7

主题

30

回帖

51

积分

初级会员

积分
51
 楼主| 发表于 2020-10-27 11:52:06 | 显示全部楼层
现在发现频率降低,ADC转换是正常的,就打印不对,主频升级到480M时打印就是正常的,好奇怪,这个浮点数打印和主频关联这么严重吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-10-27 12:02:43 | 显示全部楼层
ZHANGHAO 发表于 2020-10-27 08:37
1、为什么选3.6V,因为我的电池电压是3.6V如果参考电源是3.3V测试不了3.6V的电压,如果分压的话,就会一 ...

1、不太好,实际电池这种小负载应该有4.x,最好分压。
2、把ADC时钟再降低到25MHz,看看正常不。
回复

使用道具 举报

7

主题

30

回帖

51

积分

初级会员

积分
51
 楼主| 发表于 2020-10-27 13:30:42 | 显示全部楼层
eric2013 发表于 2020-10-27 12:02
1、不太好,实际电池这种小负载应该有4.x,最好分压。
2、把ADC时钟再降低到25MHz,看看正常不。

用的是锂亚电池,电压很稳的,3.6基本没有额外的,我仿真发现主要是影响打印,480M能够正常打印出来,但是240M就没有办法正常打印,但是采样值是有的,好奇怪,浮点数打印难道需要这么高的主频吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-10-28 09:39:29 | 显示全部楼层
ZHANGHAO 发表于 2020-10-27 13:30
用的是锂亚电池,电压很稳的,3.6基本没有额外的,我仿真发现主要是影响打印,480M能够正常打印出来,但 ...

如果仅仅是打印问题,使用SEGGER RTT打印试试,这个速度快。
回复

使用道具 举报

7

主题

30

回帖

51

积分

初级会员

积分
51
 楼主| 发表于 2020-10-28 15:17:38 | 显示全部楼层
eric2013 发表于 2020-10-28 09:39
如果仅仅是打印问题,使用SEGGER RTT打印试试,这个速度快。

谢谢,我试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 06:52 , Processed in 0.253078 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表