NANO130_H2Press/User/adc_bat.c

175 lines
4.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*----------------------------------------------------------------*
* *
* 电池电压读取模块 *
* *
* 作者:钱向红 *
* *
* 时间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参考电压3v100K/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;
}