硬汉嵌入式论坛

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

[ADC] STM32H745的ADC的采样值超过了设置的分辨率

[复制链接]

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2021-5-10 10:12:07 | 显示全部楼层 |阅读模式


大佬们,,最近的项目发现,我H745双核的ADC有问题。
现象是我配置的是16位分辨率的AD,发现竟然会出现超过65536的AD值,请问这是什么情况

分析是我这个变量ADC_GetDMA_Buf是采集DMA的,我有个判断大于65536就记录下来,然后通过网络发送,发现并没有超过65536的,




void ADC1_Class::ADC1_DATA_Deal_Average(void)
{
         uint16_t i=0,j=0,MAX_POS=0,MIN_POS=0,k=0,m=0;
   uint32_t val[ADC1_SIMPLE_NUM]={0};
         uint32_t val_sum[ADC1_CHANNAL_NUM]={0};
                                                //采集个数    通道数
   uint32_t val1_Sort[ADC1_SIMPLE_NUM][ADC1_CHANNAL_NUM]={0};//5 5
         
         if(__HAL_DMA_GET_FLAG(&DMAx_Handler,DMA_FLAG_TCIF1_5))
        {
                        SCB_InvalidateDCache_by_Addr((uint32_t*)ADC_GetDMA_Buf,sizeof(ADC_GetDMA_Buf));
                         __HAL_DMA_CLEAR_FLAG(&DMAx_Handler,DMA_FLAG_TCIF1_5);
           // count++;
                //采集DMA数据
                         for(i=0;i<ADC1_CHANNAL_NUM;i++)//5
                  {
                    for(j=0;j<total_ADC_Transfer_Amount;j+=ADC1_CHANNAL_NUM) //5*5=25
                          {
                //5 5
                val1_Sort[m] = ((ADC_GetDMA_Buf[i+j]));               
                                        m++;
                                                        if(val1_Sort[m]>65536)
                                                {
                                                        if(i==0)
                                                                UWV_Copper_Loss.U_Copper_Loss = (int) val1_Sort[m];
                                                        else if(i==1)
                                                                UWV_Copper_Loss.V_Copper_Loss = (int) val1_Sort[m];
                                                        else if(i==2)
                                                                UWV_Copper_Loss.W_Copper_Loss = (int)val1_Sort[m];
                                                }       
                          }
                                m=0;
                  }
//                       
                        //每个通道的数据转换成一维数组,
            for(i=0;i<ADC1_CHANNAL_NUM;i++)//5
                  {
                    for(j=0;j<ADC1_SIMPLE_NUM;j+=1) //5
                          {
               
                val[j] =  val1_Sort[j];
                               
                          }
                                       
                               
                                        //每个通道都找到最大最小值的位置,并赋值0
                       
                                        //找到最大值
                                MAX_POS = ADC_Public_Cal_Fun_Class::Find_MAX_VAL_POS(val,ADC1_SIMPLE_NUM,i);
                                MIN_POS = ADC_Public_Cal_Fun_Class::Find_MIN_VAL_POS(val,ADC1_SIMPLE_NUM,i);
                                 
                                        val1_Sort[MAX_POS] =0;
                                        val1_Sort[MIN_POS] =0;

                               
                                //每个通道的累加和
                                  for(k=0;k<ADC1_SIMPLE_NUM;k+=1) //
                          {
       
                 val_sum +=  val1_Sort[k];               
                                       
                          }       
                                ADC1_Class::ADC_Average_Val =  (uint32_t)(val_sum/(ADC1_SIMPLE_NUM-2));
                  
                 }
                           
                         ubADCDualConversionComplete = SET;
        }

           if(ubADCDualConversionComplete==SET )
                {

                          ubADCDualConversionComplete=RESET;
          }
}






上面代码的ADC_Average_Val是经过累加然后平均后的值,居然是8W多,反正就超过了65536,

这是我用网络发送上来的。用python记录的数据,右边的是ADC_Average_Val,我做了一个判断,大于65536就输出65536.然后除以10发送上来。



我就好奇了。为什么会这样
提示::
我这个AD是采集电机的电流的,当该路AD的电压值没有超过3.3V时,是正常的。一旦超过3.3V,就不正常了。PS:超过3.3V之后我有一个限位电路。能稳定到3.3V.

那假如稳定不到3.3V,AD值会超过65536吗,,大佬们有什么意见。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-5-10 11:56:16 | 显示全部楼层
你这个用的查询,中断还是DMA方式,可以考虑把每个采样的值都打印出来看下更好。

回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2021-5-10 14:07:33 | 显示全部楼层
eric2013 发表于 2021-5-10 11:56
你这个用的查询,中断还是DMA方式,可以考虑把每个采样的值都打印出来看下更好。

用的是DMA,用的是判断的 val1_Sort[m],每个采样值大于65536就赋值给一个变量,,可是都为0,,那就是没有,好奇怪,
可是累加出来就有8W多
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2021-5-10 14:08:51 | 显示全部楼层
eric2013 发表于 2021-5-10 11:56
你这个用的查询,中断还是DMA方式,可以考虑把每个采样的值都打印出来看下更好。

我的怀疑是,H7的ADC的DR寄存器是32位的,虽然我配置的是16位的AD,可是我的AD输入超过了3.3V,那么AD就出问题了,,就超过了65536的值,因为DR不止16位
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-5-11 07:50:22 | 显示全部楼层
啃瓜子的猫 发表于 2021-5-10 14:08
我的怀疑是,H7的ADC的DR寄存器是32位的,虽然我配置的是16位的AD,可是我的AD输入超过了3.3V,那么AD就 ...

方便的话,把你的DMA和ADC配置代码贴下。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 15:34 , Processed in 0.320415 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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