[MM32硬件] MM32LED调光(PWM)与芯片间指令下发

[复制链接]
597|13
 楼主| t61000 发表于 2023-6-29 19:24 | 显示全部楼层 |阅读模式
LED调光

  LED调光,自然而然联想到PWM调光,通过改变脉冲宽度实现无极调光。原理许多博客都有介绍与讲解,此处不再赘述。关于定时器的配置程序如下。


  1. //TIM配置
  2. void TIM_Light_Configuration()
  3. {
  4.        
  5.         GPIO_InitTypeDef                         GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;
  7.         TIM_OCInitTypeDef                         TIM_OCInitStructure;
  8.        
  9.         //时钟初始化
  10.         TIM_DeInit(TIM1);
  11.         TIM_DeInit(TIM14);
  12.        
  13.         /*
  14.         APB2负责AD,I/O,高级TIM,串口1

  15.         APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM
  16.         */
  17.        
  18.         /* TIMx clock enable */
  19.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,ENABLE);
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_TIM14,ENABLE);
  21.        
  22.         //TIM1的PWM功能配置
  23.         GPIO_StructInit(&GPIO_InitStructure);
  24.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1;        //TIM1_CH1N  TIM1_CH2N  TIM1_3N
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                       
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  28.        
  29.         //配置指定管脚的复用功能
  30.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource0,GPIO_AF_2);                //TIM1_CH2N   
  31.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource1,GPIO_AF_0);                //TIM14_CH1
  32. //        GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_2);        //TIM1_CH3N    WIFI指示灯
  33.        
  34.         TIM_TimeBaseStructure.TIM_Period                       = 1000-1;        //预装载arr
  35.         TIM_TimeBaseStructure.TIM_Prescaler          = 3;                //预分频2k PWM频率
  36.         TIM_TimeBaseStructure.TIM_CounterMode                  = TIM_CounterMode_Up;
  37.         TIM_TimeBaseStructure.TIM_ClockDivision      = TIM_CKD_DIV1;
  38.         TIM_TimeBaseStructure.TIM_RepetitionCounter  = 0;                //重复寄存器,用于自动更新PWM占空比
  39.        
  40.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  41.         TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
  42.        
  43.         /*
  44.         TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM1:
  45.         当计时器值小于比较器设定值时TIMX输出脚此时输出有效高电平,反之为低电平

  46.         TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM2:
  47.         当计时器值大于比较器设定值时TIMX输出脚此时输出有效高电平,反之为低电平
  48.         */
  49.         //PWM设置
  50.         TIM_OCInitStructure.TIM_OCMode                                 = TIM_OCMode_PWM2;                                                             
  51.         TIM_OCInitStructure.TIM_Pulse                                 = 0;                                                //CCR,设置占空比
  52.         TIM_OCInitStructure.TIM_OCPolarity                         = TIM_OCPolarity_Low;            //输出极性
  53.         TIM_OCInitStructure.TIM_OutputState                 = TIM_OutputState_Enable;        //正向通道有效
  54.         TIM_OC1Init(TIM14, &TIM_OCInitStructure);                                                                  //黄灯
  55.        
  56.         //PWM设置
  57.         TIM_OCInitStructure.TIM_OCMode                                         = TIM_OCMode_PWM2;                                                             
  58.         TIM_OCInitStructure.TIM_Pulse                                         = 0;                                        //CCR,设置占空比                                                                 
  59.         TIM_OCInitStructure.TIM_OCPolarity                         = TIM_OCPolarity_Low;                //输出极性
  60.         TIM_OCInitStructure.TIM_OutputState                 = TIM_OutputState_Disable;        //正向通道无效
  61.        
  62.         //高级定时器参数                  
  63.         TIM_OCInitStructure.TIM_OCNPolarity                        = TIM_OCNPolarity_Low;                //互补端极性
  64.         TIM_OCInitStructure.TIM_OutputNState                = TIM_OutputNState_Enable;        //反向通道有效
  65.         TIM_OCInitStructure.TIM_OCIdleState                        = TIM_OCIdleState_Reset;        //死区后输出状态
  66.         TIM_OCInitStructure.TIM_OCNIdleState                = TIM_OCIdleState_Reset;        //死区后互补端输出状态
  67.        
  68.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                //白灯


  69.         //预装载
  70.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  
  71.         TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  

  72.         //Ê使能TIMx在ARR上的预装载寄存器
  73.         TIM_ARRPreloadConfig(TIM1, ENABLE);        
  74.         TIM_ARRPreloadConfig(TIM14, ENABLE);        
  75.        
  76.         /* TIM1 counter enable */
  77.         TIM_Cmd(TIM1, ENABLE);
  78.         TIM_Cmd(TIM14, ENABLE);       
  79.        
  80.         /* TIM1 Main Output Enable */
  81.         TIM_CtrlPWMOutputs(TIM1, ENABLE);
  82.         TIM_CtrlPWMOutputs(TIM14, ENABLE);

  83. }


 楼主| t61000 发表于 2023-6-29 19:24 | 显示全部楼层
