这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » Keil5编程实例之基于涂鸦IoT平台快速开发智能风扇

共8条 1/1 1 跳转至

Keil5编程实例之基于涂鸦IoT平台快速开发智能风扇

工程师
2021-01-14 23:59:14   被打赏 100 分(兑奖)     打赏

智能风扇是一款常见的智能设备,用户可以使用手机App轻松控制,通过远程控制开关、风速、场景联动等来轻松创造出温暖、放松、舒适的室内空间。本教程采用Keil5进行编程,基于涂鸦IoT平台和三明治BLDC功能板,介绍如何快速开发一款安全性强的智能风扇的原型。

方案介绍

MCU方案与SoC方案不同,传感器和联网模组的驱动代码写在MCU中,您可以自己开发MCU代码,拥有更多的可玩性。

涂鸦三明治开发板BLDC套件中,BLDC板通过PWM接口接收NUCLEO-G071RB传过来的PWM,BLDC板通过接收到的PWM的占空比的大小对电机进行驱动。MCU控制板通过串口与Wi-Fi通信板连接,使用涂鸦智能App配网,可以将BLDC板的输出参数状态展现在手机端。MCU型号为STM32G071RB。

相关信息

只需简单的外围处理便可实现高效率的FOC电机驱动。FU6832的有感启动无感运行FOC驱动主要应用在各类低压风机上,典型应用如落地扇、空气净化器等。

注意:虽然BLDC功能板支持串口,按键和PWM控制,但是MCU控制板和Wi-Fi通信板通过右下角串口通信,为了减少对BLDC控制的影响,该功能板默认是只支持PWM控制的。

BLDC板的采样频率是12M,通过PWM占空比的大小来控制电机转速的,输入PWM占空比越大转速越快。PWM占空比越大转速越快,本教程中预设的输出频率为1000HZ。

  • 开机PWM占空比:0.08,大于该占空比时开机

  • 关机PWM占空比:0.06,小于该占空比关机(停机占空比不要设置为改变转向占空比区间内)

  • 改变转向的PWM占空比:0.01~0.025,处于该占空比则停机改变方向

  • PWM输出极性(Polarity)为低(LOW)

PWM配置示例(主频16M)如下图所示:

902fef9f1e0c41168025bc8d9be3b086~tplv-tt-shrink:640:0.image

物料清单

硬件(4)

涂鸦三明治Wi-FiMCU通信板(WB3S)

数量:1

板载涂鸦WB3S模组,负责智能化连接。模组已烧录通用固件,MCU对接涂鸦串口协议,即可使用涂鸦模组、App、云一站式智能化服务。

涂鸦三明治BLDC电机驱动功能板

数量:1

负责通过判断接收到的PWM的占空比大小进行对电机的控制。

涂鸦三明治直流供电电源板

数量:1

用标准的Arduino外形尺寸,您可以直接将相应的开发板堆叠在上方进行供电。因对BLDC功能板需要12V,5V,3.3V电源,使用电源板可以减少排线。

NUCLEO-G071RB

数量:1

采用ST官方MCU主控板,负责传感数据接收和模组通讯控制。NUCLEO-G071RB开发板支持Arduino接口。

  • 第1步:硬件连接和例程环境

本次使用的涂鸦三明治开发板BLDC套件主要包含:

BLDC功能板

Wi-FiMCU通信板

NUCLEO-G071RB

涂鸦直供电源电源板将三明治开发板套件电源板,控制板、通讯板、功能板拼接组装,实物效果如下图。

c9a128d9e95043d583d5536ba151de5b~tplv-tt-shrink:640:0.image

软件开发过程主要基于Keil5实现MCU与传感器和模组协议对接。首先调通MCU和模组的通讯,可以实现App配网,MCU数据传输到App。

  • 第2步:创建产品和工程

您可以根据以下步骤,快速在涂鸦IoT平台上开发一个智能风扇。

1、进入涂鸦智能IoT平台。

2、参考选品类创建产品创建一款门磁产品。其中产品属性如下:

开发方式:自定义方案

联网方式:Wi-Fi

功耗类型:标准功耗

f6d59753a19d48ff97b85dbcbea4e8d3~tplv-tt-shrink:640:0.image


