|
大佬们,,最近的项目发现,我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吗,,大佬们有什么意见。
|
|