打印
[STM32L1]

【STM32L151】STM32+ACS722的电流检测问题求教

[复制链接]
2502|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大神好,本人现在在做一个STM32L151+ACS722电流检测的项目。但ACS722芯片网上案例较少,测下来会遇到采样的电压不准确的问题,具体程序和问题见2楼
沙发
Woodstockers|  楼主 | 2018-1-15 23:13 | 只看该作者
我的项目会有五个等级的电流传到ACS中,传入芯片的最大电流等级0.27A,最小等级电流才0.09A。我用示波器测量了下,ACS722出来的电压是基于1.66V左右,50HZ的正弦交流电压,峰峰值才100mV内的电压。我采样由ACS722传出来的电压,然后写了个方均根算法计算一个周期内的电压有效值,程序中未启用DMA,但测量下来发现五个等级对应的有效值几乎差不多,不清楚是什么原因,程序和示波器截图见下
这是我ADC配置,单通道采样,精度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)
  {
  }

}




IMG_8873.JPG (357.12 KB )

两个等级下的输出电压

两个等级下的输出电压

使用特权

评论回复
评论
xch 2018-1-17 23:23 回复TA
交流信号是50Hz及其整倍数的情况,可以使用梳妆滤波器。20mS采样过程对称均匀分布采样点,可以将20ms采样数据简单进行算数平均获得需要扣除直流... 
Woodstockers 2018-1-17 22:06 回复TA
@xch :刚百度了下,貌似我在误区里面,我这个电压是基于某个值上下波动的类正弦波,有效值应该是各次谐波有效值平方求和再开根号,我再试试。 
Woodstockers 2018-1-17 21:47 回复TA
@xch :其实还有一个问题不明白,不论交流直流,不都是可以用方均根来计算有效值么 
Woodstockers 2018-1-17 21:46 回复TA
@xch :感谢感谢 怎样从软件上滤出DC分量呢?是用采样的值先减去1660mv以后再计算有效值么 
xch 2018-1-17 12:00 回复TA
你的计算公式是错的。 采样出来的数值包含Voffset DC分量,和信号的VAC分量。先得滤除DC分量,然后才能计算VAC的有效值。 
板凳
Woodstockers|  楼主 | 2018-1-15 23:28 | 只看该作者
这个是我电压采样的程序,整个采样周期=(12.5+4)/16=1.03125μs ,电压周期20ms=20000μs , 采样点数N=20000/1.03125=19393,算法采用方均根计算电压有效值,也利用延时避开了电压不稳的时间。但最后还是无法区分不同大小的电压,几乎传回的电压值都为1660mV上下。但示波器测量下,最大的电压值峰峰值有近200mV,最小的峰峰值几乎为0mv,按说应该能区分,为何无法区分开?

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);//
       

}

IMG_8866.JPG (323.99 KB )

IMG_8866.JPG

IMG_8865.JPG (379.28 KB )

IMG_8865.JPG

使用特权

评论回复
地板
Woodstockers|  楼主 | 2018-1-16 12:39 | 只看该作者
求大神指教啊

使用特权

评论回复
5
一周一天班| | 2018-1-16 12:52 | 只看该作者
改软件结构,太差不能这么写。

使用特权

评论回复
6
Woodstockers|  楼主 | 2018-1-16 17:35 | 只看该作者
一周一天班 发表于 2018-1-16 12:52
改软件结构,太差不能这么写。

您能具体指出来一下么 不胜感激

使用特权

评论回复
7
Woodstockers|  楼主 | 2018-1-17 22:18 | 只看该作者
本帖最后由 Woodstockers 于 2018-1-17 22:33 编辑

按照二楼大神给出的建议,我又去百度了下非正弦周期交流电压的有效值计算,那么按照计算公式,我这个案例中直流分量在1.66V,也就是说我这个案例的有效值²=1.66²+[(u1-1.66)²+(u2-1.66)²+...+(un-1.66)²]/n,其中u1,u2...un为我采样点压的瞬时值,不晓得这样理解正确与否。。。。

使用特权

评论回复
8
Woodstockers|  楼主 | 2018-1-19 23:38 | 只看该作者
搞定了,结贴,是我之前计算有效值的方法有误,现在先计算出平均值即直流有效值,然后在将每一个瞬间电压扣除有效值之后平方和再平均再开根号即可得出交流有效值

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