打印
[MM32硬件]

MM32LED调光(PWM)与芯片间指令下发

[复制链接]
306|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t61000|  楼主 | 2023-6-29 19:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
LED调光

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


//TIM配置
void TIM_Light_Configuration()
{
       
        GPIO_InitTypeDef                         GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;
        TIM_OCInitTypeDef                         TIM_OCInitStructure;
       
        //时钟初始化
        TIM_DeInit(TIM1);
        TIM_DeInit(TIM14);
       
        /*
        APB2负责AD,I/O,高级TIM,串口1

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

        TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM2:
        当计时器值大于比较器设定值时TIMX输出脚此时输出有效高电平,反之为低电平
        */
        //PWM设置
        TIM_OCInitStructure.TIM_OCMode                                 = TIM_OCMode_PWM2;                                                             
        TIM_OCInitStructure.TIM_Pulse                                 = 0;                                                //CCR,设置占空比
        TIM_OCInitStructure.TIM_OCPolarity                         = TIM_OCPolarity_Low;            //输出极性
        TIM_OCInitStructure.TIM_OutputState                 = TIM_OutputState_Enable;        //正向通道有效
        TIM_OC1Init(TIM14, &TIM_OCInitStructure);                                                                  //黄灯
       
        //PWM设置
        TIM_OCInitStructure.TIM_OCMode                                         = TIM_OCMode_PWM2;                                                             
        TIM_OCInitStructure.TIM_Pulse                                         = 0;                                        //CCR,设置占空比                                                                 
        TIM_OCInitStructure.TIM_OCPolarity                         = TIM_OCPolarity_Low;                //输出极性
        TIM_OCInitStructure.TIM_OutputState                 = TIM_OutputState_Disable;        //正向通道无效
       
        //高级定时器参数                  
        TIM_OCInitStructure.TIM_OCNPolarity                        = TIM_OCNPolarity_Low;                //互补端极性
        TIM_OCInitStructure.TIM_OutputNState                = TIM_OutputNState_Enable;        //反向通道有效
        TIM_OCInitStructure.TIM_OCIdleState                        = TIM_OCIdleState_Reset;        //死区后输出状态
        TIM_OCInitStructure.TIM_OCNIdleState                = TIM_OCIdleState_Reset;        //死区后互补端输出状态
       
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                //白灯


        //预装载
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  
        TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  

        //Ê使能TIMx在ARR上的预装载寄存器
        TIM_ARRPreloadConfig(TIM1, ENABLE);        
        TIM_ARRPreloadConfig(TIM14, ENABLE);        
       
        /* TIM1 counter enable */
        TIM_Cmd(TIM1, ENABLE);
        TIM_Cmd(TIM14, ENABLE);       
       
        /* TIM1 Main Output Enable */
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM14, ENABLE);

}


使用特权

评论回复
沙发
t61000|  楼主 | 2023-6-29 19:24 | 只看该作者
通过改变TIM的捕获/比较寄存器即可实现脉宽改变,实现TIM的PWM调光。该部分功能函数如下:
/*******************************************************************************************
函数信息:void Yellow_Pulse(u8 Light)
功能描述:
输入参数:Light为灯光亮度等级,0-10亮度依次降低
输出参数:
    备注:
********************************************************************************************/
void Yellow_Pulse(u8 Light)
{
       
                TIM_SetCompare1(TIM14, 10*(Light));                                                                         //黄灯

}


/*********************************************************************************************
函数信息:void White_Pulse(u8 Light)
功能描述:
输入参数:Light为灯光亮度等级,0-10亮度依次降低
输出参数:
    备注:
**************************************************************************************/
void White_Pulse(u8 Light)
{
       
                TIM_SetCompare2(TIM1, 10*(Light));                                                                         //白灯

}

使用特权

评论回复
板凳
t61000|  楼主 | 2023-6-29 19:25 | 只看该作者
MM32下发电控指令
  根据产品需求,MM32作为主控芯片,需要完成射频信号解码,以及与电控芯片通信并下发控制指令。电控主要操作有,电机(风扇)转速档位加减,正反转以及自然风选择。首先将控制指令定义如下表

使用特权

评论回复
地板
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)内接收到检测码,则电控芯片处于安全考虑将使风扇电机停转。

使用特权

评论回复
5
t61000|  楼主 | 2023-6-29 19:27 | 只看该作者
操作码及地址码宏定义
  根据上面的操作码表,将操作码定义如下:
/*地址码宏定义*/
#define Oper_Addr                                 ((uint32_t)0x10EF0000)

