ADC中断 电流值异常问题

void getPowSum(void)
{
    
    static uint16_t i = 0;
    //基准电流采样 12323
	
//    static uint16_t ia_buffer[MEDIAN_FILTER_SIZE] = {0}; 
//    uint16_t filtered_IA = medianFilter(ia_buffer, ADC_Value.value.IA);

    // 采样数据累加
    ADC_Value.value.MV_16500_ISUM_a += ADC_Value.value.IA;
    //ADC_Value.value.MV_16500_ISUM_a += ADC_Value.value.IA;
    ADC_Value.value.MV_16500_ISUM_b += ADC_Value.value.IB; 
    ADC_Value.value.MV_16500_ISUM_c += ADC_Value.value.IC;
    ADC_Value.value.MV_16500_ISUM_ref += ADC_Value.value.MV_16500;
//    if(i >= 3000)
//    {  
//       printf("ADC_Value.value.IA = %d\r\n",ADC_Value.value.IA);
//       printf("ADC_Value.value.IB = %d\r\n",ADC_Value.value.IB);
//       printf("ADC_Value.value.IC = %d\r\n",ADC_Value.value.IC);
//       printf("ADC_Value.value.MV_16500 = %d\r\n",ADC_Value.value.MV_16500);
//       i = 0;
//    }
//    i++;
       //printf("ADC_Value.value.MV_16500 = %d\r\n",ADC_Value.value.MV_16500);
    if(ref_flag == 1)//1.65V的基准电压已经算好
    {   
		DMA_Disable(DMA1_CHANNEL_1);
        if (ADC_Value.value.IA >= ADC_Value.value.MV_16500_I)
        {
           // temp = ADC_Value.value.IA - ADC_Value.value.MV_16500_ISUM_a_ref;
			temp = (ADC_Value.value.IA - ADC_Value.value.MV_16500_I);
			test = 1;
			if(temp>1000)
			{
				test = 1;
			}	
        }
        else
        {
          //  temp = ADC_Value.value.MV_16500_ISUM_a_ref - ADC_Value.value.IA;
			temp = (ADC_Value.value.MV_16500_I - ADC_Value.value.IA);
			test = 2;
			if(temp>1000)
			{
				test = 1;
			}	
        }
        ADC_Value.value.ADC_Iin_Sum_a += (uint32_t)temp * temp;
		if(ADC_Value.value.ADC_Iin_Sum_a>=200000)
		{
			ADC_Value.value.ADC_Iin_Sum_a = ADC_Value.value.ADC_Iin_Sum_a;
		}	
        if (ADC_Value.value.IB >= ADC_Value.value.MV_16500_I)
        {
            temp =abs(ADC_Value.value.IB - ADC_Value.value.MV_16500_I);
        }
        else
        {
            temp =abs(ADC_Value.value.MV_16500_I- ADC_Value.value.IB);
        }
        ADC_Value.value.ADC_Iin_Sum_b += (uint32_t)temp * temp;
        // printf("ADC_Value.value.ADC_Iin_Sum_b = %d\r\n",ADC_Value.value.ADC_Iin_Sum_b);
        if (ADC_Value.value.IC >= ADC_Value.value.MV_16500_I)
        {
            temp = abs(ADC_Value.value.IC  - ADC_Value.value.MV_16500_I);
        }
        else
        {
            temp = abs(ADC_Value.value.MV_16500_I - ADC_Value.value.IC);
        }
        ADC_Value.value.ADC_Iin_Sum_c += (uint32_t)temp * temp;
        //printf("ADC_Value.value.ADC_Iin_Sum_c = %d\r\n",ADC_Value.value.ADC_Iin_Sum_c);
        sum_flag = 1;   
		DMA_Enable(DMA1_CHANNEL_1);	
    }
}

代码如图所示,DMA在计算的时候进行失能,计算完毕之后再使能

ADC中断 电流值异常问题_第1张图片ADC中断 电流值异常问题_第2张图片

如果不加DMA失能,值会错乱

你可能感兴趣的:(算法)