/***************************************************************************
*File: ADC.c
- Description: Interface driver for the 500 Series Z-Wave Single Chip
-
built-in ADC sample data
- Author: pandy
- Revision: V1.0
- Date: 2018-5-22
****************************************************************************/
#include <ZW_typedefs.h>
#include “zw050X.h”
#include <INTRINS.H>
#include “ZW_appltimer_api.h”
/IO control/
#include <ZW_pindefs.h>
#include <ZW_evaldefs.h>
#include “zw_uart_api.h”
#include “ISD51.h”
#include “zw_timer_api.h”
#include “zw_adcdriv_api.h”
#include “eeprom.h”
#define Vbg 1230
#define batterLowWarningValue 2750
#define ZW_DEBUG_ADC_MON 0xff
/-------------------------private data-----------------------/
#ifdef ZW_DEBUG_ADC_MON
#define ZW_DEBUG_BATT_ADC_SEND_BYTE(data) ZW_DEBUG_SEND_BYTE(data)
#define ZW_DEBUG_BATT_ADC_SEND_STR(STR) ZW_DEBUG_SEND_STR(STR)
#define ZW_DEBUG_BATT_ADC_SEND_NUM(data) ZW_DEBUG_SEND_NUM(data)
#define ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(data) ZW_DEBUG_SEND_WORD_NUM(data)
#define ZW_DEBUG_BATT_ADC_SEND_NL() ZW_DEBUG_SEND_NL()
#else
#define ZW_DEBUG_BATT_ADC_SEND_BYTE(data)
#define ZW_DEBUG_BATT_ADC_SEND_STR(STR)
#define ZW_DEBUG_BATT_ADC_SEND_NUM(data)
#define ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(data)
#define ZW_DEBUG_BATT_ADC_SEND_NL()
#endif
WORD adc_value=0;
static WORD battLevel;
WORD SumBatt;
static WORD battVol;
static BYTE battState;
BOOL startBatteryVoltageMeasurement=TRUE;
BOOL awatingBatteryVoltageMeasurement=TRUE;
BYTE getBattPercent; //µç³Ø°Ù·Ö±È
WORD tempVal,getAdcValue=0xffff;
extern XBYTE battValve;
void ADC_Init()
{
// Set ADC to battery monitoring mode, other parameters are ignored ADC_BATT_MULTI_MODE ADC_BATT_SINGLE_MODE
ZW_ADC_init(ADC_BATT_MULTI_MODE, ADC_REF_U_VDD, ADC_REF_L_VSS, 0);
// Set auto zero period
ZW_ADC_auto_zero_set(ADC_AZPL_128);
// Set ADC resolution
ZW_ADC_resolution_set(ADC_12_BIT);
}
/*================================================================*/
/16ת»»10½øÖÆ/
WORD decChangeOc(WORD inputDigit)
{
WORD re=0;//
WORD n=1;//
while(inputDigit!=0)
{
re += (inputDigit%10)*n;
inputDigit /= 10;
n *= 16;
}
return re;
}
/*=ADC_actor===============/
/adc start sample/
void ADC_actor(BOOL bState,BOOL pSample)
{
WORD tempVal;
if (bStatestartBatteryVoltageMeasurement)
{
// Power up ADC
ZW_ADC_power_enable(TRUE);
// Start ADC
ZW_ADC_enable(TRUE);
// battState=awatingBatteryVoltageMeasurement;
}
if(pSampleawatingBatteryVoltageMeasurement)
{
do{battLevel=ZW_ADC_result_get();}
while ( battLevel == ADC_NOT_FINISHED );
// battLevel=ZW_ADC_result_get();
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n----battLevel= ");
ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(battLevel);
// if((battLevel!= ADC_NOT_FINISHED))
{
// Calc battery level in mV (Vbg is the band gab voltage)
battVol=(DWORD)Vbg4096/(DWORD)battLevel; // Return battery voltage in mV
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n----adc volage= ");
ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(decChangeOc(battVol));
if(battVol>=3000)
{
getBattPercent=100;
}
if((battVol>batterLowWarningValue)&&(battVol<2998))
{
tempVal=((battVol-batterLowWarningValue));//3000-2750=250
getBattPercent=(BYTE)(tempVal*0.4);//100/250=0.25
}
if(battVol<=batterLowWarningValue)
{
getBattPercent=0xff;
}
MemoryPutByte((WORD)&EEOFFSET_BATTER_far,getBattPercent);//batterlevel saves eeprom
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n----getBattPercent= ");
ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(getBattPercent);
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n");
// Power down ADC
ZW_ADC_power_enable(FALSE);
}
}
}
/*=ADC_Get===============*/
/adc sample/
void ADC_Get()
{
BYTE i,j,z;
BYTE Max = 1,Min = 1;
WORD Adc_Buf[11];
// Power up ADC
ZW_ADC_power_enable(TRUE);
// Start ADC
ZW_ADC_enable(TRUE);
for(z=0;z<200;z++);
for(i=0;i<11;i++)//»ñÈ¡5 ADCÖµ
{
getAdcValue=ZW_ADC_result_get();
if((getAdcValue!= ADC_NOT_FINISHED))
{
// ZW_DEBUG_BATT_ADC_SEND_STR("\r\n—ii= ");
// ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(i);
Adc_Buf[i] = getAdcValue;
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n---getAdcValue= ");
ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(getAdcValue);
// Power down ADC
// ZW_ADC_power_enable(FALSE);
}
}
for(j=1;j<11;j++)
{
if(Adc_Buf[Max] < Adc_Buf[j])
{
Max = j;
}
if(Adc_Buf[Min] > Adc_Buf[j])
{
Min = j;
}
SumBatt +=Adc_Buf[j];
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n----SumBatt= ");
ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(SumBatt);
}
// battLevel=(SumBatt-Adc_Buf[Max]-Adc_Buf[Min]);
battLevel=SumBatt/10;
ZW_DEBUG_BATT_ADC_SEND_STR("\r\n----battLevel= ");
ZW_DEBUG_BATT_ADC_SEND_WORD_NUM(battLevel);
// Calc battery level in mV (Vbg is the band gab voltage)
battVol=(DWORD)Vbg*4096/(DWORD)battLevel; // Return battery voltage in mV
ZW_DEBUG_SEND_STR("\r\n-adc volage=");
ZW_DEBUG_SEND_WORD_NUM(decChangeOc(battVol));
if(battVol>=3000)
{
getBattPercent=100;
}
if((battVol>batterLowWarningValue)&&(battVol<2998))
{
tempVal=((battVol-batterLowWarningValue));//3000-2750=250
getBattPercent=(BYTE)(tempVal*0.4);//100/250=0.25
}
if(battVol<=batterLowWarningValue)
{
getBattPercent=0xff;
}
battValve=getBattPercent;
// MemoryPutByte((WORD)&EEOFFSET_BATTER_far,getBattPercent);//batterlevel saves eeprom
ZW_DEBUG_SEND_STR("\r\n-getBattPercent=");
ZW_DEBUG_SEND_WORD_NUM(getBattPercent);
ZW_DEBUG_SEND_STR("\r\n");
// Power down ADC
// ZW_ADC_power_enable(FALSE);
// ZW_ADC_enable(FALSE);
}
//--------------------------------------------------------------------------
//È¥µô×î´óÖµ×îСֵÔÙÆ½¾ù
WORD AdcSmpAvg(WORD getADC)
{
DWORD ADCData;
BYTE i;
BYTE Max = 0,Min = 0;
WORD Adc_Buf[10];
ADCData = getADC;
for(i=0;i<10;i++)
{
Adc_Buf[i] = 0;
}
for(i=0;i<10;i++)
{
if(Adc_Buf[Max] < Adc_Buf[i])
{
Max = i;
}
if(Adc_Buf[Min] > Adc_Buf[i])
{
Min = i;
}
ADCData +=Adc_Buf[i];
}
ADCData=(ADCData-Adc_Buf[Max]-Adc_Buf[Min])/8;
return (WORD)ADCData;
}
//----------------------------------------------------------------------------
/------------------------------------------------------
**parameter: Null
** return£º µçÁ¿°Ù·Ö±È
------------------------------------------------------/
BYTE getBatteryValue()
{
// battValve=MemoryGetByte((WORD)&EEOFFSET_BATTER_far);//getBattPercent;
// battValve=getBattPercent;
return (battValve);
}
/------------------------------------------------------
**parameter: benble------TRUE STOP
** FALSE …
------------------------------------------------------/
void ADC_Stop()
{
ZW_ADC_enable(FALSE);
}
/****************************************************************
**File: adc.h
**auther:pandy
**date: 2018-3-14
**chagne:
******************************************************************/
#ifndef _ADC__H
#define _ADC__H
void ADC_Init();
void ADC_actor(BOOL bState,BOOL pSample);
BYTE getBatteryValue();
void ADC_Get();
#endif