各位大神好,本人現在在做一個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)
{
}
}
uj5u.com熱心網友回復:


這個是我電壓采樣的程式,整個采樣周期=(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=https://bbs.csdn.net/topics/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=https://bbs.csdn.net/topics/ADC_GetConversionValue(ADC1); //
adc_value=https://bbs.csdn.net/topics/adc_value*adc_value; //
c=adc_value+c; //
}
c=c/19393;
c=sqrt(c);//
adc_value=https://bbs.csdn.net/topics/(3300*c)/4095;//
return adc_value;
ADC_Cmd(ADC1,DISABLE);//
RCC_HSICmd(DISABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);//
}
uj5u.com熱心網友回復:
求大神解答啊uj5u.com熱心網友回復:
0.27A就分5檔,本身差別就很小(不知道你的量程范圍是多少的芯片?)如果是-5A~5A的芯片,那就是在1/20的量程里要分5檔,另外噪聲都有21ma,其次你1。66V似乎就是靜態電壓,看起來像是算了平均值,而不是有效值
uj5u.com熱心網友回復:
早就搞定了,忘記結帖了,是演算法用的不對,無法正確計算有效值,也是因為數值太小uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/122155.html
標籤:單片機/工控
上一篇:TF卡復用
下一篇:Java NIO與Netty