通过改变TIM的捕获/比较寄存器即可实现脉宽改变,实现TIM的PWM调光。该部分功能函数如下:
  1. /*******************************************************************************************
  2. 函数信息:void Yellow_Pulse(u8 Light)
  3. 功能描述:
  4. 输入参数:Light为灯光亮度等级,0-10亮度依次降低
  5. 输出参数:
  6.     备注:
  7. ********************************************************************************************/
  8. void Yellow_Pulse(u8 Light)
  9. {
  10.        
  11.                 TIM_SetCompare1(TIM14, 10*(Light));                                                                         //黄灯

  12. }


  13. /*********************************************************************************************
  14. 函数信息:void White_Pulse(u8 Light)
  15. 功能描述:
  16. 输入参数:Light为灯光亮度等级,0-10亮度依次降低
  17. 输出参数:
  18.     备注:
  19. **************************************************************************************/
  20. void White_Pulse(u8 Light)
  21. {
  22.        
  23.                 TIM_SetCompare2(TIM1, 10*(Light));                                                                         //白灯

  24. }
 楼主| t61000 发表于 2023-6-29 19:25 | 显示全部楼层
MM32下发电控指令
  根据产品需求,MM32作为主控芯片,需要完成射频信号解码,以及与电控芯片通信并下发控制指令。电控主要操作有,电机(风扇)转速档位加减,正反转以及自然风选择。首先将控制指令定义如下表

95562649d6a0b4fdcf.png
 楼主| t61000 发表于 2023-6-29 19:25 | 显示全部楼层
相关解释:

检测码:0001000011101111 周期2s(风扇运转过程中持续发送,不受射频遥控影响)未接收到电控指令时未始终未高电平;
信号1,信号周期为2.24ms,高电平占1.62ms,低电平占0.62ms;
信号0:信号周期为1.24ms,高电平占0.62ms,低电平占0.62ms;
码头的同步码:依次为低电平9ms,高电平4.5ms,低电平0.62ms。
  其中检测码用于检测电控芯片与主控MCU(MM32)之间通信的正常稳定,若当风扇电机运转后未在指定时间(2s)内接收到检测码,则电控芯片处于安全考虑将使风扇电机停转。
 楼主| t61000 发表于 2023-6-29 19:27 | 显示全部楼层
