MM32LED调光(PWM)与芯片间指令下发
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_CH1NTIM1_CH2NTIM1_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);
}
通过改变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)); //白灯
}
MM32下发电控指令
根据产品需求,MM32作为主控芯片,需要完成射频信号解码,以及与电控芯片通信并下发控制指令。电控主要操作有,电机(风扇)转速档位加减,正反转以及自然风选择。首先将控制指令定义如下表
。 相关解释:
检测码:0001000011101111 周期2s(风扇运转过程中持续发送,不受射频遥控影响)未接收到电控指令时未始终未高电平;
信号1,信号周期为2.24ms,高电平占1.62ms,低电平占0.62ms;
信号0:信号周期为1.24ms,高电平占0.62ms,低电平占0.62ms;
码头的同步码:依次为低电平9ms,高电平4.5ms,低电平0.62ms。
其中检测码用于检测电控芯片与主控MCU(MM32)之间通信的正常稳定,若当风扇电机运转后未在指定时间(2s)内接收到检测码,则电控芯片处于安全考虑将使风扇电机停转。 操作码及地址码宏定义
根据上面的操作码表,将操作码定义如下:/*地址码宏定义*/
#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信号发送*/
电机操作码发生函数
对定义的逻辑1与0信号分析可知,高低电平时间占比决定了信号逻辑,因此设计通过对GPIO口置位实现逻辑发送,置位时间采用延时函数实现。发送函数的程序定义如下:/*******************************************************************************************
函数信息:void Motor_Control_Send(u32 irdata)
功能描述:发送电机操作码
输入参数:
输出参数:
备注:
********************************************************************************************/
void Motor_Control_Send(u32 irdata)
{
s32 i;
u8code;
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 ;
}
具体功能函数
根据产品需求,风扇灯具有LED冷暖灯调光,风扇启停、加减档、自然风以及反转功能。因此特将各具体功能函数程序给出。由于需要保护遥控的独立与安全,MCU只能响应指定遥控器发出的射频信号,因此需要有地址校验的功能。地址校验函数的定义为
注:*mcu_dp_enum_update()与mcu_dp_bool_update()*函数为保证WIFI的APP端同步的数据上报与更新函数(由于设计了APP控制功能,故需要该函数) 地址校验函数/***************************************************************************************
函数信息: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==REMOTE_ID1)&&(rf_data==REMOTE_ID2)&&((rf_data&0xf0)==REMOTE_ID3))
{
code1 = (rf_data&0x0f)<<4;
code2 = (rf_data&0xf0)>>4;
Oper_Code_Get=code1 | code2;
}
}
冷暖灯开关
以下为冷暖灯开关的功能函数,包括白灯与黄灯。/***************************************************************************************
函数信息: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);
}
冷暖灯调光
通过改变定时器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);
}
}
}
反转操作
风扇转速具有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;
}
}
}
档位加减操作
对风扇灯档位的加减操作函数定义如下:/*************************************************************************
函数信息: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);
}
电机操作码发送函数
下面给出总体电机操作码发送函数及各个状态变量定义。
/********************************************************************************
函数信息: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;
}
总结
基于MM32开发了风扇灯的相关功能函数,包括LED开关及调光,风扇启停及加减档、反转功能,并将当前产品状态上报至WIFI端。经过功能检验,实现产品级交付。
页:
[1]