123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- #include "light_driver.h"
- #include "speed_sensor.h"
- MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3] =
- {
- {GPIOB, GPIO_PIN_4|GPIO_PIN_5}, //前灯6V
- {GPIOB, GPIO_PIN_6}, //前灯12V
- {GPIOB, GPIO_PIN_7}, //前灯随电池电压
- };
- MC_LightDriver_IO_Struct_t TailLightIO_Groups[3] =
- {
- {GPIOB, GPIO_PIN_2}, //尾灯6V
- {GPIOB, GPIO_PIN_0}, //尾灯12V
- {GPIOA, GPIO_PIN_6} //尾灯随电池电压
- };
- static void LightDriver_IO_Control(MC_LightDriver_IO_Struct_t* IO_Groups, uint8_t Len, uint8_t ID, MC_LightSwitch_Struct_t SwitchCode)
- {
- uint8_t i;
-
- if(SwitchCode == MC_LightSwitch_ON)//开灯时,仅打开配置的IO
- {
- for(i=0; i<Len; i++)
- {
- HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, (i == ID) ? GPIO_PIN_SET: GPIO_PIN_RESET);
- }
- }
- else//关灯时,关闭所有控制IO
- {
- for(i=0; i<Len; i++)
- {
- HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, GPIO_PIN_RESET);
- }
- }
- }
- void LightDriver_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- uint8_t i;
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
-
- /*Configure GPIO pin Output Level */
- for(i=0; i< 3; i++)
- {
- //前灯组
- HAL_GPIO_WritePin(HeadLightIO_Groups[i].Port, HeadLightIO_Groups[i].Pin, GPIO_PIN_RESET);
- GPIO_InitStruct.Pin = HeadLightIO_Groups[i].Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(HeadLightIO_Groups[i].Port, &GPIO_InitStruct);
- //尾灯组
- HAL_GPIO_WritePin(TailLightIO_Groups[i].Port, TailLightIO_Groups[i].Pin, GPIO_PIN_RESET);
- GPIO_InitStruct.Pin = TailLightIO_Groups[i].Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(TailLightIO_Groups[i].Port, &GPIO_InitStruct);
- }
- }
- void LightDriver_Process(uint8_t Light_Mode, MC_LightVoltage_Struct_t HeadLightVol, MC_LightVoltage_Struct_t TailLightVol, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_LightSwitch_Struct_t LightSwitchCode)
- {
- uint8_t HeadLightIO_Groups_ID, TailLightIO_Groups_ID;
-
- //开机前2s不处理,关灯处理
- if(HAL_GetTick() < 2000)
- {
- LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, MC_LightSwitch_OFF);
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- return;
- }
-
- //根据配置选择对应的IO
- switch(HeadLightVol)
- {
- case MC_LIGHT_VOL_6V:
- {
- HeadLightIO_Groups_ID = 0;
- break;
- }
- case MC_LIGHT_VOL_12V:
- {
- HeadLightIO_Groups_ID = 1;
- break;
- }
- case MC_LIGHT_VOL_BATTERY:
- {
- HeadLightIO_Groups_ID = 2;
- break;
- }
- default://无配置时,控制PB4,兼容旧主控板
- {
- HeadLightIO_Groups_ID = 0;
- break;
- }
- }
- switch(TailLightVol)
- {
- case MC_LIGHT_VOL_6V:
- {
- TailLightIO_Groups_ID = 0;
- break;
- }
- case MC_LIGHT_VOL_12V:
- {
- TailLightIO_Groups_ID = 1;
- break;
- }
- case MC_LIGHT_VOL_BATTERY:
- {
- TailLightIO_Groups_ID = 2;
- break;
- }
- default://无配置时,控制PA6,兼容旧主控板
- {
- TailLightIO_Groups_ID = 2;
- break;
- }
- }
-
- //控制前灯
- switch(Light_Mode & 0xF0)
- {
- case MC_FRONT_LIGHT_MODE1: //常亮
- {
- LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, MC_LightSwitch_ON);
- break;
- }
- case MC_FRONT_LIGHT_MODE2: default: //仪表控制开关
- {
- LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, LightSwitchCode);
- break;
- }
-
- }
-
- //控制尾灯
- static uint16_t FlashTimeCnt = 0;
- switch(Light_Mode & 0x0F)
- {
- case MC_TAIL_LIGHT_MODE1://连接尾灯,开灯时低亮,刹车时高亮
- {
- if(IsBreakFlag == TRUE)//刹车时,高亮
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
- FlashTimeCnt = 0;
- }
- else//无刹车时,开灯低亮
- {
- if(LightSwitchCode == MC_LightSwitch_ON)
- {
- if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal)//尾灯亮起有效值
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
- }
- else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv) //控制周期:15K / Period 尾灯亮起的频率
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- }
- else
- {
- FlashTimeCnt = 0;
- }
- FlashTimeCnt++;
- }
- else if(LightSwitchCode == MC_LightSwitch_OFF)
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- FlashTimeCnt = 0;
- }
- }
- break;
- }
- case MC_TAIL_LIGHT_MODE2: default://连接尾灯,开灯时高亮,刹车时闪烁
- {
- if(IsBreakFlag == TRUE)//刹车时,快闪
- {
- if(FlashTimeCnt < 600)
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
- }
- else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- }
- else
- {
- FlashTimeCnt = 0;
- }
- FlashTimeCnt++;
- }
- else//无刹车时,开灯亮
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, LightSwitchCode);
- FlashTimeCnt = 0;
- }
- break;
- }
- case MC_TAIL_LIGHT_MODE3://连接刹车灯,刹车高亮
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, (IsBreakFlag == TRUE) ? MC_LightSwitch_ON : MC_LightSwitch_OFF);
- break;
- }
- case MC_TAIL_LIGHT_MODE4://连接刹车灯,刹车闪烁
- {
- if(IsBreakFlag == TRUE)//刹车时,快闪
- {
- if(FlashTimeCnt < 600)
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
- }
- else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- }
- else
- {
- FlashTimeCnt = 0;
- }
- FlashTimeCnt++;
- }
- else//无刹车时,关闭
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- FlashTimeCnt = 0;
- }
- break;
- }
- case MC_TAIL_LIGHT_MODE5://模式5,常亮
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
- break;
- }
- case MC_TAIL_LIGHT_MODE6://超速报警
- {
- if(MC_SpeedSensorData.Speed_Data >= MC_ConfigParam2.u16OverspeedWarnVal)//速度超了 车速放了100倍 6S响1S:7500/45000
- {
- if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal)//响声执行
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
- }
- else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv) // 响声周期
- {
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- }
- else
- {
- FlashTimeCnt = 0;
- }
- FlashTimeCnt++;
- }
- else
- {
- FlashTimeCnt = 0;
- LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
- }
- break;
- }
- }
- }
|