Browse Source

1,增加开灯使能;2,解决呼吸灯灭灯问题。

hero 9 tháng trước cách đây
mục cha
commit
ae5d455454
4 tập tin đã thay đổi với 51 bổ sung116 xóa
  1. 4 4
      usr/inc/led.h
  2. 0 24
      usr/inc/tasks.h
  3. 20 76
      usr/src/led.c
  4. 27 12
      usr/src/tasks.c

+ 4 - 4
usr/inc/led.h

@@ -13,10 +13,10 @@ extern uint16_t BrightlessLevel;
 //全局函数
 extern void Light_SetBrightless(uint16_t Level); //设置照明灯亮度,0-灭灯,100-最亮
 extern void Light_DisplayOff(void);   //照明灯灭
-extern void Light_DisplayMode1(uint16_t LightSensor, uint8_t Smart); //照明灯模式1
-extern void Light_DisplayMode2(uint16_t LightSensor, uint8_t Smart); //照明灯模式2
-extern void Light_DisplayMode3(uint16_t LightSensor, uint8_t Smart); //照明灯模式3
-extern void Light_DisplayMode4(uint16_t LightSensor, uint8_t Smart); //照明灯模式4
+extern void Light_DisplayMode1(uint8_t LightEna, uint8_t Smart); //照明灯模式1
+extern void Light_DisplayMode2(uint8_t LightEna, uint8_t Smart); //照明灯模式2
+extern void Light_DisplayMode3(uint8_t LightEna, uint8_t Smart); //照明灯模式3
+extern void Light_DisplayMode4(uint8_t LightEna, uint8_t Smart); //照明灯模式4
 extern void Light_DisplayBreak(uint8_t* Break); //刹车灯模式
 extern void LedChg_SetColor(uint8_t Red, uint8_t Green, uint8_t Blue); //设置电量指示灯颜色,RGB调色范围0-255
 extern void Led_BatSoc_Display(uint8_t ChgMode, uint8_t Smart, uint8_t SOC); //电量指示灯显示

+ 0 - 24
usr/inc/tasks.h

@@ -1,25 +1 @@
-#ifndef __TASKS_H
-#define __TASKS_H
 
-#include "stm8s.h"
-
-extern uint8_t OnFlag;
-extern uint8_t LedMode;
-extern uint8_t KeyPressResult;
-extern uint8_t BreakFlag;
-extern uint16_t AD_Vin;
-extern uint32_t AD_VinFltSum;
-extern uint16_t AD_Light;
-extern uint32_t AD_LightFltSum;
-extern uint16_t AD_Chg;
-extern uint32_t AD_ChgFltSum;
-extern uint8_t Bat_Soc;
-extern uint16_t Light_Level;
-extern uint8_t Chg_Flag;
-extern int16_t AccBuff_x[3],  AccBuff_y[3], AccBuff_z[3]; 
-extern uint32_t ShakeTimeCnt;
-extern uint32_t AutoOffTimeCnt;
-
-extern void Power_Off(uint8_t WakeMode);
-
-#endif

+ 20 - 76
usr/src/led.c

@@ -33,25 +33,12 @@ void Light_DisplayOff(void)
 强光或静置时,只在模式切换时亮三次
 函数运行周期1ms
 */