/*操作码VSP宏定义*/
/*正转*/
#define Gear_One_Z                                (Oper_Addr + 0xF50A)
#define Gear_Two_Z                                (Oper_Addr + 0xF10E)
#define Gear_Three_Z                        (Oper_Addr + 0xED12)
#define Gear_Four_Z                            (Oper_Addr + 0xEA15)
#define Gear_Five_Z                                (Oper_Addr + 0xE619)
#define Gear_Six_Z                                (Oper_Addr + 0xE21D)
#define Gear_Seven_Z                        (Oper_Addr + 0xDE21)
#define Gear_Eight_Z                        (Oper_Addr + 0xDB24)
#define Gear_Nine_Z                                (Oper_Addr + 0xD728)
#define Gear_Ten_Z                                (Oper_Addr + 0xD32C)

/*反转*/
#define Gear_One_F                                (Oper_Addr + 0x758A)
#define Gear_Two_F                                (Oper_Addr + 0x728D)
#define Gear_Three_F                        (Oper_Addr + 0x708F)
#define Gear_Four_F                                (Oper_Addr + 0x6D92)
#define Gear_Five_F                                (Oper_Addr + 0x6B94)
#define Gear_Six_F                                (Oper_Addr + 0x6897)
#define Gear_Seven_F                        (Oper_Addr + 0x6699)
#define Gear_Eight_F                        (Oper_Addr + 0x639C)
#define Gear_Nine_F                                (Oper_Addr + 0x619E)
#define Gear_Ten_F                                (Oper_Addr + 0x5EA1)

/*停止*/
#define         Stop                                (Oper_Addr + 0xFF00)
/*自然风*/
#define           Breeze                                (Oper_Addr + 0xF10E)
/*检测码*/
#define         Test                                (Oper_Addr + 0x00FF)


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


extern u8         REMOTE_ID1;                                                      /*遥控器识别码1*/
extern u8         REMOTE_ID2;                                                      /*遥控器识别码2*/
extern u8         REMOTE_ID3;                                                      /*遥控器识别码3*/
extern u8        Dire_Curr;                                                                 /*当前方向*/
extern u8         Gear_Curr;                                                                 /*当前档位*/
extern u8        Yellow_Curr;                                                         /*当前黄灯状态*/
extern u8         White_Curr;                                                                 /*当前白灯状态*/
extern u8         Brightness_Y;                                                         /*黄灯亮度*/
extern u8         Brightness_W;                                                          /*白灯亮度*/
extern u8         Oper_Code_Get;                                                         /*操作码接收*/

extern u8   VSP_start;                                                                 /*VSP信号发送*/

使用特权

评论回复
6
t61000|  楼主 | 2023-6-29 19:27 | 只看该作者
电机操作码发生函数
  对定义的逻辑1与0信号分析可知,高低电平时间占比决定了信号逻辑,因此设计通过对GPIO口置位实现逻辑发送,置位时间采用延时函数实现。发送函数的程序定义如下:
/*******************************************************************************************
函数信息:void Motor_Control_Send(u32 irdata)
功能描述:发送电机操作码
输入参数:
输出参数:
   备注:
********************************************************************************************/
void Motor_Control_Send(u32 irdata)
{
        s32 i;
        u8  code;
       
        GPIO_ResetBits(GPIOB,GPIO_Pin_6);       
        delay_us(18000);
        GPIO_SetBits(GPIOB,GPIO_Pin_6);       
        delay_us(9000);

        for(i=31; i>=0; i--)   
        {
                code = (irdata>>i) & 1;
               
                GPIO_ResetBits(GPIOB,GPIO_Pin_6);               
               
                delay_us(1120);
               
                GPIO_SetBits(GPIOB,GPIO_Pin_6);       
               
               
                if(code == 0)                     
                {
                       
                        delay_us(1120);
                       
                }
                else
                {
                        delay_us(3360);
                }
        }
       
        GPIO_ResetBits(GPIOB,GPIO_Pin_6);               
       
        delay_us(1120);       
       
        GPIO_SetBits(GPIOB,GPIO_Pin_6);
       
        return ;       
       
}

使用特权

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

注:*mcu_dp_enum_update()与mcu_dp_bool_update()*函数为保证WIFI的APP端同步的数据上报与更新函数(由于设计了APP控制功能,故需要该函数)

使用特权

