基于HY16F198和霍尔传感器实现电流数值测量系统的设计

描述

一,内容简介

本文将介绍以HY16F198搭配霍尔传感器(WCS1800)进行交流电流数值量测,最大可量测电流范围从0.1A〜17.68A。本文实验数据从0A〜17.6A,比较使用电表安捷伦34401A与HY16F198透过交流信号计算出在不同频率在45Hz,50Hz的60Hz的之间所得到的交流电流最大误差率可以控制在3%以内。

二,说明原理

量测原理

透过WCS1800将感应到的交流电流转变为输出电压(Vout),而输出电压(Vout)组成包含(Vac)交流电压讯号和(Vdc)直流电压讯号混和并变成的讯号,并使用HY16F198量测输出电压(Vout)讯号,并通过算法分析ADC计数数值,进而换算出相对感测到的交流电流负载。但需注意,透过霍尔传感器(A)的输出电压最大误差为正负为6mV,详细的霍尔传感器(WCS1800)转出每1安培特性规格表显示在下一页电器特性表。

霍尔传感器(WCS1800)因为本身的输出电压(VOUT)带有吸尘器交流电压加上Vdc的直流电压混和成分,而伏的数值为1/2 Vdd时,因此,本文应用使用HY16F198设置VDDA电压为3V,并且在ADC缓存器内部设置ADC输入参考电压放大倍数为VREF * 1/2(VREF = VRPS-VRNS),如把缓存器做设置设定,可以准确的量测到输入电压最大范围1.5V。但是这样的连接,就无法量测到Hall Sensor的Vout输出电压范围,所以需要在外部增加两个分压电阻,在ADC的AIO(0)与VDDA和VSS之间各串10k奥姆电阻做分压,因此量测到的电压数值再透过交流信号计算分析求出感应到的交流电流,并且由LCD显示器做电流数值显示。

图1霍尔传感器

adc

图2框图结构

控制芯片

单片机简介:HY16F系列32位高性能闪存单片机(HY16F198)

adc

图3 HY16F198

(1)采用最新安第斯山脉32位CPU核心N801处理器

(2)电压操作范围2.2〜3.6V,以及-40℃〜85℃工作温度范围。

(3)支持外部的20MHz石英震荡器或内部16MHz的高精度RC震荡器,拥有多种CPU工作频率切换选择,可让使用者达到最佳省电规划。

(3.1)运行模式350uA @ 2MHz的/ 2(3.2)待机模式为10uA @ 32KHz的/ 2(3.3)休眠模式2.5uA(4)程序内存64K字节闪存ROM(5)数据存储器8K字节的SRAM(

(3.2)待机模式10uA @ 32KHz / 2

(3.3)休眠模式2.5uA

(4)程序内存64KBytes Flash ROM

(5)数据存储器8KBytes SRAM。

(6)拥有6)具有BOR和WDT功能,可防止CPU死机。BOR和WDT功能,可防止CPU死机。

(7)24位高精密度ΣΔADC模拟数字转换器(7.1)内置PGA(可编程增益放大器)最高可达128倍放大。

(7.2)内置温度传感器。

(8)超低输入噪声运算放大器。

(9) )16位定时器A

(10)16位定时器B模块具PWM波形产生功能

(11)16位定时器C模块具捕获/比较功能

(12)硬件串行通讯SPI模块

(13)硬件串行通讯I2C模块

(14)硬件串行通讯UART模块

(15)硬件RTC时钟功能模块

(16)硬件Touch KEY功能模块

三,系统设计

硬件说明

HY16F198搭配Hall Sensor连接电路如下,AIO1与Hall Sensor的Vout接,AIO0透过10K电组分压电路连接在VDDA与VSS之间,这样就可以量测到带有1 / 2VDDA的交流电压讯号。

adc

图4线路硬件连接图

主要组件介绍(1) MCU:HY16F198,功能为量测电信号、控制、运算包含功能为储存校正参数。

(2) LCD Display:负责显示量测出来的电流数值。

(3) 10K奥姆分压电路:主要做为分压电路应用,可以量测到带有1/2VDDA的交流电压讯号。

(4) Hall Sensor :将感应到的交流电流转换为Vac加上Vdc的混合电压输出讯号。

函式使用说明:1. void AC_DataCount(int index, int ADC_Data) :把量测到的ADC Data转换成AC Data. int index :代表所量测到的ADC Data资料笔数。

int ADC_Data :使用HY16F198 ADC所量测到的ADC Data数值。

2. long long AC_Algorithm(void) : AC Data透过交流信号算法计算出电流数值。

一、范例程序

/*——*/ /* 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 { 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();}

责任编辑:gt

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分