[STM32L1] 电流检测

[复制链接]
 楼主| huanghuac 发表于 2021-7-3 10:40 | 显示全部楼层 |阅读模式
现在在做一个STM32L151+ACS722电流检测的项目。但ACS722芯片网上案例较少,测下来会遇到采样的电压不准确的问题
jiajs 发表于 2021-7-3 10:42 | 显示全部楼层
楼主详细说说怎么回事啊,这么说太笼统了
 楼主| huanghuac 发表于 2021-7-3 10:48 | 显示全部楼层
我的项目会有五个等级的电流传到ACS中,传入芯片的最大电流等级0.27A,最小等级电流才0.09A。我用示波器测量了下,ACS722出来的电压是基于1.66V左右,50HZ的正弦交流电压,峰峰值才100mV内的电压。我采样由ACS722传出来的电压,然后写了个方均根算法计算一个周期内的电压有效值,程序中未启用DMA,但测量下来发现五个等级对应的有效值几乎差不多,不清楚是什么原因
stly 发表于 2021-7-3 10:48 | 显示全部楼层
ADC配置看看
 楼主| huanghuac 发表于 2021-7-3 10:52 | 显示全部楼层
单通道采样,精度2的12次方,不采用DMA,AC采样频率是16MHZ,转换周期4Cycles。

void ADC_Config(u8 ADC_Channel)
{
        ADC_InitTypeDef ADC_InitStructure;                                                                                                                        //

        RCC_HSICmd(ENABLE);                                             //
        
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);            //

        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;          //
        
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;                   //
        
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;              //
        
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//
        
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;          //
        
        ADC_InitStructure.ADC_NbrOfConversion = 1;                      //
        
        ADC_Init(ADC1, &ADC_InitStructure);                             //
        
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1 ,ADC_SampleTime_4Cycles);//
        
        ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);

  /* Enable ADC1 Power Down during Delay */
        ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);      //
        
        ADC_Cmd(ADC1,ENABLE);                                          //
        
  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)
  {
  }

}
 楼主| huanghuac 发表于 2021-7-3 10:54 | 显示全部楼层
 楼主| huanghuac 发表于 2021-7-3 10:56 | 显示全部楼层
这个是我电压采样的程序,整个采样周期=(12.5+4)/16=1.03125μs ,电压周期20ms=20000μs , 采样点数N=20000/1.03125=19393,算法采用方均根计算电压有效值,也利用延时避开了电压不稳的时间。但最后还是无法区分不同大小的电压,几乎传回的电压值都为1660mV上下。但示波器测量下,最大的电压值峰峰值有近200mV,最小的峰峰值几乎为0mv,按说应该能区分,为何无法区分开?
 楼主| huanghuac 发表于 2021-7-3 10:58 | 显示全部楼层

double ADC_DataAcquire(void)
{
        double c=0;                                     //
        
        double adc_value=0;                                                                                                                        
        
        u16 sample_counter;                             
        
        ADC_Config(ADC_Channel_0);                      //
        
        Delay_TIM6_1ms(100);
        
        for (sample_counter=0;sample_counter<19393;sample_counter++)
        {
               
                ADC_SoftwareStartConv(ADC1);                    //开启连续转换

                while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)        //等待转换结束
                {
                }        
                adc_value=ADC_GetConversionValue(ADC1);       //
        
                adc_value=adc_value*adc_value;                //
               
                c=adc_value+c;                               //
        
        }
        
           c=c/19393;
        
          c=sqrt(c);//
        
          adc_value=(3300*c)/4095;//
               
        
          return adc_value;
        
         ADC_Cmd(ADC1,DISABLE);//
        
          RCC_HSICmd(DISABLE);//
        
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);//
        

}
 楼主| huanghuac 发表于 2021-7-3 11:00 | 显示全部楼层
 楼主| huanghuac 发表于 2021-7-3 11:02 | 显示全部楼层
chenjunt 发表于 2021-7-3 11:05 | 显示全部楼层
改软件结构,太差不能这么写。
 楼主| huanghuac 发表于 2021-7-3 11:09 | 显示全部楼层
您能具体指出来一下么 不胜感激
 楼主| huanghuac 发表于 2021-7-3 11:12 | 显示全部楼层
百度了下非正弦周期交流电压的有效值计算,那么按照计算公式,我这个案例中直流分量在1.66V,也就是说我这个案例的有效值²=1.66²+[(u1-1.66)²+(u2-1.66)²+...+(un-1.66)²]/n,其中u1,u2...un为我采样点压的瞬时值,不晓得这样理解正确与否。
 楼主| huanghuac 发表于 2021-7-3 11:16 | 显示全部楼层
搞定了,结贴,是我之前计算有效值的方法有误,现在先计算出平均值即直流有效值,然后在将每一个瞬间电压扣除有效值之后平方和再平均再开根号即可得出交流有效值
dingy 发表于 2021-7-3 11:16 | 显示全部楼层
资料少的话 只能是自己各种尝试了
 楼主| huanghuac 发表于 2021-7-3 11:19 | 显示全部楼层

好的,我明天去单位试一下,多谢各位大侠了哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

772

主题

8473

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部