操作码及地址码宏定义
  根据上面的操作码表,将操作码定义如下:
  1. /*地址码宏定义*/
  2. #define Oper_Addr                                 ((uint32_t)0x10EF0000)

  3. /*操作码VSP宏定义*/
  4. /*正转*/
  5. #define Gear_One_Z                                (Oper_Addr + 0xF50A)
  6. #define Gear_Two_Z                                (Oper_Addr + 0xF10E)
  7. #define Gear_Three_Z                        (Oper_Addr + 0xED12)
  8. #define Gear_Four_Z                            (Oper_Addr + 0xEA15)
  9. #define Gear_Five_Z                                (Oper_Addr + 0xE619)
  10. #define Gear_Six_Z                                (Oper_Addr + 0xE21D)
  11. #define Gear_Seven_Z                        (Oper_Addr + 0xDE21)
  12. #define Gear_Eight_Z                        (Oper_Addr + 0xDB24)
  13. #define Gear_Nine_Z                                (Oper_Addr + 0xD728)
  14. #define Gear_Ten_Z                                (Oper_Addr + 0xD32C)

  15. /*反转*/
  16. #define Gear_One_F                                (Oper_Addr + 0x758A)
  17. #define Gear_Two_F                                (Oper_Addr + 0x728D)
  18. #define Gear_Three_F                        (Oper_Addr + 0x708F)
  19. #define Gear_Four_F                                (Oper_Addr + 0x6D92)
  20. #define Gear_Five_F                                (Oper_Addr + 0x6B94)
  21. #define Gear_Six_F                                (Oper_Addr + 0x6897)
  22. #define Gear_Seven_F                        (Oper_Addr + 0x6699)
  23. #define Gear_Eight_F                        (Oper_Addr + 0x639C)
  24. #define Gear_Nine_F                                (Oper_Addr + 0x619E)
  25. #define Gear_Ten_F                                (Oper_Addr + 0x5EA1)

  26. /*停止*/
  27. #define         Stop                                (Oper_Addr + 0xFF00)
  28. /*自然风*/
  29. #define           Breeze                                (Oper_Addr + 0xF10E)
  30. /*检测码*/
  31. #define         Test                                (Oper_Addr + 0x00FF)


  32. /*操作码宏定义Oper_Code_Get */
  33. #define          Off                                  ((uint8_t)0x11)            /*关机*/                       
  34. #define         Reverse                          ((uint8_t)0x21)            /*正反转*/               
  35. #define          Speed_Plus                  ((uint8_t)0x31)            /*加速*/                       
  36. #define          Speed_Minus                  ((uint8_t)0x30)           /*减速*/                       
  37. #define          Natural                          ((uint8_t)0x41)           /*自然风*/
  38. #define          Yellow                          ((uint8_t)0x50)            /*黄灯*/       
  39. #define          White                                  ((uint8_t)0x60)           /*白灯*/                       
  40. #define          Light_Plus                  ((uint8_t)0x80)          /*亮度加*/
  41. #define          Light_Minus                  ((uint8_t)0x70)            /*亮度减*/


  42. extern u8         REMOTE_ID1;                                                      /*遥控器识别码1*/
  43. extern u8         REMOTE_ID2;                                                      /*遥控器识别码2*/
  44. extern u8         REMOTE_ID3;                                                      /*遥控器识别码3*/
  45. extern u8        Dire_Curr;                                                                 /*当前方向*/
  46. extern u8         Gear_Curr;                                                                 /*当前档位*/
  47. extern u8        Yellow_Curr;                                                         /*当前黄灯状态*/
  48. extern u8         White_Curr;                                                                 /*当前白灯状态*/
  49. extern u8         Brightness_Y;                                                         /*黄灯亮度*/
  50. extern u8         Brightness_W;                                                          /*白灯亮度*/
  51. extern u8         Oper_Code_Get;                                                         /*操作码接收*/

  52. extern u8   VSP_start;                                                                 /*VSP信号发送*/
 楼主| t61000 发表于 2023-6-29 19:27 | 显示全部楼层
电机操作码发生函数
  对定义的逻辑1与0信号分析可知,高低电平时间占比决定了信号逻辑,因此设计通过对GPIO口置位实现逻辑发送,置位时间采用延时函数实现。发送函数的程序定义如下:
  1. /*******************************************************************************************
  2. 函数信息:void Motor_Control_Send(u32 irdata)
  3. 功能描述:发送电机操作码
  4. 输入参数:
  5. 输出参数:
  6.    备注:
  7. ********************************************************************************************/
  8. void Motor_Control_Send(u32 irdata)
  9. {
  10.         s32 i;
  11.         u8  code;
  12.        
  13.         GPIO_ResetBits(GPIOB,GPIO_Pin_6);       
  14.         delay_us(18000);
  15.         GPIO_SetBits(GPIOB,GPIO_Pin_6);       
  16.         delay_us(9000);

  17.         for(i=31; i>=0; i--)   
  18.         {
  19.                 code = (irdata>>i) & 1;
  20.                
  21.                 GPIO_ResetBits(GPIOB,GPIO_Pin_6);               
  22.                
  23.                 delay_us(1120);
  24.                
  25.                 GPIO_SetBits(GPIOB,GPIO_Pin_6);       
  26.                
  27.                
  28.                 if(code == 0)                     
  29.                 {
  30.                        
  31.                         delay_us(1120);
  32.                        
  33.                 }
  34.                 else
  35.                 {
  36.                         delay_us(3360);
  37.                 }
  38.         }
  39.        
  40.         GPIO_ResetBits(GPIOB,GPIO_Pin_6);               
  41.        
  42.         delay_us(1120);       
  43.        
  44.         GPIO_SetBits(GPIOB,GPIO_Pin_6);
  45.        
  46.         return ;       
  47.        
  48. }

 楼主| t61000 发表于 2023-6-29 19:29 | 显示全部楼层
