175 lines
4.1 KiB
C
175 lines
4.1 KiB
C
/*----------------------------------------------------------------*
|
||
* *
|
||
* 电池电压读取模块 *
|
||
* *
|
||
* 作者:钱向红 *
|
||
* *
|
||
* 时间:2017-02-10 *
|
||
* *
|
||
*----------------------------------------------------------------*/
|
||
|
||
#include "includes.h"
|
||
|
||
// 充放电改变标志
|
||
uint8_t bat_CurrentEvent = 0;
|
||
uint32_t Poweroff_time = 0;
|
||
|
||
// 颠倒字节顺序
|
||
uint16_t ntohs(uint16_t n)
|
||
{
|
||
uint8_t b1 = n >> 8;
|
||
uint8_t b0 = n & 0xFF;
|
||
|
||
return (b0 << 8) | b1;
|
||
}
|
||
|
||
uint32_t ntohl(uint32_t n)
|
||
{
|
||
uint8_t b3 = n >> 24;
|
||
uint8_t b2 = (n >> 16) & 0xFF;
|
||
uint8_t b1 = (n >> 8) & 0xFF;
|
||
uint8_t b0 = n & 0xFF;
|
||
|
||
return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
|
||
}
|
||
|
||
// 初始化引脚
|
||
void Battery_Init(void)
|
||
{
|
||
// EADC初始化和采样初始化一起
|
||
}
|
||
|
||
void Battery_Open()
|
||
{
|
||
// EADC初始化和采样初始化一起
|
||
}
|
||
|
||
uint32_t DS2788_ReadBattery(data_dtu_t *sample)
|
||
{
|
||
uint32_t adc = 0;
|
||
uint16_t uValue;
|
||
static uint8_t last_PowerStatus = 0;
|
||
uint8_t powerStatus;
|
||
S_RTC_TIME_DATA_T sRTC;
|
||
|
||
// 为了避免ADC模块的使用冲突,测量电压和传感器采样在一起执行
|
||
// 因称重传感器未用,故将电池电压的adc值存放在称重传感器的位置
|
||
// 此处直接取出使用
|
||
adc = dcBuff.sampleData.adWeight;
|
||
|
||
// 获取采样电压:单位mV (3000mv * 610K / 100K / 4096 = 4.4677734375,参考电压3v,100K/610K分压)
|
||
sample->batVoltage = adc * 4.4677734375;
|
||
// 电池电压补偿(测量误差)
|
||
sample->batVoltage += 80;
|
||
|
||
if(!dcBuff.configDisplay.op_SEND_GPS_DATA)
|
||
{
|
||
if(sample->batVoltage >= 3580)
|
||
sample->batPct = 100;
|
||
else if(sample->batVoltage >= 3510)
|
||
sample->batPct = 80;
|
||
else if(sample->batVoltage >= 3410)
|
||
sample->batPct = 60;
|
||
else if(sample->batVoltage >= 3310)
|
||
sample->batPct = 40;
|
||
else if(sample->batVoltage >= 3210)
|
||
sample->batPct = 20;
|
||
else if(sample->batVoltage >= 3110)
|
||
sample->batPct = 10;
|
||
else if(sample->batVoltage >= 3010)
|
||
sample->batPct = 5;
|
||
else
|
||
sample->batPct = 0;
|
||
|
||
sample->batMaxCapa = 65535;
|
||
adc = 78000ul / 100 * sample->batPct;
|
||
if(adc > 65535)
|
||
sample->batCapa = 65535;
|
||
else
|
||
sample->batCapa = adc;
|
||
}
|
||
else // 槽车-充电电池
|
||
{
|
||
if(sample->batVoltage >= 4180)
|
||
sample->batPct = 100;
|
||
else if(sample->batVoltage >= 4060)
|
||
sample->batPct = 90;
|
||
else if(sample->batVoltage >= 3980)
|
||
sample->batPct = 80;
|
||
else if(sample->batVoltage >= 3920)
|
||
sample->batPct = 70;
|
||
else if(sample->batVoltage >= 3870)
|
||
sample->batPct = 60;
|
||
else if(sample->batVoltage >= 3820)
|
||
sample->batPct = 50;
|
||
else if(sample->batVoltage >= 3790)
|
||
sample->batPct = 40;
|
||
else if(sample->batVoltage >= 3770)
|
||
sample->batPct = 30;
|
||
else if(sample->batVoltage >= 3740)
|
||
sample->batPct = 20;
|
||
else if(sample->batVoltage >= 3680)
|
||
sample->batPct = 10;
|
||
else if(sample->batVoltage >= 3450)
|
||
sample->batPct = 5;
|
||
else
|
||
sample->batPct = 0;
|
||
|
||
sample->batMaxCapa = 3000;
|
||
sample->batCapa = sample->batMaxCapa / 100 * sample->batPct;
|
||
}
|
||
|
||
sample->batTempr = 0;
|
||
|
||
// 检查充放电改变标志
|
||
powerStatus = VCC_POWER_STATUS();
|
||
if(powerStatus)
|
||
sample->batCurrent = 1;
|
||
else
|
||
sample->batCurrent = -1;
|
||
|
||
if(last_PowerStatus != powerStatus)
|
||
bat_CurrentEvent = 1;
|
||
else
|
||
bat_CurrentEvent = 0;
|
||
last_PowerStatus = powerStatus;
|
||
|
||
if(!dcBuff.configDisplay.op_SEND_GPS_DATA)
|
||
{
|
||
bat_veryLow = 0;
|
||
sample->batLow = 0;
|
||
}
|
||
else // 槽车-充电电池
|
||
{
|
||
// 电压低于3.77v(30%),为极低状态
|
||
// 电压高于3.82v(50%),解除极低状态
|
||
if(sample->batVoltage <= 3770)
|
||
bat_veryLow = 1;
|
||
if(sample->batVoltage >= 3820)
|
||
bat_veryLow = 0;
|
||
|
||
// 电压低于3.82v(50%),为低状态
|
||
// 电压高于3.92v(70%),解除低状态
|
||
sample->batLow = dcBuff.dtuData.batLow;
|
||
if(sample->batVoltage <= 3820)
|
||
sample->batLow = 1;
|
||
if(sample->batVoltage >= 3920)
|
||
sample->batLow = 0;
|
||
}
|
||
|
||
// 打印信息
|
||
printf("batVoltage:\t%.2f v\n", (sample->batVoltage / 10) / 100.0);
|
||
if(dcBuff.configDisplay.op_SEND_GPS_DATA)
|
||
{
|
||
printf("\nbat_veryLow:\t%d\n", bat_veryLow);
|
||
printf("batLow:\t\t%d\n", sample->batLow);
|
||
}
|
||
printf("batPct:\t\t%d %%\n", sample->batPct);
|
||
printf("batCapa:\t%d mAhr\n", sample->batCapa);
|
||
printf("batMaxCapa:\t%d mAhr\n", sample->batMaxCapa);
|
||
printf("batCurrent:\t%d mA\n", sample->batCurrent);
|
||
// printf("batTempr:\t%d ℃\n", sample->batTempr);
|
||
|
||
return TRUE;
|
||
}
|