100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > MM32LED调光(PWM)与芯片间指令下发

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

时间:2021-05-29 10:07:10

相关推荐

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

前景介绍

本人曾独立开发风扇灯产品,故在此将相关程序进行总结与分享,与大家一起学习交流。

这里大致介绍下风扇灯这款产品,风扇灯即在传统吊扇上集成了灯光照明的功能,可以通过射频遥控以及APP的WIFI控制,主控芯片接收到射频信号后进行解码,(注:解码程序见本人的博客分享MM32射频解码)解码后解析出遥控码中的操作码并进行相应的操作,调光与控制风扇电机状态等。其中LED调光通过定时器的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,串口1APB1负责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_3NGPIO_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;//预装载arrTIM_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 u8Dire_Curr; /*当前方向*/extern u8 Gear_Curr; /*当前档位*/extern u8Yellow_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;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 ;}

具体功能函数

根据产品需求,风扇灯具有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[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;}}

冷暖灯开关

以下为冷暖灯开关的功能函数,包括白灯与黄灯。

/***************************************************************************************函数信息: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端。经过功能检验,实现产品级交付。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。