评论回复
8
t61000|  楼主 | 2023-6-29 19:34 | 只看该作者
地址校验函数
/***************************************************************************************
函数信息:void REMOTE_Configuration(void)
功能描述:地址校验
输入参数:
输出参数:
    备注:
***************************************************************************************/
void REMOTE_Configuration()
{
        TIM2_Mode_Init();
}


u8 Oper_Code_Get=0;
u8 REMOTE_ID1;
u8 REMOTE_ID2;
u8 REMOTE_ID3;
void Remote_Scan(void)
{        
        u8 code1,code2;

        if((rf_data[0]==REMOTE_ID1)&&(rf_data[1]==REMOTE_ID2)&&((rf_data[2]&0xf0)==REMOTE_ID3))
        {
                code1 = (rf_data[2]&0x0f)<<4;
                code2 = (rf_data[3]&0xf0)>>4;
                Oper_Code_Get=code1 | code2;
        }
       
}  

使用特权

评论回复
9
t61000|  楼主 | 2023-6-29 19:35 | 只看该作者
冷暖灯开关
  以下为冷暖灯开关的功能函数,包括白灯与黄灯。
/***************************************************************************************
函数信息:void Yellow_Send(void)
功能描述:黄灯开关操作
输入参数:
输出参数:
    备注:
***************************************************************************************/
void Yellow_Send(void)
{
        Buzz_Ring(250);
       
        if(Yellow_Curr)
                       
                        { Yellow_Pulse(0); Brightness_Y = 0; Yellow_Curr = Yellow_Curr^1;}       
                       
        else
               
                        { Yellow_Pulse(50); Brightness_Y = 50; Yellow_Curr = Yellow_Curr^1;}                       

        mcu_dp_bool_update(DPID_LIGHT,Yellow_Curr);               

        mcu_dp_enum_update(DPID_LIGHT,Brightness_Y);                                       
}


/***************************************************************************************
函数信息:void White_Send(void)
功能描述:白灯开关操作
输入参数:
输出参数:
    备注:
***************************************************************************************/
void White_Send(void)
{
        Buzz_Ring(250);
       
                if(White_Curr)
                       
                { White_Pulse(0); Brightness_W = 0; White_Curr = White_Curr^1;}
               
                else
                       
                { White_Pulse(50); Brightness_W = 50; White_Curr = White_Curr^1;}
               
        mcu_dp_bool_update(DPID_WHITELIGHT_SWITCH,White_Curr);               

        mcu_dp_enum_update(DPID_WHITELIGHT_SWITCH,Brightness_W);       
}

使用特权

评论回复
10
t61000|  楼主 | 2023-6-29 19:36 | 只看该作者
冷暖灯调光
  通过改变定时器PWM的捕获/比较寄存器CCR,实现脉宽改变,实现冷暖灯调光。

/**********************************************************************************
函数信息:void Light_Plus_Send(void)
功能描述:亮度加操作
输入参数:
输出参数:
    备注:
**********************************************************************************/
void Light_Plus_Send(void)
{
        if(Yellow_Curr||White_Curr)
        {
                Buzz_Ring(250);
               
                if(Yellow_Curr)
                       
                {
                        if(Brightness_Y<100)
                               
                        {Brightness_Y+=10;
                        Brightness_Y=(Brightness_Y>=100?100:Brightness_Y);Yellow_Pulse(Brightness_Y);}
                       
                        else
                               
                        {Yellow_Pulse(Brightness_Y);Buzz_Ring(500);}
                       
               
                        mcu_dp_enum_update(DPID_LIGHT,Brightness_Y);                       
                }
               
         if(White_Curr)
               
                {       
                        if(Brightness_W<100)
                               
                        {Brightness_W+=10;
                        Brightness_W=(Brightness_W>=100?100:Brightness_W);White_Pulse(Brightness_W);}
                       
                        else
                               
                        {White_Pulse(Brightness_W);Buzz_Ring(500);}
                       
                        mcu_dp_enum_update(DPID_WHITELIGHT_SWITCH,Brightness_W);       
                }
        }
}