具体功能函数
  根据产品需求,风扇灯具有LED冷暖灯调光,风扇启停、加减档、自然风以及反转功能。因此特将各具体功能函数程序给出。由于需要保护遥控的独立与安全,MCU只能响应指定遥控器发出的射频信号,因此需要有地址校验的功能。地址校验函数的定义为

注:*mcu_dp_enum_update()与mcu_dp_bool_update()*函数为保证WIFI的APP端同步的数据上报与更新函数(由于设计了APP控制功能,故需要该函数)
 楼主| t61000 发表于 2023-6-29 19:34 | 显示全部楼层
地址校验函数
  1. /***************************************************************************************
  2. 函数信息:void REMOTE_Configuration(void)
  3. 功能描述:地址校验
  4. 输入参数:
  5. 输出参数:
  6.     备注:
  7. ***************************************************************************************/
  8. void REMOTE_Configuration()
  9. {
  10.         TIM2_Mode_Init();
  11. }


  12. u8 Oper_Code_Get=0;
  13. u8 REMOTE_ID1;
  14. u8 REMOTE_ID2;
  15. u8 REMOTE_ID3;
  16. void Remote_Scan(void)
  17. {        
  18.         u8 code1,code2;

  19.         if((rf_data[0]==REMOTE_ID1)&&(rf_data[1]==REMOTE_ID2)&&((rf_data[2]&0xf0)==REMOTE_ID3))
  20.         {
  21.                 code1 = (rf_data[2]&0x0f)<<4;
  22.                 code2 = (rf_data[3]&0xf0)>>4;
  23.                 Oper_Code_Get=code1 | code2;
  24.         }
  25.        
  26. }  
 楼主| t61000 发表于 2023-6-29 19:35 | 显示全部楼层
冷暖灯开关
  以下为冷暖灯开关的功能函数,包括白灯与黄灯。
  1. /***************************************************************************************
  2. 函数信息:void Yellow_Send(void)
  3. 功能描述:黄灯开关操作
  4. 输入参数:
  5. 输出参数:
  6.     备注:
  7. ***************************************************************************************/
  8. void Yellow_Send(void)
  9. {
  10.         Buzz_Ring(250);
  11.        
  12.         if(Yellow_Curr)
  13.                        
  14.                         { Yellow_Pulse(0); Brightness_Y = 0; Yellow_Curr = Yellow_Curr^1;}       
  15.                        
  16.         else
  17.                
  18.                         { Yellow_Pulse(50); Brightness_Y = 50; Yellow_Curr = Yellow_Curr^1;}                       

  19.         mcu_dp_bool_update(DPID_LIGHT,Yellow_Curr);               

  20.         mcu_dp_enum_update(DPID_LIGHT,Brightness_Y);                                       
  21. }


  22. /***************************************************************************************
  23. 函数信息:void White_Send(void)
  24. 功能描述:白灯开关操作
  25. 输入参数:
  26. 输出参数:
  27.     备注:
  28. ***************************************************************************************/
  29. void White_Send(void)
  30. {
  31.         Buzz_Ring(250);
  32.        
  33.                 if(White_Curr)
  34.                        
  35.                 { White_Pulse(0); Brightness_W = 0; White_Curr = White_Curr^1;}
  36.                
  37.                 else
  38.                        
  39.                 { White_Pulse(50); Brightness_W = 50; White_Curr = White_Curr^1;}
  40.                
  41.         mcu_dp_bool_update(DPID_WHITELIGHT_SWITCH,White_Curr);               

  42.         mcu_dp_enum_update(DPID_WHITELIGHT_SWITCH,Brightness_W);       
  43. }
 楼主| t61000 发表于 2023-6-29 19:36 | 显示全部楼层
