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

西雅图传达室 2018-01-15 11:49:32
各位大神好,本人现在在做一个STM32L151+ACS722电流检测的项目。但ACS722芯片网上案例较少,测下来会遇到采样的电压不准确的问题。


我的项目会有五个等级的电流传到ACS中,传入芯片的最大电流等级0.27A,最小等级电流才0.09A。我用示波器测量了下,ACS722出来的电压是基于1.66V左右,50HZ的正弦交流电压,峰峰值最大200mV内的电压。我采样由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)
{
}

}

...全文
1057 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2019-06-06
  • 打赏
  • 举报
回复
西雅图传达室 2019-06-02
  • 打赏
  • 举报
回复
早就搞定了,忘记结帖了,是算法用的不对,无法正确计算有效值,也是因为数值太小
worldy 2018-01-17
  • 打赏
  • 举报
回复
0.27A就分5档,本身差别就很小(不知道你的量程范围是多少的芯片?)如果是-5A~5A的芯片,那就是在1/20的量程里要分5档,另外噪声都有21ma, 其次你1。66V似乎就是静态电压,看起来像是算了平均值,而不是有效值
西雅图传达室 2018-01-16
  • 打赏
  • 举报
回复
求大神解答啊
西雅图传达室 2018-01-15
  • 打赏
  • 举报
回复


这个是我电压采样的程序,整个采样周期=(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);//


}

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