96 lines
3.0 KiB
C
96 lines
3.0 KiB
C
|
|
#include "adc.h"
|
|||
|
|
#include "hlw8032.h"
|
|||
|
|
#include "oled.h"
|
|||
|
|
#include "main.h"
|
|||
|
|
#include "network.h"
|
|||
|
|
#include "led.h"
|
|||
|
|
#include "reset_log.h"
|
|||
|
|
#include <string.h>
|
|||
|
|
#include <stdio.h>
|
|||
|
|
|
|||
|
|
ADC_HandleTypeDef hadc1;
|
|||
|
|
|
|||
|
|
void adcInit(void)
|
|||
|
|
{
|
|||
|
|
ADC_ChannelConfTypeDef sConfig = {0};
|
|||
|
|
hadc1.Instance = ADC1;
|
|||
|
|
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
|||
|
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
|||
|
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
|||
|
|
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
|||
|
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
|||
|
|
hadc1.Init.NbrOfConversion = 1;
|
|||
|
|
if (HAL_ADC_Init(&hadc1) != HAL_OK) Error_Handler();
|
|||
|
|
|
|||
|
|
sConfig.Channel = ADC_CHANNEL_0;
|
|||
|
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
|||
|
|
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
|||
|
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint16_t getAdc(void)
|
|||
|
|
{
|
|||
|
|
uint16_t adc_value = 0;
|
|||
|
|
HAL_ADC_Start(&hadc1);
|
|||
|
|
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
|
|||
|
|
adc_value = HAL_ADC_GetValue(&hadc1);
|
|||
|
|
}
|
|||
|
|
HAL_ADC_Stop(&hadc1);
|
|||
|
|
return adc_value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void update_batter(void)
|
|||
|
|
{
|
|||
|
|
static _Bool powoff = 0;
|
|||
|
|
uint16_t adc_value = getAdc();
|
|||
|
|
float batter_valtage = adc_value * (3.3 / 4096.0);
|
|||
|
|
batter_valtage = batter_valtage * 11.0;
|
|||
|
|
batter_valtage += 0.6;
|
|||
|
|
batter_valtage = 100 * (batter_valtage - 10.8) / (12.6 - 10.8);
|
|||
|
|
/* <20><EFBFBD> 0~100%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷŵ<DDB7>ʱ 3.3V <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>ADC <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
if (batter_valtage < 0) batter_valtage = 0;
|
|||
|
|
if (batter_valtage > 100) batter_valtage = 100;
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD> <10% <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ⲿ 12V <20>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(5.5F)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD>
|
|||
|
|
* <EFBFBD>״ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 50ms <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><EFBFBD><EFBFBD> 2 <EFBFBD>Σ<EFBFBD>Լ 100ms <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD>ϵ紦<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD>Ȱѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 500ms <EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
if (batter_valtage < 10 && powoff == 0) {
|
|||
|
|
uint8_t confirm = 1;
|
|||
|
|
for (int k = 0; k < 2; k++) {
|
|||
|
|
HAL_Delay(50);
|
|||
|
|
adc_value = getAdc();
|
|||
|
|
float v = adc_value * (3.3 / 4096.0);
|
|||
|
|
v = v * 11.0 + 0.6;
|
|||
|
|
v = 100 * (v - 10.8) / (12.6 - 10.8);
|
|||
|
|
if (v >= 10) { confirm = 0; break; }
|
|||
|
|
}
|
|||
|
|
if (!confirm) return;
|
|||
|
|
|
|||
|
|
/* 1. <20>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD> OK<4F><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ~1.5s/<2F>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <20>Σ<EFBFBD>
|
|||
|
|
* 3 <EFBFBD>ζ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>ճ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܾͲ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD> */
|
|||
|
|
{
|
|||
|
|
static uint8_t pub_try = 0;
|
|||
|
|
if (NET_publish_power_wait(0) != 0 && ++pub_try < 3) return;
|
|||
|
|
pub_try = 0;
|
|||
|
|
}
|
|||
|
|
powoff = 1;
|
|||
|
|
log_info("> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d%%", (int)batter_valtage);
|
|||
|
|
|
|||
|
|
/* 2. <20><>Ļ<EFBFBD><C4BB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>չʾ 3 <20>루<EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><E3B9BB> */
|
|||
|
|
oled_clear();
|
|||
|
|
oled_locate(1, 0);
|
|||
|
|
oled_print("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>!");
|
|||
|
|
|
|||
|
|
hlw8032_save(); /* <20><><EFBFBD>ؼ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ԭ<EFBFBD><EFBFBD><F2A3A8B6>ܿ죩 */
|
|||
|
|
reset_log_power_loss();
|
|||
|
|
|
|||
|
|
/* 3. 3 <20><><EFBFBD><EFBFBD>Ϩ<EFBFBD><CFA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱҲ˳<D2B2><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>鷢<EFBFBD><E9B7A2><EFBFBD>ĵĿտ<C4BF>ʱ<EFBFBD>䣩<EFBFBD><E4A3A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ */
|
|||
|
|
HAL_Delay(3000);
|
|||
|
|
oled_off();
|
|||
|
|
NVIC_SystemReset();
|
|||
|
|
/* BootLoader <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>12V δ<>ָ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> APP<50><50><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>û<EFBFBD>ϵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
}
|
|||
|
|
/* LED1: <20>͵<EFBFBD><CDB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> */
|
|||
|
|
if (powoff) LED1_ON; else LED1_OFF;
|
|||
|
|
}
|