冷暖灯调光
  通过改变定时器PWM的捕获/比较寄存器CCR,实现脉宽改变,实现冷暖灯调光。

  1. /**********************************************************************************
  2. 函数信息:void Light_Plus_Send(void)
  3. 功能描述:亮度加操作
  4. 输入参数:
  5. 输出参数:
  6.     备注:
  7. **********************************************************************************/
  8. void Light_Plus_Send(void)
  9. {
  10.         if(Yellow_Curr||White_Curr)
  11.         {
  12.                 Buzz_Ring(250);
  13.                
  14.                 if(Yellow_Curr)
  15.                        
  16.                 {
  17.                         if(Brightness_Y<100)
  18.                                
  19.                         {Brightness_Y+=10;
  20.                         Brightness_Y=(Brightness_Y>=100?100:Brightness_Y);Yellow_Pulse(Brightness_Y);}
  21.                        
  22.                         else
  23.                                
  24.                         {Yellow_Pulse(Brightness_Y);Buzz_Ring(500);}
  25.                        
  26.                
  27.                         mcu_dp_enum_update(DPID_LIGHT,Brightness_Y);                       
  28.                 }
  29.                
  30.          if(White_Curr)
  31.                
  32.                 {       
  33.                         if(Brightness_W<100)
  34.                                
  35.                         {Brightness_W+=10;
  36.                         Brightness_W=(Brightness_W>=100?100:Brightness_W);White_Pulse(Brightness_W);}
  37.                        
  38.                         else
  39.                                
  40.                         {White_Pulse(Brightness_W);Buzz_Ring(500);}
  41.                        
  42.                         mcu_dp_enum_update(DPID_WHITELIGHT_SWITCH,Brightness_W);       
  43.                 }
  44.         }
  45. }

  46. /**********************************************************************************
  47. 函数信息:void Light_Minus_Send(void)
  48. 功能描述:亮度减操作
  49. 输入参数:
  50. 输出参数:
  51.     备注:
  52. **********************************************************************************/
  53. void Light_Minus_Send(void)
  54. {
  55.         if(Yellow_Curr||White_Curr)
  56.         {

  57.                 Buzz_Ring(250);
  58.                
  59.                 if(Yellow_Curr)
  60.                        
  61.                 {
  62.                         if(Brightness_Y>0)
  63.                                
  64.                         {Brightness_Y-=10; Yellow_Pulse(Brightness_Y);}
  65.                        
  66.                         else
  67.                                
  68.                         {Yellow_Pulse(Brightness_Y);Buzz_Ring(500);}
  69.                        
  70.                         mcu_dp_enum_update(DPID_LIGHT,Brightness_Y);       
  71.                                
  72.                 }
  73.                
  74.                 if(White_Curr)
  75.                
  76.                 {       
  77.                         if(Brightness_W>0)
  78.                                
  79.                         {Brightness_W-=10; White_Pulse(Brightness_W);}
  80.                        
  81.                         else
  82.                                
  83.                         {White_Pulse(Brightness_W);Buzz_Ring(500);}
  84.                        
  85.                         mcu_dp_enum_update(DPID_WHITELIGHT_SWITCH,Brightness_W);       
  86.                 }
  87.         }
  88. }
 楼主| t61000 发表于 2023-6-29 19:36 | 显示全部楼层
