# 2021Capacitance **Repository Path**: XMUT-PFA/capacitance ## Basic Information - **Project Name**: 2021Capacitance - **Description**: fun_fix是软件最终版本 readme是超级电容说明文档 master是硬件+外壳 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: fun_fix - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-04-16 - **Last Updated**: 2025-12-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: 超级电容 ## README # capacitance-超级电容-技术手册 ## 基本情况 * 本仓库为2021赛季最终版本 后续赛季如有更改需新建仓库存放超级电容的资料 此仓库不再更改 * 作者:廖哲林,张粤炫 ## 底层逻辑 ### 超级电容工作机理 ![请添加图片描述](https://img-blog.csdnimg.cn/f871a07198e347f097473daac69dc64e.png) ## 超级电容代码逻辑 ```cpp int main(void) { ALL_INIT(); while (1) { MODE_SELECT(MODE); HAL_Delay(10); } } ``` ### ALL_INIT()所有模块的初始化函数 其余的adc,oled之类的初始化都在这里,这里比较重点的是继电器的变化 ```cpp #define CHARGE_OFF HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); //充电继电器关闭 #define MOTOR_EMC HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); //电机紧急状态(直通后级) #define CHARGE_ON HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); //充电继电器开启 #define MOTOR_CAP HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); //电机电容模式 ``` ```cpp void ALL_INIT(void) { u8 i; HAL_ADCEx_Calibration_Start(&hadc1); HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value_STA, 300);//ADC DMA传输开启 OLED_Init(); CHARGE_OFF;//CHARGE_OFF MOTOR_EMC; SET_DAC_VAL(DAC_CHANNEL_1,0.5);//充电电流 1.4-3.38A 1.3-3.09A 1.2-2.84A 1.1-2.62A 1.0-2.39A 0.9-2.15A 0.8-1.94A 0.7-1.71A 0.6-1.47A 0.5-1.22A 0.4-1.01A 0.3-0.78A 0.2-0.55A 0.1-0.33A 0.0-0.2A SET_DAC_VAL(DAC_CHANNEL_2,2.3);//充电电压 2.3-21v HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //PWM HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2); //PWM HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3); //PWM __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); OLED_CLS(); OLED_DrawBMP(20,0,54,6,BMP1); OLED_ShowStr(0,7,"Design By LiaoZheLin",1);//显示字符串 OLED_ShowStr(70,3,"PFA",2);//显示字符串 BEEP_ON; HAL_Delay(500); BEEP_OFF; OLED_CLS(); for(i=0;i<2;i++) { OLED_ShowCN(i*16,0,i);//电容电压 OLED_ShowCN(i*16,2,i+2);//电容电压 OLED_ShowCN(i*16,4,i+4);//电容电压 OLED_ShowCN(i*16,6,i+6);//电容电压 OLED_ShowCN(i*16+92,0,i+8);//电容电压 OLED_ShowCN(i*16+92,4,i+10);//电容电压 } // KEY=KEY_Scan(); // if(KEY==0)MODE=MODE_ONLINE; // else if(KEY==1)MODE=MODE_OFFLINE; // else if(KEY==2)MODE=MODE_EMC; // else if(KEY==3)MODE=MODE_TEST; // else MODE=MODE_ONLINE; MODE=MODE_ONLINE; HAL_TIM_Base_Start_IT(&htim5); __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); //串口6使能UART_IT_RXNE 视觉 HAL_UART_Receive_DMA(&huart1,rx_buff,2);//串口6DMA接收初始化 } ``` * 第52行和53行 充电继电器关闭,直通后级状态,此时便是初始状态,也就是整块超级电容被短路,相当于直接去掉。 * 第85行直接选择了超级电容的工作模式:在线模式 ### MODE_SELECT(MODE) * 因为在初始化的85行中选择了在线模式,所以第二部为在线模式 * 在线模式分为三个阶段,无限循环 ```cpp switch(mode) { case MODE_ONLINE:{ //在线模式 //蓝灯情况 //////////////////////第一个步骤////////////////////////////////////////////////// if(STATE_FLAG==1)// 第一次进入,低于17V时 30W+直通后级充电, { if(ADC_Value_Ture[1]<17)//电容电压小于17 开始充电 直通后级 { HAL_Delay(20); if(ADC_Value_Ture[1]<17) { LED.LED_COLOR(BLUE_,100); CHARGE_ON; MOTOR_EMC; SET_DAC_VAL(DAC_CHANNEL_1,0.5);//充电电流 1.4-3.38A 1.3-3.09A 1.2-2.84A 1.1-2.62A 1.0-2.39A 0.9-2.15A 0.8-1.94A 0.7-1.71A 0.6-1.47A 0.5-1.22A 0.4-1.01A 0.3-0.78A 0.2-0.55A 0.1-0.33A 0.0-0.2A SET_DAC_VAL(DAC_CHANNEL_2,2.1);//充电电压 2.3-21v } } else if(ADC_Value_Ture[1]>=17) { HAL_Delay(20); if(ADC_Value_Ture[1]>=17) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11, GPIO_PIN_SET); LED.LED_COLOR(GREEN_,100); CHARGE_ON; MOTOR_CAP; STATE_FLAG=2; } } } ``` #### 第一个步骤 1. 刚开机的状态,电容里面消耗光的情况下,超级电容会先给电容充电,继电器为直通后级,也就是此时如果底盘超功率是直接会被裁判系统检测到并且扣血,所以一定要有反馈信号,就是起码要能区别此时是否是直通后级,如果是的话用ui画个标记,体现操作手此时要慢速。 2. 如果充满电,则关闭直通后级模式,打开电容模式 ```cpp ////////////////////////////第二个步骤//////////////////////////////////////////// else if(STATE_FLAG==2) // { if(ADC_Value_Ture[1]