3、根据页面提示选择产品的标准功能和自定义功能。例如,功能选择为风向、风速、工作模式、开关等。您还可以对某一项功能进行编辑。例如,如果您选择了工作模式功能,可以继续修改模式为自然风和睡眠风两种。

795c7160f17144cea7914058d3dcfef9~tplv-tt-shrink:640:0.image

4、选择您喜欢的面板,第一次开始调试也可以选择为开发调试面板,便于调试,后面也可以更换面板。

5、面板选择完后,进入硬件开发阶段,在页面拉到最下面,下载开发资料。

9d8a3b5c98d140b982f5fc1961575ff4~tplv-tt-shrink:640:0.image

6、硬件测试。下载到MCU开发包后,使用开发包中的涂鸦模组调试助手,您可以使用助手模拟MCU模式,配合调试模组通讯板,验证模组是否通讯正常,同时也可以熟悉涂鸦串口协议提高对接效率。确定通信板正常可用的,可以跳过此步骤。若调试过程中对协议收发有疑问,也可以使用此助手协助查看正确数据交互格式。使用步骤可参考涂鸦模组调试助手使用说明

  • 第3步:移植MCUSDK

本章节简单介绍了移植过程和功能实现,将mcu_sdk中的文件加入工程后,编译根据报错提示,进行修改。如需查看详细的移植调试教程,请参考MCUSDK移植。

1、如果编译过程中发生错误#40:expectedanidenTIfierDISABLE=0类似的错误提示,可以包含头文件#include"stm32f1xx.h来解决。对应头文件为实际芯片型号,例如,一个G071RB的芯片可以添加为#include"stm32g0xx.h。本教程因为没有介绍Wi-Fi功能测试,所以注释了WIFI_TEST_ENABLE的宏。

//#defineWIFI_TEST_ENABLE

2、完善uart_transmit_output()函数。

e54c3031fa6b46219338a39d79e0dac8~tplv-tt-shrink:640:0.image

3、完善uart_receive_input()函数。

edcdddcfc2d441b284664f2a55c24267~tplv-tt-shrink:640:0.image

4、在MCUWIFI通信板连接的串口的中断服务函数中添加以下代码,注意添加头文件或声明您用到的函数。

2d0bbdd2da33441cafa11cf53e3c11a8~tplv-tt-shrink:640:0.image

5、将wifi_uart_service()函数按照#error中的提示信息处理,处理后注释掉。

be262a75cbc64647b33ceac8036d2ad5~tplv-tt-shrink:640:0.image

6、将wifi_protocol_init()函数按照#error中的提示信息处理,处理后注释掉。

ee3ff5742df54c0b9a683608d5ec335b~tplv-tt-shrink:640:0.image

接下来便是all_data_update()函数,该函数会自动上报系统中所有DP信息,您不需要调用该函数。

第4步:定义结构体

定义一个结构体,用来记录电扇的工作状态。

//工作模式typedefenum{nature=0,sleep}fan_mode_t;//正反转typedefenum{forward=0,reverse}fan_direcTIon_t;//电扇工作状态结构体typedefstruct{_BoolOnOff;fan_mode_te_fan_mode;unsignedlongspeed;fan_direcTIon_te_fan_direcTIon;}fan_status_t;//电扇状态结构体,全局变量fan_status_tgs_fan_status={.OnOff=FALSE,.e_fan_mode=nature,.speed=10,.e_fan_direction=forward};

在protocol.c文件中,完善dp_download_switch_handle(),dp_download_mode_handle(),dp_download_fan_speed_handle()和dp_download_fan_direction_handle()这四个功能处理函数。
在protocol.c文件的dp_download_switch_handle()函数中:

