以32位MCU-HY16F198實現(xiàn)AC電流量測應(yīng)用
一、 內(nèi)容簡介
本文將介紹以HY16F198搭配Hall Sensor(WCS1800)進(jìn)行交流電流數(shù)值量測,最大可量測電流范圍從0.1A~17.68A。本文實驗數(shù)據(jù)從0A~17.6A,比較使用電表Agilent 34401A與HY16F198透過交流信號計算出在不同頻率45Hz, 50Hz, 60Hz之間所得到的交流電流最大誤差率可以控制在3%以內(nèi)。
二、 原理說明
量測原理
透過WCS1800將感應(yīng)到的交流電流轉(zhuǎn)變?yōu)檩敵鲭妷?Vout),而輸出電壓(Vout)組成成分是包含(Vac)交流電壓訊號和(Vdc)直流電壓訊號混和而成的訊號,使用HY16F198量測輸出電壓(Vout)訊號,并且透過算法分析ADC Count數(shù)值,進(jìn)而換算出相對感測到的交流電流負(fù)載。但需注意,透過Hall Sensor(WCS1800)轉(zhuǎn)出每1安培(A)的輸出電壓最大誤差為正負(fù)6mV,詳細(xì)的Hall Sensor特性規(guī)格表顯示在下一頁電器特性表。
Hall Sensor(WCS1800)因為本身的輸出電壓(Vout)帶有Vac交流電壓加上Vdc直流電壓混和成分, 而Vdc的數(shù)值為1/2 Vdd,因此, 本文應(yīng)用使用HY16F198設(shè)定VDDA電壓為3V,并且于ADC緩存器內(nèi)設(shè)定ADC輸入?yún)⒖茧妷悍糯蟊稊?shù)為VREF*1/2(VREF= VRPS-VRNS),如把緩存器做為此設(shè)定, 可以準(zhǔn)確的量測到輸入電壓最大范圍1.5V。但是這樣的連接,就無法量測到Hall Sensor的Vout輸出電壓范圍,所以需要在外部增加兩個分壓電阻,在ADC的AIO(0)與VDDA和VSS之間各串10k奧姆電阻做分壓,因此量測到的電壓數(shù)值再透過交流信號計算分析求出感應(yīng)到的交流電流,并且由LCD Display做電流數(shù)值顯示。
控制芯片
單片機(jī)簡介:HY16F系列32位高性能Flash單片機(jī)(HY16F198)
(1) 采用最新Andes 32位CPU核心N801處理器。
(2) 電壓操作范圍2.2~3.6V,以及-40℃~85℃工作溫度范圍。
(3) 支持外部20MHz石英震蕩器或內(nèi)部16MHz高精度RC震蕩器,擁有多種CPU工作頻率切換選擇,可讓使用者達(dá)到最佳省電規(guī)劃。
(3.1) 運行模式 350uA@2MHz/2
(3.2) 待機(jī)模式 10uA@32KHz/2
(3.3) 休眠模式 2.5uA
(4) 程序內(nèi)存64KBytes Flash ROM
(5)數(shù)據(jù)存儲器8KBytes SRAM。
(6)擁有BOR and WDT功能,可防止CPU死機(jī)。
(7)24-bit高精準(zhǔn)度ΣΔADC模擬數(shù)字轉(zhuǎn)換器
(7.1)內(nèi)置PGA (Programmable Gain Amplifier)最高可達(dá)128倍放大。
(7.2)內(nèi)置溫度傳感器。
(8)超低輸入噪聲運算放大器。
(9)16-bit Timer A
(10)16-bit Timer B模塊具PWM波形產(chǎn)生功能
(11)16-bit Timer C 模塊具Capture/Compare 功能
(12)硬件串行通訊SPI模塊
(13)硬件串行通訊I2C模塊
(14)硬件串行通訊UART模塊
(15)硬件RTC時鐘功能模塊
(16)硬件Touch KEY功能模塊
三、 系統(tǒng)設(shè)計
硬件說明
HY16F198搭配Hall Sensor連接電路如下,AIO1與Hall Sensor的Vout接,AIO0透過10k電組分壓電路連接在VDDA與VSS之間,這樣就可以量測到帶有1/2VDDA的交流電壓訊號。
主要組件介紹
(1) MCU:HY16F198,功能為量測電信號、控制、運算包含功能為儲存校正參數(shù)。
(2) LCD Display:負(fù)責(zé)顯示量測出來的電流數(shù)值。
(3) 10K奧姆分壓電路 : 主要做為分壓電路應(yīng)用,可以量測到帶有1/2VDDA的交流電壓訊號。
(4) Hall Sensor : 將感應(yīng)到的交流電流轉(zhuǎn)換為Vac加上Vdc的混合電壓輸出訊號。
函式使用說明 :
1. void AC_DataCount(int index, int ADC_Data) : 把量測到的ADC Data轉(zhuǎn)換成AC Data。
int index : 代表所量測到的ADC Data資料筆數(shù)。
int ADC_Data : 使用HY16F198 ADC所量測到的ADC Data數(shù)值。
2. long long AC_Algorithm(void) : AC Data透過交流信號算法計算出電流數(shù)值。
一、 范例程序
/*----------------------------------------------------------------------------*/
/* MAIN function */
/*----------------------------------------------------------------------------*/
int main(void)
{
long long AC_Value;
DisplayInit();
ClearLCDframe();
Delay(10000);
DisplayHYcon();
Delay(1000);
MCUSTATUSbits._byte = 0;
Count=0;
InitalADC();
SYS_EnableGIE(7,0x1FF); //Enable GIE(Global Interrupt)
while(1)
{
if(MCUSTATUSbits.b_ADCdone) //b_ADCdone=1 execute below[!--empirenews.page--]
{
MCUSTATUSbits.b_ADCdone=0;
AC_Value = AC_Algorithm(); // To do AC algorithm and to show current value
AC_Value=AC_Value/0.5770; // Using 60HZ gain value, calibrate at 2000mA
LCD_DATA_DISPLAY(AC_Value); //Display AC Value
Count=0;
DrvADC_CombFilter(0);
DrvADC_ClearIntFlag();
DrvADC_EnableInt();
DrvADC_CombFilter(1);
}
}
return 0;
}
/*--------------------------------------------------------------------*/
/* ADC Interrupt Subroutines */
/*--------------------------------------------------------------------*/
void HW2_ISR(void)
{
int ADCData;
if(DrvADC_ReadIntFlag())
{
DrvADC_ClearIntFlag();
ADCData=DrvADC_GetConversionData();
AC_DataCount(Count++,ADCData); // AC Algorithm : to get ADCData
if(Count>=AC_DataLen) //to do 4096 times
{
DrvADC_DisableInt();
MCUSTATUSbits.b_ADCdone=1;
}
}
}
/*--------------------------------------------------------------------*/
/* ADC Initialization Subroutines */
/*--------------------------------------------------------------------*/
void InitalADC(void)
{
//Set ADC input pin
DrvADC_SetADCInputChannel(ADC_Input_AIO1,ADC_Input_AIO0); //Set the ADC positive/negative input voltage source.
DrvADC_InputSwitch(OPEN); //ADC signal input (positive and negative) short(VISHR) control.
DrvADC_RefInputShort(OPEN); //Set the ADC reference input (positive and negative) short(VRSHR) control.
DrvADC_Gain(ADC_PGA_Disable,ADC_PGA_Disable); //Input signal gain for modulator.
DrvADC_DCoffset(0); //DC offset input voltage selection (VREF=REFP-REFN)
DrvADC_RefVoltage(VDDA,VSSA); //Set the ADC reference voltage.
DrvADC_FullRefRange(1); //Set the ADC full reference range select.
//0: Full reference range input
//1: 1/2 reference range input
DrvADC_OSR(10); //10 : OSR=32
DrvADC_CombFilter(ENABLE); //Enable OSR
DrvADC_ClkEnable(0,1); //Setting ADC CLOCK ADCK=HS_CK/6 & Rising edge is high
//Set VDDA voltage
DrvPMU_VDDA_LDO_Ctrl(E_VDD3V);
DrvPMU_BandgapEnable();
DrvPMU_REFO_Enable();
DrvPMU_AnalogGround(ENABLE); //ADC analog ground source selection.
//1 : Enable buffer and use internal source(need to work with ADC)
//Set ADC interrupt
DrvADC_EnableInt();
DrvADC_ClearIntFlag();
DrvADC_Enable();
}