/**********************************************************************************
函数信息:void Light_Minus_Send(void)
功能描述:亮度减操作
输入参数:
输出参数:
    备注:
**********************************************************************************/
void Light_Minus_Send(void)
{
        if(Yellow_Curr||White_Curr)
        {

                Buzz_Ring(250);
               
                if(Yellow_Curr)
                       
                {
                        if(Brightness_Y>0)
                               
                        {Brightness_Y-=10; Yellow_Pulse(Brightness_Y);}
                       
                        else
                               
                        {Yellow_Pulse(Brightness_Y);Buzz_Ring(500);}
                       
                        mcu_dp_enum_update(DPID_LIGHT,Brightness_Y);       
                               
                }
               
                if(White_Curr)
               
                {       
                        if(Brightness_W>0)
                               
                        {Brightness_W-=10; White_Pulse(Brightness_W);}
                       
                        else
                               
                        {White_Pulse(Brightness_W);Buzz_Ring(500);}
                       
                        mcu_dp_enum_update(DPID_WHITELIGHT_SWITCH,Brightness_W);       
                }
        }
}

使用特权

评论回复
11
t61000|  楼主 | 2023-6-29 19:36 | 只看该作者
反转操作
  风扇转速具有10挡,当收到反转指令时,即实现反转,不受档位影响,同时反转后的档位与正转档位一致,对于风扇灯的反转操作函数如下
/*********************************************************************************
函数信息:void Reverse_Send(void)
功能描述:反转操作
输入参数:
输出参数:
    备注:
*********************************************************************************/
void Reverse_Send(void)
{
                Dire_Curr = Dire_Curr^1;
       
                Buzz_Ring(250);
                       
                        if(Dire_Curr == 1)
                        {
                        switch(Gear_Curr)
                        {
                                case 1:
                                        Motor_Control_Send(Gear_One_F);break;
                                                               
                                case 2:
                                        Motor_Control_Send(Gear_Two_F);break;
                               
                                case 3:
                                        Motor_Control_Send(Gear_Three_F);break;
                               
                                case 4:
                                        Motor_Control_Send(Gear_Four_F);break;
                               
                                case 5:
                                        Motor_Control_Send(Gear_Five_F);break;
                               
                                case 6:
                                        Motor_Control_Send(Gear_Six_F);break;
                               
                                case 7:
                                        Motor_Control_Send(Gear_Seven_F);break;
                               
                                case 8:
                                        Motor_Control_Send(Gear_Eight_F);break;
                               
                                case 9:
                                        Motor_Control_Send(Gear_Nine_F);break;
                                                       
                                case 10:
                                        Motor_Control_Send(Gear_Ten_F);break;                                                                                                                                                                                                                       
                       
                                default:
                                        break;       
                        }
                  }
                else
                {
                        switch(Gear_Curr)
                        {
                                case 1:
                                        Motor_Control_Send(Gear_One_Z);break;
                                                               
                                case 2:
                                        Motor_Control_Send(Gear_Two_Z);break;
                               
                                case 3:
                                        Motor_Control_Send(Gear_Three_Z);break;
                               
                                case 4:
                                        Motor_Control_Send(Gear_Four_Z);break;
                               
                                case 5:
                                        Motor_Control_Send(Gear_Five_Z);break;
                               
                                case 6:
                                        Motor_Control_Send(Gear_Six_Z);break;
                               
                                case 7:
                                        Motor_Control_Send(Gear_Seven_Z);break;
                               
                                case 8:
                                        Motor_Control_Send(Gear_Eight_Z);break;
                               
                                case 9:
                                        Motor_Control_Send(Gear_Nine_Z);break;
                                                       
                                case 10:
                                        Motor_Control_Send(Gear_Ten_Z);break;
                               
                                default:
                                        break;
                        }               
                }
}

使用特权

评论回复
12
t61000|  楼主 | 2023-6-29 19:37 | 只看该作者
档位加减操作
  对风扇灯档位的加减操作函数定义如下:
