最大電流采樣500A,主要應用在電力上的對某個電網(wǎng)進行瞬時功率,平均功率,總功率采集
通過STM32微控制器,對電網(wǎng)信號進行采樣處理
設(shè)計參數(shù)
(1) 電壓參數(shù) 0-105V
(2)電流參數(shù) 0-500mA,0-5A,0-500A
(3) 最大頻率成分 <25kHz
(4) AD采樣率600kHz(方便處理),功率采樣率300kHz
結(jié)果輸出:每秒通過串口將p、P、W發(fā)送到PC端
這是整體電路
我們主要分析電流采樣這塊
電流采樣這塊采用精密零漂移電流檢測放大器U3 LTC6102,VIN輸入最高為105V(電網(wǎng)的電壓經(jīng)過變壓器整流降壓的),通過外部檢測電阻RoutX和RoutX_ADJ (分流 電阻) 兩端的電壓來監(jiān)測電流(0-500ma,0-5A,0-500A)。內(nèi)部電路將輸入 電壓轉(zhuǎn)換為輸出電流,使得大共模電壓上的小檢 測信號可以轉(zhuǎn)換為以地為基準的信號。低直流失 調(diào)電壓支持使用非常小的分流電阻值和較大的 增益設(shè)置電阻。電流精度可以達到10ma,電流采樣電阻采用大功率Rsense 1mR,最大檢測電流達到電網(wǎng)的500A。下圖最右邊是對電流采樣原理和計算公式。
對電流采樣采用二階低通濾波器,這個是一個有源濾波器,用工作在線性區(qū)的集成運放和 RC 網(wǎng)絡(luò)組稱,實際上是一種具有特定頻 率響應的放大器,主要濾除電網(wǎng)負載的波動
具體原理如下:
U3的輸出經(jīng)過PR2、CC2、PR1、CC1構(gòu)成二階低通濾波電路,R1、Rf1、Rf1_ADJ構(gòu)成同相比例放大電路,Rf1_ADJ可以調(diào)節(jié)電路的放大倍數(shù),這是計算公式
在集成運放U2輸出到集成運放同相輸入之間并聯(lián)電容CC2引入一個負反饋,主要作用是,在不同的頻段,反饋的極性不相同,當信號頻率f>>f0時(f0 為截止頻率),電路的每級RC 電路的相移趨于-90º,兩級RC 電路的移相到-180º,電路的輸出電壓Vout與輸入電壓Vin的相位相反,故此時通過電容CC2引到集成運放同相端的反饋是負反饋,反饋信號將起著削弱輸入信號的作用,使電壓放大倍數(shù)減小,所以該反饋將使二階有源低通濾波器的幅頻特性高頻端迅速衰減,只允許低頻端信號通過。其特點是輸入阻抗高,輸出阻抗低。
下圖是低通濾波器的頻率特性曲線
我們對電流采樣的同時也對電網(wǎng)負載的電壓進行實時采集,就是說電壓和電流是同步采集。
具體原理如下
電網(wǎng)負載電壓LOAD_VCC經(jīng)過電阻VR2、VR1、VR1_ADJ分壓,把電網(wǎng)的高電壓變成低電壓給運放U4濾波采集,和上面的電流采樣原理一樣
下圖是電壓采樣頻率特性圖
最后是功率數(shù)據(jù)處理
我們采用DMA采樣并傳輸數(shù)據(jù)
通過調(diào)整緩沖區(qū)大小,可調(diào)整DMA中斷周期
具體的功率計算如下
瞬時功率
平均功率
總功率
源碼分析,ADC初始化
void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
//DMA1 通道1
/* DMA1 channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_VAL;//
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//從外設(shè)讀取數(shù)據(jù)
DMA_InitStructure.DMA_BufferSize = (CHANNEL*BUFFER_SIZE);//3KB (HW)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設(shè)地址不變
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//DMA地址增加
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//16bit
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//16bit
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_ClearITPendingBit(DMA1_IT_TC1);
DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE);//DMA1傳輸完成中斷
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC獨立轉(zhuǎn)換模式,相對于雙重模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//掃描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉(zhuǎn)換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);
// ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_28Cycles5);
/* ADC1 regular channel configuration */
//AD采樣率為12000K/(7.5+12.5)=600K
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_7Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
}
上面也說了我們采用DMA中斷來采集
//DMA1中斷優(yōu)先級最高(約5.3ms)
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//DMA1 中斷服務(wù)程序
void DMA1_Channel1_IRQHandler()
{
if(DMA_GetITStatus(DMA1_IT_TC1))
{
DMA_ClearITPendingBit(DMA1_IT_TC1);
//CALIBRATE_U_I();//校準模式
CALCULATE_POWER();//計算功率模式
}
}
計算功率
//瞬時功率
INSTANT_POWER_W = (double)INSTANT_POWER*CONVERT_FACTOR_P_5_A;
//平均功率
AVE_POWER = INSTANT_POWER_SUM/CYCLE_COUNT;
AVE_POWER_W = (double)AVE_POWER*CONVERT_FACTOR_P_5_A;
SUM_OF_POWER += AVE_POWER;
//總功率
SUM_OF_POWER_WH = (double)SUM_OF_POWER*CONVERT_FACTOR_P_5_A*CONVERT_FACTOR_WH;
// printf("INSTANT_POWER_W: %f\r\n",INSTANT_POWER_W);
// printf("AVE_POWER_W: %f\r\n",AVE_POWER_W);
// printf("SUM_OF_POWER_WH: %.10f\r\n",SUM_OF_POWER_WH);
printf("p: %.3fw P: %.3fw W: %.3fwh\r\n",INSTANT_POWER_W,AVE_POWER_W,SUM_OF_POWER_WH);