-void Light_DisplayMode1(uint16_t LightSensor, uint8_t Smart)
+void Light_DisplayMode1(uint8_t LightEna, uint8_t Smart)
 {
-  uint8_t OffFlag = 0;
-  //判断是否自动关灯
-  if(Smart == 0) //非智能模式
-  {
-    OffFlag = 0;
-  }
-  else //智能模式,根据光感强度确定是否自动关闭
-  {
-    if(LightSensor < LIGHT_LEVEL_LOW)
-      OffFlag = 0;
-    else if(LightSensor > LIGHT_LEVEL_HIGH)
-      OffFlag = 1;
-  }
-  //自动关闭时在模式切换时亮三次
-  if((OffFlag == 1)&&(Light_Mode_Count >= 3))
+  if((Smart == 1) && (LightEna == 0) && (Light_Mode_Count >= 10)) //智能模式,强光,3s后关闭
   {
     Light_SetBrightless(0);
+    Light_Mode_PeriodCnt = 0;
   }	
   else
   {
@@ -76,42 +63,25 @@ void Light_DisplayMode1(uint16_t LightSensor, uint8_t Smart)
 模式2:呼吸,800ms加到最亮,周期1s,智能模式,白天熄灯,晚上亮灯,30s自动关闭
 函数运行周期1ms
 */
-void Light_DisplayMode2(uint16_t LightSensor, uint8_t Smart)
+void Light_DisplayMode2(uint8_t LightEna, uint8_t Smart)
 {
-  uint8_t OffFlag = 0;
   uint16_t LevelPluse = 0;
-  
-  //设定亮度
-  if(BrightlessLevel == 1) LevelPluse = 25;
-  else if(BrightlessLevel == 2) LevelPluse = 50;
-  else if(BrightlessLevel == 3) LevelPluse = 100;
-  //判断是否自动关灯
-  if(Smart == 0) //非智能模式
-  {
-    OffFlag = 0;
-  }
-  else //智能模式,根据光感强度确定是否自动关闭
-  {
-    if(LightSensor < LIGHT_LEVEL_LOW)
-      OffFlag = 0;
-    else if(LightSensor > LIGHT_LEVEL_HIGH)
-      OffFlag = 1;
-  }
-  //自动关闭时在模式切换时亮三次
-  if((OffFlag == 1) && (Light_Mode_Count >= 2))
+	
+  if((Smart == 1) && (LightEna == 0) && (Light_Mode_Count >= 3)) //智能模式,强光,3s后关闭
   {
     Light_SetBrightless(0);
+    Light_Mode_PeriodCnt = 0;
   }	
   else
   {	
     Light_Mode_PeriodCnt++;
     if(Light_Mode_PeriodCnt <= 750)
     {
-      Light_SetBrightless((uint32_t)Light_Mode_PeriodCnt * LevelPluse / 750 + 10);
+      Light_SetBrightless((uint32_t)Light_Mode_PeriodCnt * BrightlessLevelPulse[BrightlessLevel - 1] / 750 + 10);
     }
     else if(Light_Mode_PeriodCnt <= 1500)
     {
-      Light_SetBrightless((uint32_t)(1500 - Light_Mode_PeriodCnt) * LevelPluse / 1500 + 10);
+      Light_SetBrightless((uint32_t)(1500 - Light_Mode_PeriodCnt) * BrightlessLevelPulse[BrightlessLevel - 1] / 750 + 10);
     }
     else
     {
@@ -125,25 +95,12 @@ void Light_DisplayMode2(uint16_t LightSensor, uint8_t Smart)
 模式3:爆闪,50ms亮,950ms灭,非智能
 函数运行周期1ms
 */
-void Light_DisplayMode3(uint16_t LightSensor, uint8_t Smart)
+void Light_DisplayMode3(uint8_t LightEna, uint8_t Smart)
 {
-  uint8_t OffFlag = 0;
-  //判断是否自动关灯
-  if(Smart == 0) //非智能模式
-  {
-    OffFlag = 0;
-  }
-  else //智能模式,根据光感强度确定是否自动关闭
-  {
-    if(LightSensor < LIGHT_LEVEL_LOW)
-      OffFlag = 0;
-    else if(LightSensor > LIGHT_LEVEL_HIGH)
-      OffFlag = 1;
-  }
-  //自动关闭时在模式切换时亮三次
-  if((OffFlag == 1)&&(Light_Mode_Count >= 3))
+  if((Smart == 1) && (LightEna == 0) && (Light_Mode_Count >= 6)) //智能模式,强光,3s后关闭
   {
     Light_SetBrightless(0);
+    Light_Mode_PeriodCnt = 0;
   }	
   else
   {
@@ -176,25 +133,12 @@ void Light_DisplayMode3(uint16_t LightSensor, uint8_t Smart)
 模式4:常亮
 函数运行周期1ms
 */
-void Light_DisplayMode4(uint16_t LightSensor, uint8_t Smart)
+void Light_DisplayMode4(uint8_t LightEna, uint8_t Smart)
 {
-  uint8_t OffFlag = 0;
-  //判断是否自动关灯
-  if(Smart == 0) //非智能模式
-  {
-    OffFlag = 0;
-  }
-  else //智能模式,根据光感强度确定是否自动关闭
-  {
-    if(LightSensor < LIGHT_LEVEL_LOW)
-      OffFlag = 0;
-    else if(LightSensor > LIGHT_LEVEL_HIGH)
-      OffFlag = 1;
-  }
-  //自动关闭时在模式切换时亮三次
-  if((OffFlag == 1)&&(Light_Mode_Count >= 3))
+  if((Smart == 1) && (LightEna == 0) && (Light_Mode_Count >= 3)) //智能模式,强光,3s后关闭
   {
     Light_SetBrightless(0);
+    Light_Mode_PeriodCnt = 0;
   }	
   else
   {    
@@ -234,13 +178,13 @@ void Light_DisplayBreak(uint8_t* Break)
 void LedChg_SetColor(uint8_t Red, uint8_t Green, uint8_t Blue)
 {
   //R
-  TIM2_SetCompare1(((uint32_t)500 * Red) >> 8);
+  TIM2_SetCompare1(((uint32_t)800 * Red) >> 8);
 
   //G
-  TIM2_SetCompare2(((uint32_t)500 * Green) >> 8);
+  TIM2_SetCompare2(((uint32_t)800 * Green) >> 8);
 
   //B
-  TIM2_SetCompare3(((uint32_t)500 * Blue) >> 8);
+  TIM2_SetCompare3(((uint32_t)800 * Blue) >> 8);
 }
 
 /*
@@ -316,7 +260,7 @@ void Led_BatSoc_Display(uint8_t ChgMode, uint8_t Smart, uint8_t SOC)
     if(LedSoc_PeriodCnt <= OnCnt1)
     {
       if(SOC <= 10) LedChg_SetColor(0xFA, 0, 0);
-      else if(SOC <= 40) LedChg_SetColor(0xFA, 0xA0, 0);
+      else if(SOC <= 50) LedChg_SetColor(0xFA, 0xA0, 0);
       else if(SOC <= 80) LedChg_SetColor(0, 0xFA, 0xFA);
       else LedChg_SetColor(0, 0xFA, 0);
     }
@@ -327,7 +271,7 @@ void Led_BatSoc_Display(uint8_t ChgMode, uint8_t Smart, uint8_t SOC)
     else if(LedSoc_PeriodCnt <= OnCnt2)
     {
       if(SOC <= 10) LedChg_SetColor(0xFA, 0, 0);
-      else if(SOC <= 40) LedChg_SetColor(0xFA, 0xA0, 0);
+      else if(SOC <= 50) LedChg_SetColor(0xFA, 0xA0, 0);
       else if(SOC <= 80) LedChg_SetColor(0, 0xFA, 0xFA);
       else LedChg_SetColor(0, 0xFA, 0);
     }

+ 27 - 12
usr/src/tasks.c

@@ -1,4 +1,3 @@
-#include "tasks.h"
 #include "system_settings.h"
 #include "led.h"
 #include "key.h"
@@ -10,6 +9,8 @@
 //整体模式
 uint8_t OnFlag = 1;             //运行标志,0-关机,1-开机
 uint8_t LedMode = 0;            //led模式,初始为0,有效1->2->3->4->1
+uint8_t SmartMode = 1;          //智能模式开关,0-关,1-开
+uint8_t Light_EN = 0;           //开灯使能标志,0-禁用,1-开启
 //按键信号
 uint8_t KeyPressResult = 0;     //按键状态:0-未按下,1-短按,2-双击,3-三击,4-长按
 //刹车标志
@@ -17,7 +18,7 @@ uint8_t BreakFlag = 0;          //刹
 uint8_t Break_EnaFlag = 0;      //刹车检测使能标志,0-关,1-开
 uint32_t Break_EnaDelayCnt = 0; //刹车开启计时
 //电量
-uint8_t Bat_Soc = 100;          //电池电量开关,0-100
+uint8_t Bat_Soc = 100;          //电池电量,0-100
 //光感亮度等级
 uint16_t Light_Level = 0;        //光感强度等级
 //充电标志
@@ -35,7 +36,6 @@ uint8_t AD_FinishFlag = 0;   //AD转
 int16_t AccAvg_x_New, AccAvg_y_New, AccAvg_z_New; //当前周期值
 int16_t AccAvg_x_Old, AccAvg_y_Old, AccAvg_z_Old; //上一周期值
 //静止检测
-uint8_t SmartMode = 1;        //智能模式开关,0-关,1-开
 uint32_t ShakeTimeCnt = 0;    //智能模式震动计时
 
 /*
@@ -51,10 +51,10 @@ uint32_t ShakeTimeCnt = 0;    //
 /// @brief 尾灯模式控制
 /// @param Mode 模式,1-2-3-4
 /// @param Break 刹车标志,0-无刹车,1-刹车
-/// @param LightSensor  光强度等级,1-10
+/// @param LightEna  开灯使能
 /// @param ShakeSensor 震动状态,0-静止达到30s,1-震动
 /// @param ChgFlag 充电标志,0-未充电,1-充电
-void Led_ModeProcess(uint8_t Mode, uint8_t Smart, uint8_t* Break, uint16_t LightSensor, uint8_t Chg)
+void Led_ModeProcess(uint8_t Mode, uint8_t Smart, uint8_t* Break, uint8_t LightEna, uint8_t Chg)
 {
   if(*Break == 1) //刹车模式,退出时Break标志清除
   {
@@ -78,22 +78,22 @@ void Led_ModeProcess(uint8_t Mode, uint8_t Smart, uint8_t* Break, uint16_t Light
       }
       case 1:
       {
-        Light_DisplayMode1(LightSensor, SmartMode);					  
+        Light_DisplayMode1(LightEna, SmartMode);					  
         break;
       }
       case 2:
       {
-        Light_DisplayMode2(LightSensor, SmartMode);		
+        Light_DisplayMode2(LightEna, SmartMode);		
         break;
       }
       case 3:
       {
-        Light_DisplayMode3(LightSensor, SmartMode);
+        Light_DisplayMode3(LightEna, SmartMode);
         break;
       }
       case 4:
       {
-        Light_DisplayMode4(LightSensor, SmartMode);
+        Light_DisplayMode4(LightEna, SmartMode);
         break;
       }
       default:break;
@@ -171,6 +171,7 @@ void taskB(void)//100ms
     static uint8_t AvgCnt1 = 0, AvgCnt2 = 0, AvgCnt3 = 0;
     uint32_t TimeOut = 0;
     static uint8_t Bat_Soc_New = 0;
+    uint16_t Light_EnCnt = 0;
 
     AD_Channel_Count++;
     switch(AD_Channel_Count) //3路轮流采集,每一路采集周期300ms
@@ -210,13 +211,27 @@ void taskB(void)//100ms
         }
         AD_LightFltSum += AD_Value;
         AvgCnt2++;
-        if(AvgCnt2 >= 4)
+        if(AvgCnt2 >= 2)
         {
-          AD_Light = AD_LightFltSum >> 2;
+          AD_Light = AD_LightFltSum >> 1;
+          Light_Level = 1024 - AD_Light; //光强度等级,1-1024
           AD_LightFltSum = 0;
           AvgCnt2 = 0;
         }
-        Light_Level = 1024 - AD_Light; //光强度等级,1-1024
+        if(AD_Light < 350)
+        {
+          Light_EN = 1;
+          Light_EnCnt = 0;
+          Light_Mode_Count = 0;
+        } 
+        else if(AD_Light > 850)
+        {
+          Light_EnCnt++;
+          if(Light_EnCnt > 50)
+          {
+            Light_EN = 0;
+          }
+        }  
         break;
       }
       case 3: //读取电压计算电量