反转操作
  风扇转速具有10挡,当收到反转指令时,即实现反转,不受档位影响,同时反转后的档位与正转档位一致,对于风扇灯的反转操作函数如下
  1. /*********************************************************************************
  2. 函数信息:void Reverse_Send(void)
  3. 功能描述:反转操作
  4. 输入参数:
  5. 输出参数:
  6.     备注:
  7. *********************************************************************************/
  8. void Reverse_Send(void)
  9. {
  10.                 Dire_Curr = Dire_Curr^1;
  11.        
  12.                 Buzz_Ring(250);
  13.                        
  14.                         if(Dire_Curr == 1)
  15.                         {
  16.                         switch(Gear_Curr)
  17.                         {
  18.                                 case 1:
  19.                                         Motor_Control_Send(Gear_One_F);break;
  20.                                                                
  21.                                 case 2:
  22.                                         Motor_Control_Send(Gear_Two_F);break;
  23.                                
  24.                                 case 3:
  25.                                         Motor_Control_Send(Gear_Three_F);break;
  26.                                
  27.                                 case 4:
  28.                                         Motor_Control_Send(Gear_Four_F);break;
  29.                                
  30.                                 case 5:
  31.                                         Motor_Control_Send(Gear_Five_F);break;
  32.                                
  33.                                 case 6:
  34.                                         Motor_Control_Send(Gear_Six_F);break;
  35.                                
  36.                                 case 7:
  37.                                         Motor_Control_Send(Gear_Seven_F);break;
  38.                                
  39.                                 case 8:
  40.                                         Motor_Control_Send(Gear_Eight_F);break;
  41.                                
  42.                                 case 9:
  43.                                         Motor_Control_Send(Gear_Nine_F);break;
  44.                                                        
  45.                                 case 10:
  46.                                         Motor_Control_Send(Gear_Ten_F);break;                                                                                                                                                                                                                       
  47.                        
  48.                                 default:
  49.                                         break;       
  50.                         }
  51.                   }
  52.                 else
  53.                 {
  54.                         switch(Gear_Curr)
  55.                         {
  56.                                 case 1:
  57.                                         Motor_Control_Send(Gear_One_Z);break;
  58.                                                                
  59.                                 case 2:
  60.                                         Motor_Control_Send(Gear_Two_Z);break;
  61.                                
  62.                                 case 3:
  63.                                         Motor_Control_Send(Gear_Three_Z);break;
  64.                                
  65.                                 case 4:
  66.                                         Motor_Control_Send(Gear_Four_Z);break;
  67.                                
  68.                                 case 5:
  69.                                         Motor_Control_Send(Gear_Five_Z);break;
  70.                                
  71.                                 case 6:
  72.                                         Motor_Control_Send(Gear_Six_Z);break;
  73.                                
  74.                                 case 7:
  75.                                         Motor_Control_Send(Gear_Seven_Z);break;
  76.                                
  77.                                 case 8:
  78.                                         Motor_Control_Send(Gear_Eight_Z);break;
  79.                                
  80.                                 case 9:
  81.                                         Motor_Control_Send(Gear_Nine_Z);break;
  82.                                                        
  83.                                 case 10:
  84.                                         Motor_Control_Send(Gear_Ten_Z);break;
  85.                                
  86.                                 default:
  87.                                         break;
  88.                         }               
  89.                 }
  90. }

 楼主| t61000 发表于 2023-6-29 19:37 | 显示全部楼层
