159 lines
4.0 KiB
C
159 lines
4.0 KiB
C
/*----------------------------------------------------------------*
|
||
* *
|
||
* 电池电压读取模块 *
|
||
* *
|
||
* 作者:钱向红 *
|
||
* *
|
||
* 时间:2017-02-10 *
|
||
* *
|
||
*----------------------------------------------------------------*/
|
||
|
||
#include "includes.h"
|
||
|
||
// 充放电改变标志
|
||
uint8_t bat_CurrentEvent = 0;
|
||
uint32_t Poweroff_time = 0;
|
||
|
||
// 初始化引脚
|
||
void Battery_Init(void)
|
||
{
|
||
// ADC初始化和采样初始化一起
|
||
}
|
||
|
||
void Battery_Open()
|
||
{
|
||
// ADC初始化和采样初始化一起
|
||
}
|
||
|
||
uint32_t DS2788_ReadBattery(data_dtu_t *sample)
|
||
{
|
||
uint32_t adc = 0;
|
||
static uint8_t last_PowerStatus = 0;
|
||
uint8_t powerStatus;
|
||
int16_t voltMulti = 1; // 电压倍数
|
||
|
||
// 为了避免ADC模块的使用冲突,测量电压和传感器采样在一起执行
|
||
// 因称重传感器未用,故将电池电压的adc值存放在称重传感器的位置
|
||
// 此处直接取出使用
|
||
adc = dcBuff.sampleData.adWeight;
|
||
|
||
// 获取采样电压:单位mV (3000mv * 610K / 100K / 4095 = 4.468864,参考电压3.0v,100K/610K分压)
|
||
sample->batVoltage = adc * 4.468864;
|
||
// 电池电压补偿(测量误差)
|
||
sample->batVoltage += 80;
|
||
|
||
// 电池串联节数
|
||
if(sample->batVoltage >= 5800)
|
||
voltMulti = sample->batVoltage / 2900;
|
||
|
||
if(!dcBuff.configDisplay.op_SEND_GPS_DATA)
|
||
{
|
||
if(sample->batVoltage >= 3580 * voltMulti)
|
||
sample->batPct = 100;
|
||
else if(sample->batVoltage >= 3510 * voltMulti)
|
||
sample->batPct = 80;
|
||
else if(sample->batVoltage >= 3410 * voltMulti)
|
||
sample->batPct = 60;
|
||
else if(sample->batVoltage >= 3310 * voltMulti)
|
||
sample->batPct = 40;
|
||
else if(sample->batVoltage >= 3210 * voltMulti)
|
||
sample->batPct = 20;
|
||
else if(sample->batVoltage >= 3110 * voltMulti)
|
||
sample->batPct = 10;
|
||
else if(sample->batVoltage >= 3010 * voltMulti)
|
||
sample->batPct = 5;
|
||
else
|
||
sample->batPct = 0;
|
||
|
||
sample->batMaxCapa = 65535;
|
||
adc = 76000ul / 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;
|
||
}
|