/*************************************************************************
函数信息:void Speed_Plus_Send(void)
功能描述:加档操作
输入参数:
输出参数:
    备注:
**********************************************************************/
void Speed_Plus_Send(void)
{
                if(Dire_Curr == 1)
                {
                        switch(Gear_Curr)
                        {
                                case 0:
                                        Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr=5;
                                        mcu_dp_bool_update(DPID_SWITCH,1);break;

                                case 1:
                                        Motor_Control_Send(Gear_Two_Z);Buzz_Ring(250);Gear_Curr++;break;
                                                               
                                case 2:
                                        Motor_Control_Send(Gear_Three_Z);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 3:
                                        Motor_Control_Send(Gear_Four_Z);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 4:
                                        Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 5:
                                        Motor_Control_Send(Gear_Six_Z);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 6:
                                        Motor_Control_Send(Gear_Seven_Z);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 7:
                                        Motor_Control_Send(Gear_Eight_Z);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 8:
                                        Motor_Control_Send(Gear_Nine_Z);Buzz_Ring(250);Gear_Curr++;break;
                                                       
                                case 9:
                                        Motor_Control_Send(Gear_Ten_Z);Buzz_Ring(750);Gear_Curr++;break;
                               
                                case 10:
                                        Motor_Control_Send(Gear_Ten_Z);Buzz_Ring(750);break;;
                               
                                default:
                                        break;
                                                                                                                                                                                                                                                                                       
                }
                }       
                else               
                {
                        switch(Gear_Curr)
                        {
                                case 0:
                                        Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr=5;break;

                                case 1:
                                        Motor_Control_Send(Gear_Two_F);Buzz_Ring(250);Gear_Curr++;break;
                                                               
                                case 2:
                                        Motor_Control_Send(Gear_Three_F);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 3:
                                        Motor_Control_Send(Gear_Four_F);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 4:
                                        Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 5:
                                        Motor_Control_Send(Gear_Six_F);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 6:
                                        Motor_Control_Send(Gear_Seven_F);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 7:
                                        Motor_Control_Send(Gear_Eight_F);Buzz_Ring(250);Gear_Curr++;break;
                               
                                case 8:
                                        Motor_Control_Send(Gear_Nine_F);Buzz_Ring(250);Gear_Curr++;break;
                                                       
                                case 9:
                                        Motor_Control_Send(Gear_Ten_F);Buzz_Ring(750);Gear_Curr++;break;
                               
                                case 10:
                                        Motor_Control_Send(Gear_Ten_F);Buzz_Ring(750);break;
                                               
                                default:
                                        break;
                }
        }
               
        mcu_dp_enum_update(DPID_FAN_SPEED,Gear_Curr);
}

/****************************************************************************
函数信息:void Speed_Minus_Send(void)
功能描述:减档操作
输入参数:
输出参数:
    备注:
**************************************************************************/
void Speed_Minus_Send(void)
{
        if(Dire_Curr == 1)
        {
                switch(Gear_Curr)
                {
                        case 0:
                                Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr=5;break;

                        case 1:
                                Motor_Control_Send(Gear_One_Z);Buzz_Ring(750);break;

                        case 2:                                       
                                Motor_Control_Send(Gear_One_Z);Buzz_Ring(750);Gear_Curr--;break;                                       
                       
                        case 3:                       
                                Motor_Control_Send(Gear_Two_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 4:
                                Motor_Control_Send(Gear_Three_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 5:
                                Motor_Control_Send(Gear_Four_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 6:
                                Motor_Control_Send(Gear_Five_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 7:
                                Motor_Control_Send(Gear_Six_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 8:
                                Motor_Control_Send(Gear_Seven_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 9:
                                Motor_Control_Send(Gear_Eight_Z);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 10:
                                Motor_Control_Send(Gear_Nine_Z);Buzz_Ring(250);Gear_Curr--;break;                                                       
       
                        default:
                                break;                       
        }                               
        }       
        else               
        {
                switch(Gear_Curr)
                {
                        case 0:
                                Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr=5;break;

                        case 1:
                                Motor_Control_Send(Gear_One_F);Buzz_Ring(750);break;
                                                       
                        case 2:
                                Motor_Control_Send(Gear_One_F);Buzz_Ring(750);Gear_Curr--;break;
                       
                        case 3:
                                Motor_Control_Send(Gear_Two_F);Buzz_Ring(250);Gear_Curr--;break;
                                                       
                        case 4:
                                Motor_Control_Send(Gear_Three_F);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 5:
                                Motor_Control_Send(Gear_Four_F);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 6:
                                Motor_Control_Send(Gear_Five_F);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 7:
                                Motor_Control_Send(Gear_Six_F);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 8:
                                Motor_Control_Send(Gear_Seven_F);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 9:
                                Motor_Control_Send(Gear_Eight_F);Buzz_Ring(250);Gear_Curr--;break;
                       
                        case 10:
                                Motor_Control_Send(Gear_Nine_F);Buzz_Ring(250);Gear_Curr--;break;               

                        default:
                                break;
        }

        }
       
        mcu_dp_enum_update(DPID_FAN_SPEED,Gear_Curr);
}

使用特权

评论回复
13
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;
}

使用特权

评论回复
14
t61000|  楼主 | 2023-6-29 19:39 | 只看该作者
总结
  基于MM32开发了风扇灯的相关功能函数,包括LED开关及调光,风扇启停及加减档、反转功能,并将当前产品状态上报至WIFI端。经过功能检验,实现产品级交付。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

124

帖子

0

粉丝