档位加减操作
  对风扇灯档位的加减操作函数定义如下:
  1. /*************************************************************************
  2. 函数信息:void Speed_Plus_Send(void)
  3. 功能描述:加档操作
  4. 输入参数:
  5. 输出参数:
  6.     备注:
  7. **********************************************************************/
  8. void Speed_Plus_Send(void)
  9. {
  10.                 if(Dire_Curr == 1)
  11.                 {
  12.                         switch(Gear_Curr)
  13.                         {
  14.                                 case 0:
  15.                                         Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr=5;
  16.                                         mcu_dp_bool_update(DPID_SWITCH,1);break;

  17.                                 case 1:
  18.                                         Motor_Control_Send(Gear_Two_Z);Buzz_Ring(250);Gear_Curr++;break;
  19.                                                                
  20.                                 case 2:
  21.                                         Motor_Control_Send(Gear_Three_Z);Buzz_Ring(250);Gear_Curr++;break;
  22.                                
  23.                                 case 3:
  24.                                         Motor_Control_Send(Gear_Four_Z);Buzz_Ring(250);Gear_Curr++;break;
  25.                                
  26.                                 case 4:
  27.                                         Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr++;break;
  28.                                
  29.                                 case 5:
  30.                                         Motor_Control_Send(Gear_Six_Z);Buzz_Ring(250);Gear_Curr++;break;
  31.                                
  32.                                 case 6:
  33.                                         Motor_Control_Send(Gear_Seven_Z);Buzz_Ring(250);Gear_Curr++;break;
  34.                                
  35.                                 case 7:
  36.                                         Motor_Control_Send(Gear_Eight_Z);Buzz_Ring(250);Gear_Curr++;break;
  37.                                
  38.                                 case 8:
  39.                                         Motor_Control_Send(Gear_Nine_Z);Buzz_Ring(250);Gear_Curr++;break;
  40.                                                        
  41.                                 case 9:
  42.                                         Motor_Control_Send(Gear_Ten_Z);Buzz_Ring(750);Gear_Curr++;break;
  43.                                
  44.                                 case 10:
  45.                                         Motor_Control_Send(Gear_Ten_Z);Buzz_Ring(750);break;;
  46.                                
  47.                                 default:
  48.                                         break;
  49.                                                                                                                                                                                                                                                                                        
  50.                 }
  51.                 }       
  52.                 else               
  53.                 {
  54.                         switch(Gear_Curr)
  55.                         {
  56.                                 case 0:
  57.                                         Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr=5;break;

  58.                                 case 1:
  59.                                         Motor_Control_Send(Gear_Two_F);Buzz_Ring(250);Gear_Curr++;break;
  60.                                                                
  61.                                 case 2:
  62.                                         Motor_Control_Send(Gear_Three_F);Buzz_Ring(250);Gear_Curr++;break;
  63.                                
  64.                                 case 3:
  65.                                         Motor_Control_Send(Gear_Four_F);Buzz_Ring(250);Gear_Curr++;break;
  66.                                
  67.                                 case 4:
  68.                                         Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr++;break;
  69.                                
  70.                                 case 5:
  71.                                         Motor_Control_Send(Gear_Six_F);Buzz_Ring(250);Gear_Curr++;break;
  72.                                
  73.                                 case 6:
  74.                                         Motor_Control_Send(Gear_Seven_F);Buzz_Ring(250);Gear_Curr++;break;
  75.                                
  76.                                 case 7:
  77.                                         Motor_Control_Send(Gear_Eight_F);Buzz_Ring(250);Gear_Curr++;break;
  78.                                
  79.                                 case 8:
  80.                                         Motor_Control_Send(Gear_Nine_F);Buzz_Ring(250);Gear_Curr++;break;
  81.                                                        
  82.                                 case 9:
  83.                                         Motor_Control_Send(Gear_Ten_F);Buzz_Ring(750);Gear_Curr++;break;
  84.                                
  85.                                 case 10:
  86.                                         Motor_Control_Send(Gear_Ten_F);Buzz_Ring(750);break;
  87.                                                
  88.                                 default:
  89.                                         break;
  90.                 }
  91.         }
  92.                
  93.         mcu_dp_enum_update(DPID_FAN_SPEED,Gear_Curr);
  94. }

  95. /****************************************************************************
  96. 函数信息:void Speed_Minus_Send(void)
  97. 功能描述:减档操作
  98. 输入参数:
  99. 输出参数:
  100.     备注:
  101. **************************************************************************/
  102. void Speed_Minus_Send(void)
  103. {
  104.         if(Dire_Curr == 1)
  105.         {
  106.                 switch(Gear_Curr)
  107.                 {
  108.                         case 0:
  109.                                 Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr=5;break;

  110.                         case 1:
  111.                                 Motor_Control_Send(Gear_One_Z);Buzz_Ring(750);break;

  112.                         case 2:                                       
  113.                                 Motor_Control_Send(Gear_One_Z);Buzz_Ring(750);Gear_Curr--;break;                                       
  114.                        
  115.                         case 3:                       
  116.                                 Motor_Control_Send(Gear_Two_Z);Buzz_Ring(250);Gear_Curr--;break;
  117.                        
  118.                         case 4:
  119.                                 Motor_Control_Send(Gear_Three_Z);Buzz_Ring(250);Gear_Curr--;break;
  120.                        
  121.                         case 5:
  122.                                 Motor_Control_Send(Gear_Four_Z);Buzz_Ring(250);Gear_Curr--;break;
  123.                        
  124.                         case 6:
  125.                                 Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr--;break;
  126.                        
  127.                         case 7:
  128.                                 Motor_Control_Send(Gear_Six_Z);Buzz_Ring(250);Gear_Curr--;break;
  129.                        
  130.                         case 8:
  131.                                 Motor_Control_Send(Gear_Seven_Z);Buzz_Ring(250);Gear_Curr--;break;
  132.                        
  133.                         case 9:
  134.                                 Motor_Control_Send(Gear_Eight_Z);Buzz_Ring(250);Gear_Curr--;break;
  135.                        
  136.                         case 10:
  137.                                 Motor_Control_Send(Gear_Nine_Z);Buzz_Ring(250);Gear_Curr--;break;                                                       
  138.        
  139.                         default:
  140.                                 break;                       
  141.         }                               
  142.         }       
  143.         else               
  144.         {
  145.                 switch(Gear_Curr)
  146.                 {
  147.                         case 0:
  148.                                 Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr=5;break;

  149.                         case 1:
  150.                                 Motor_Control_Send(Gear_One_F);Buzz_Ring(750);break;
  151.                                                        
  152.                         case 2:
  153.                                 Motor_Control_Send(Gear_One_F);Buzz_Ring(750);Gear_Curr--;break;
  154.                        
  155.                         case 3:
  156.                                 Motor_Control_Send(Gear_Two_F);Buzz_Ring(250);Gear_Curr--;break;
  157.                                                        
  158.                         case 4:
  159.                                 Motor_Control_Send(Gear_Three_F);Buzz_Ring(250);Gear_Curr--;break;
  160.                        
  161.                         case 5:
  162.                                 Motor_Control_Send(Gear_Four_F);Buzz_Ring(250);Gear_Curr--;break;
  163.                        
  164.                         case 6:
  165.                                 Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr--;break;
  166.                        
  167.                         case 7:
  168.                                 Motor_Control_Send(Gear_Six_F);Buzz_Ring(250);Gear_Curr--;break;
  169.                        
  170.                         case 8:
  171.                                 Motor_Control_Send(Gear_Seven_F);Buzz_Ring(250);Gear_Curr--;break;
  172.                        
  173.                         case 9:
  174.                                 Motor_Control_Send(Gear_Eight_F);Buzz_Ring(250);Gear_Curr--;break;
  175.                        
  176.                         case 10:
  177.                                 Motor_Control_Send(Gear_Nine_F);Buzz_Ring(250);Gear_Curr--;break;               

  178.                         default:
  179.                                 break;
  180.         }

  181.         }
  182.        
  183.         mcu_dp_enum_update(DPID_FAN_SPEED,Gear_Curr);
  184. }

 楼主| t61000 发表于 2023-6-29 19:38 | 显示全部楼层
