#include "bsp.h" #include "math.h" #include "stdio.h" CHARGER_t charger; BAT_TYPE_t BAT_TYPE[] = { /* 序列号 节数 最小电压 最大电压 目标电压 目标电流 单节目标 电池类型 电池名称 */ {0, 1, 3.3, 4.2, 4.2, 1.0, 4.2, Li_Poly, "Li_Poly"}, {1, 1, 3.3, 4.2, 4.2, 1.0, 4.2, Li_Poly, "Li_Poly_H"}, {2, 1, 3.3, 4.2, 4.2, 1.0, 4.2, Li_Poly, "Li_ion"}, {3, 1, 3.3, 4.2, 4.2, 1.0, 4.2, Li_Poly, "Li_Fe"} }; //所有底层初始化 void bsp_init(void) { memset((unsigned char *)&charger,0,sizeof(charger)); //注册底层驱动函数 charger.battery[0].set = &bat_1_set; charger.battery[1].set = &bat_2_set; charger.battery[2].set = &bat_3_set; charger.battery[3].set = &bat_4_set; charger.battery[4].set = &bat_5_set; charger.battery[5].set = &bat_6_set; charger.battery[6].set = &bat_7_set; charger.battery[7].set = &bat_8_set; charger.battery[8].set = &bat_9_set; charger.battery[9].set = &bat_10_set; charger.battery[10].set = &bat_11_set; charger.battery[11].set = &bat_12_set; charger.battery[12].set = &bat_13_set; charger.battery[13].set = &bat_14_set; charger.battery[14].set = &bat_15_set; charger.battery[15].set = &bat_16_set; charger.battery[16].set = &bat_17_set; charger.battery[17].set = &bat_18_set; charger.battery[18].set = &bat_19_set; charger.battery[19].set = &bat_20_set; charger.battery[20].set = &bat_21_set; charger.battery[21].set = &bat_22_set; charger.battery[22].set = &bat_23_set; charger.battery[23].set = &bat_24_set; charger.battery[0].get = &bat_1_voltage; charger.battery[1].get = &bat_2_voltage; charger.battery[2].get = &bat_3_voltage; charger.battery[3].get = &bat_4_voltage; charger.battery[4].get = &bat_5_voltage; charger.battery[5].get = &bat_6_voltage; charger.battery[6].get = &bat_7_voltage; charger.battery[7].get = &bat_8_voltage; charger.battery[8].get = &bat_9_voltage; charger.battery[9].get = &bat_10_voltage; charger.battery[10].get = &bat_11_voltage; charger.battery[11].get = &bat_12_voltage; charger.battery[12].get = &bat_13_voltage; charger.battery[13].get = &bat_14_voltage; charger.battery[14].get = &bat_15_voltage; charger.battery[15].get = &bat_16_voltage; charger.battery[16].get = &bat_17_voltage; charger.battery[17].get = &bat_18_voltage; charger.battery[18].get = &bat_19_voltage; charger.battery[19].get = &bat_20_voltage; charger.battery[20].get = &bat_21_voltage; charger.battery[21].get = &bat_22_voltage; charger.battery[22].get = &bat_23_voltage; charger.battery[23].get = &bat_24_voltage; charger.fan.init = &fan_init; charger.fan.set = &fan_set; charger.fan.get = &bat_temperature; charger.fan.state = &fan_state; charger.power.init = &power_init; charger.power.set_current = &power_set; charger.power.get_power = &pwr_all_voltage; charger.power.get_current = &bat_current; charger.power.get_voltage = &bat_all_voltage; charger.power.state = &power_state; charger.relay.init = &relay_init; charger.relay.set = &relay_set; charger.relay.state = &relay_state; //初始化设备 for(int i = 0;i < 24;i++) { charger.battery[i].set(1); } charger.fan.init(); charger.power.init(); charger.relay.init(); //参数初始化 //charger.target_voltage = 4.2; charger.battery_type = 0; charger.working = 0;//参数选择阶段 charger.mode = 0; charger.step = 0; charger.bat_info.count = 24; init_uart_fifos(); } //=========================读取电池电压================================ #define BAT_INJECT_TIMES (1U) uint32_t value_bat1 = 0; double bat_1_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_1_set(0); HAL_Delay(1); bat_1_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_1_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //value_bat1 = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_2_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_2_set(0); HAL_Delay(1); bat_2_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_2_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_3_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_3_set(0); HAL_Delay(1); bat_3_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_3_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_4_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_4_set(0); HAL_Delay(1); bat_4_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_4_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_5_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_5_set(0); HAL_Delay(1); bat_5_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_5_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_6_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_6_set(0); HAL_Delay(1); bat_6_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_6_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_7_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_7_set(0); HAL_Delay(1); bat_7_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_7_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_8_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_8_set(0); HAL_Delay(1); bat_8_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_8_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_9_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_9_set(0); HAL_Delay(1); bat_9_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_9_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_10_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_10_set(0); HAL_Delay(1); bat_10_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_10_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_11_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_11_set(0); HAL_Delay(1); bat_11_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_11_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_12_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_12_set(0); HAL_Delay(1); bat_12_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_12_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_13_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_13_set(0); HAL_Delay(1); bat_13_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_13_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_14_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_14_set(0); HAL_Delay(1); bat_14_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_14_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_15_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_15_set(0); HAL_Delay(1); bat_15_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_15_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_16_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_16_set(0); HAL_Delay(1); bat_16_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_16_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_17_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_17_set(0); HAL_Delay(1); bat_17_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_17_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_18_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_18_set(0); HAL_Delay(1); bat_18_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_18_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_19_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_19_set(0); HAL_Delay(1); bat_19_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_19_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_20_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_20_set(0); HAL_Delay(1); bat_20_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_20_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_21_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_21_set(0); HAL_Delay(1); bat_21_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_21_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_22_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_22_set(0); HAL_Delay(1); bat_22_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_22_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_23_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_23_set(0); HAL_Delay(1); bat_23_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_23_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; // v = (adc/4096) * 2 * 3.3 //返回 return voltage; } double bat_24_voltage(void) { double voltage = -1; /* for(unsigned char i = 0; i< BAT_INJECT_TIMES; i++) { bat_24_set(0); HAL_Delay(1); bat_24_set(1); HAL_Delay(1); } */ //设置成0,接通电容和运放 bat_24_set(0); //读取电压 uint32_t value = adc_value(ADC_BAT_SINGLE); //计算电压 voltage = (value /2048.0) * 3.3; //返回 return voltage; } //读取电流 //fifo UART_RX_FIFO_t uart1_TTL_1_rx; UART_TX_FIFO_t uart1_TTL_1_tx; UART_RX_FIFO_t uart2_RS232_1_rx; UART_TX_FIFO_t uart2_RS232_1_tx; UART_RX_FIFO_t uart4_RS232_2_rx; UART_TX_FIFO_t uart4_RS232_2_tx; UART_RX_FIFO_t uart5_RS485_1_rx; UART_TX_FIFO_t uart5_RS485_1_tx; void init_uart_fifos(void) { /* #if UART1_RX_ENABLE if (UART_RX_FIFO_open(&uart1_TTL_1_rx, "UART1RX", &huart1, UART1_RX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_RX_FIFO_uninit(&uart1_TTL_1_rx); #endif #if UART1_TX_ENABLE if (UART_TX_FIFO_open(&uart1_TTL_1_tx, "UART1TX", &huart1, UART1_TX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_TX_FIFO_uninit(&uart1_TTL_1_tx); #endif #if UART2_RX_ENABLE if (UART_RX_FIFO_open(&uart2_RS232_1_rx, "UART2RX", &huart2, UART2_RX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_RX_FIFO_uninit(&uart2_RS232_1_rx); #endif #if UART2_TX_ENABLE if (UART_TX_FIFO_open(&uart2_RS232_1_tx, "UART2TX", &huart2, UART2_TX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_TX_FIFO_uninit(&uart2_RS232_1_tx); #endif #if UART4_RX_ENABLE if (UART_RX_FIFO_open(&uart4_RS232_2_rx, "UART4RX", &huart4, UART4_RX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_RX_FIFO_uninit(&uart4_RS232_2_rx); #endif #if UART4_TX_ENABLE if (UART_TX_FIFO_open(&uart4_RS232_2_tx, "UART4TX", &huart4, UART4_TX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_TX_FIFO_uninit(&uart4_RS232_2_tx); #endif #if UART5_RX_ENABLE if (UART_RX_FIFO_open(&uart5_RS485_1_rx, "UART5RX", &huart5, UART5_RX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_RX_FIFO_uninit(&uart5_RS485_1_rx); #endif #if UART5_TX_ENABLE if (UART_TX_FIFO_open(&uart5_RS485_1_tx, "UART5TX", &huart5, UART5_TX_ENABLE, UART_FIFO_DMA)) { Error_Handler(); } #else UART_TX_FIFO_uninit(&uart5_RS485_1_tx); #endif */ } int fputc(int ch, FILE *f) { unsigned char buff; //UART_TX_FIFO_write(&debug_tx, &buff, 1); return (ch); }