staticunsignedchardp_download_switch_handle(constunsignedcharvalue[],unsignedshortlength){//示例:当前DP类型为BOOLunsignedcharret;//0:关/1:开unsignedcharswitch_1;switch_1=mcu_get_dp_download_bool(value,length);if(switch_1==0){//开关关gs_fan_status.OnOff=FALSE;}else{//开关开gs_fan_status.OnOff=TRUE;}//处理完DP数据后应有反馈ret=mcu_dp_bool_update(DPID_SWITCH,switch_1);if(ret==SUCCESS)returnSUCCESS;elsereturnERROR;}

在protocol.c文件的dp_download_mode_handle()函数中:

staticunsignedchardp_download_mode_handle(constunsignedcharvalue[],unsignedshortlength){//示例:当前DP类型为ENUMunsignedcharret;unsignedcharmode;mode=mcu_get_dp_download_enum(value,length);switch(mode){case0:gs_fan_status.e_fan_mode=nature;//自然风模式break;case1:gs_fan_status.e_fan_mode=sleep;//睡眠风模式break;default:gs_fan_status.e_fan_mode=nature;break;}//处理完DP数据后应有反馈ret=mcu_dp_enum_update(DPID_MODE,mode);if(ret==SUCCESS)returnSUCCESS;elsereturnERROR;}

在protocol.c文件的dp_download_fan_speed_handle()函数中:

staticunsignedchardp_download_fan_speed_handle(constunsignedcharvalue[],unsignedshortlength){//示例:当前DP类型为VALUEunsignedcharret;unsignedlongfan_speed;fan_speed=mcu_get_dp_download_value(value,length);/*//VALUE类型数据处理*/gs_fan_status.speed=fan_speed;//将下发的速度值给全局变量//处理完DP数据后应有反馈ret=mcu_dp_value_update(DPID_FAN_SPEED,fan_speed);if(ret==SUCCESS)returnSUCCESS;elsereturnERROR;}

在protocol.c文件的dp_download_fan_direction_handle()函数中:

staticunsignedchardp_download_fan_direction_handle(constunsignedcharvalue[],unsignedshortlength){//示例:当前DP类型为ENUMunsignedcharret;unsignedcharfan_direction;fan_direction=mcu_get_dp_download_enum(value,length);switch(fan_direction){case0://判断当前风向是否为正转,当前风向若不是正转,则改变风向,并将当前状态给全局变量if(gs_fan_status.e_fan_direction!=forward){change_fan_direction();gs_fan_status.e_fan_direction=forward;}break;case1://判断当前风向是否为反转,当前风向若不是反转,则改变风向,并将当前状态给全局变量if(gs_fan_status.e_fan_direction!=reverse){change_fan_direction();gs_fan_status.e_fan_direction=reverse;}break;default:break;}//处理完DP数据后应有反馈ret=mcu_dp_enum_update(DPID_FAN_DIRECTION,fan_direction);if(ret==SUCCESS)returnSUCCESS;elsereturnERROR;}
第5步:功能实现

在main.c文件中,添加头文件#include"mcu_api.h"和#include“wifi.h”,定义以下宏和变量:

//最小速度时,输出的PWM占空比#defineMIN_SPEED10//最大速度时,输出的PWM占空比//最大速度输出的PWM占空比应该为100(建议最大设置为99),我这里因为演示设置较低#defineMAX_SPEED35//关机输出占空比#defineOFF_SPEED5//改变风扇转向输出的PWM值,在BLDC开发板中输出PWM在1%~2.5%之间改变电机转向#defineDIRECTION_CHANGE_PWM15//睡眠模式下,风速改变时间#defineSLEEP_TIME700//上一次风扇速度,全局变量unsignedlonglast_fan_speed=0;//风速sleep模式下,改变风速计数值和风速改变标志,全局变量unsignedlongfen_count=SLEEP_TIME;_Boolsleep_speed_flag=TRUE;

启动后,进入while(1){}循环前需处理的:

voidsetup(void){//优先输出频率为1000HZ,占空比为5%,使电机处于关机状态HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,(OFF_SPEED*10));//打开与涂鸦三明治Wi-FiMCU通信板(E3S)通信的UART1接收中断__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//完成wifi协议初始化wifi_protocol_init();}

在while(1){}循环内:

while(1){//wifi串口数据处理服务wifi_uart_service();//进入配网模式,并改变LED灯状态进行提示connect_tuya();if(gs_fan_status.OnOff==TRUE){//开机//判断工作模式check_mode();}else{set_fan_speed(0);}}```在connect_tuya()函数中:```objectivec//该函数主要功能为:当PC3被拉低后,进入配网模式。根据不同联网状态,改变LED灯状态进行提示。voidconnect_tuya(void){//判断PC3是否拉低if(HAL_GPIO_ReadPin(WIFI_KEY_GPIO_Port,WIFI_KEY_Pin)==GPIO_PIN_RESET){HAL_Delay(300);if(HAL_GPIO_ReadPin(WIFI_KEY_GPIO_Port,WIFI_KEY_Pin)==GPIO_PIN_RESET){mcu_set_wifi_mode(0);}}//获取当前连接状态,显示LED提示switch(mcu_get_wifi_work_state()){caseSMART_CONFIG_STATE://SMART配网模式,快闪HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);HAL_Delay(250);break;caseAP_STATE://AP配网模式,快闪HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);HAL_Delay(250);break;caseWIFI_NOT_CONNECTED://慢闪HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);HAL_Delay(250);break;caseWIFI_CONNECTED://常亮,连接到WIFIcaseWIFI_CONN_CLOUD://常亮,连接到WIFI和云平台HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);break;default:HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);break;}}


在set_fan_speed()函数中:

//该函数主要功能为:根据不同转速,输出对应的PWM。PWM频率为1000HZ。voidset_fan_speed(unsignedlongspeed){//输入为0,关闭电机if(speed==0){__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,(OFF_SPEED*10));last_fan_speed=OFF_SPEED;//将当前转速,记录下来return;}//判断输入值是否超出最大,最小值if(speed< MIN_SPEED) {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, (MIN_SPEED * 10));
last_fan_speed = MIN_SPEED;
} else if (speed >MAX_SPEED){__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,(MAX_SPEED*10));last_fan_speed=MAX_SPEED;}else{__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,(speed*10));last_fan_speed=speed;}return;}在check_mode()函数中:voidcheck_mode(void){if(gs_fan_status.e_fan_mode==sleep){//进入睡眠模式if((sleep_speed_flag==TRUE)&&(fen_count>=SLEEP_TIME)){set_fan_speed(gs_fan_status.speed);//计数清零,改变风速fen_count=0;sleep_speed_flag=FALSE;}elseif((sleep_speed_flag==FALSE)&&(fen_count>=SLEEP_TIME)){set_fan_speed(MIN_SPEED);//计数清零,改变风速fen_count=0;sleep_speed_flag=TRUE;}fen_count++;HAL_Delay(10);}else{if(last_fan_speed!=gs_fan_status.speed){//如果上一次转速和目标转速不一致,改变转速set_fan_speed(gs_fan_status.speed);}}}
小结

基于涂鸦智能平台,使用三明治开发板,Keil开发环境您可以快速地开发一款智能风扇产品的原型。

还等什么?

auth.tuya.com/?from=https%3A%2F%2Fiot.tuya.com%2F&_source=795a75d7c1af33f95d8ea55409e4b22e
更多信息

BLDC功能板采用FU6832s作为主控芯片,FU6832系列是一款集成电机控制引擎(ME)和8051内核的高性能电机驱动专用芯片,ME集成FOC、MDU、LPF、PI、SVPWM/SPWM等诸多硬件模组,可硬件自动完成电机FOC/BLDC运算控制。8051内核用于参数配置和日常事务处理,双核并行工作实现各种高性能电机控制。其中8051内核大部分指令周期为1T或2T,芯片内部集成有高速运算放大器、比较器、Pre-driver、高速ADC、高速乘/除法器、CRC、SPI、I2C、UART、LIN、多种TIMER、PWM等功能,内置高压LDO,适用于BLDC/PMSM电机的方波、SVPWM/SPWM、FOC驱动控制。

FU6832内部具有全面保护,包括过压保护,欠压保护,过流保护,FO保护,堵转保护,缺相保护,过温保护,过功率保护,运放偏置电压异常保护。可根据需要选择使能对应的保护,再根据实际情况微调。




工程师
2021-01-15 23:59:09     打赏
2楼

动手能力非常强


工程师
2021-02-19 00:03:07     打赏
3楼

谢谢您的设计


高工
2021-02-22 09:08:54     打赏
4楼


专家
2021-03-01 17:34:02     打赏
5楼



助工
2022-06-27 18:24:47     打赏
6楼

涂鸦智能可以转载这篇文章吗?


助工
2022-06-28 10:10:51     打赏
7楼

你好,这篇文章写的很棒,请问我们涂鸦智能可以转载吗?


专家
2022-06-29 07:56:52     打赏
8楼

好家伙,叠了4层,厉害了


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]