电机操作码发送函数
  下面给出总体电机操作码发送函数及各个状态变量定义。
/********************************************************************************
函数信息:void OperationCode_Send(void)
功能描述:发送电机操作码与控制LED
输入参数:
输出参数:
    备注:
*********************************************************************************/

u8 Dire_Curr = 1;                                        /*  1---正转   0---反转*/
u8 Gear_Curr = 0;
u8 Yellow_Curr = 0;                                        /*  1---灯亮  0---灯灭*/
u8 White_Curr = 0;
u8 Brightness_Y = 50;
u8 Brightness_W = 50;
u8 VSP_start = 0;
void OperationCode_Send()
{
       
        switch(Oper_Code_Get)
        {
                case Off:
                        Motor_Control_Send(Stop);Buzz_Ring(250);VSP_start=VSP_start^1;
                        mcu_dp_bool_update(DPID_SWITCH,VSP_start);break;
               
                case Reverse:
                        Reverse_Send();VSP_start=1;break;                                                       

                case Speed_Plus:
                        Speed_Plus_Send();VSP_start=1;break;
               
                case Speed_Minus:
                        Speed_Minus_Send();VSP_start=1;break;
                       
                case Natural:
                        Motor_Control_Send(Breeze);Buzz_Ring(250);VSP_start=1;break;
               
                case Yellow:
                        Yellow_Send();break;
                               
                case White:
                        White_Send();break;
                                               
                case Light_Plus:
                        Light_Plus_Send();break;
                                                               
                case Light_Minus:
                        Light_Minus_Send();break;
               
                default:
                        break;
        }
        Oper_Code_Get=0;
}

 楼主| t61000 发表于 2023-6-29 19:39 | 显示全部楼层
总结
  基于MM32开发了风扇灯的相关功能函数,包括LED开关及调光,风扇启停及加减档、反转功能,并将当前产品状态上报至WIFI端。经过功能检验,实现产品级交付。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

124

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0