全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 便携设备 >

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

时间:2021-01-06 16:28

人气:

作者:admin

标签: Wi-Fi  32位MCU  智能风扇  mcu 

导读:Keil5编程实例之基于涂鸦IoT平台快速开发智能风扇-本教程采用 Keil5 进行编程,基于涂鸦 IoT 平台和三明治 BLDC 功能板,介绍如何快速开发一款安全性强的智能风扇的原型。...

智能风扇是一款常见的智能设备,用户可以使用手机 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-Fi MCU 通信板(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-Fi MCU 通信板

NUCLEO-G071RB

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

 

软件开发过程主要基于 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 步:移植 MCU SDK

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

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

//#define         WIFI_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 步:定义结构体

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

//工作模式typedef enum {
	nature = 0,
	sleep
}fan_mode_t;//正反转typedef enum {
	forward = 0,
	reverse
}fan_direction_t;//电扇工作状态结构体typedef struct {
	_Bool OnOff;	fan_mode_t e_fan_mode;	unsigned long speed;	fan_direction_t e_fan_direction;
}fan_status_t;//电扇状态结构体,全局变量fan_status_t gs_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()函数中:

static unsigned char dp_download_switch_handle(const unsigned char value[], unsigned short length)
{    //示例:当前DP类型为BOOL
    unsigned char ret;    //0:关/1:开
    unsigned char switch_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)        return SUCCESS;    else
        return ERROR;
}

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

static unsigned char dp_download_mode_handle(const unsigned char value[], unsigned short length){    //示例:当前DP类型为ENUM
    unsigned char ret;    unsigned char mode;
    
    mode = mcu_get_dp_download_enum(value,length);    switch(mode) {        case 0:
					gs_fan_status.e_fan_mode = nature;	//自然风模式
        break;        
        case 1:
					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)        return SUCCESS;    else
        return ERROR;
}

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

static unsigned char dp_download_fan_speed_handle(const unsigned char value[], unsigned short length){    //示例:当前DP类型为VALUE
    unsigned char ret;    unsigned long fan_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)        return SUCCESS;    else
        return ERROR;
}

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

static unsigned char dp_download_fan_direction_handle(const unsigned char value[], unsigned short length){    //示例:当前DP类型为ENUM
    unsigned char ret;    unsigned char fan_direction;
    
    fan_direction = mcu_get_dp_download_enum(value,length);    switch(fan_direction) {        case 0:		//判断当前风向是否为正转,当前风向若不是正转,则改变风向,并将当前状态给全局变量
					if(gs_fan_status.e_fan_direction != forward) {
						change_fan_direction();
						gs_fan_status.e_fan_direction = forward;
					}        break;        
        case 1:		//判断当前风向是否为反转,当前风向若不是反转,则改变风向,并将当前状态给全局变量
					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)        return SUCCESS;    else
        return ERROR;
}

第 5 步:功能实现

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

//最小速度时,输出的PWM占空比#define MIN_SPEED	10//最大速度时,输出的PWM占空比//最大速度输出的PWM占空比应该为100(建议最大设置为99),我这里因为演示设置较低#define MAX_SPEED	35//关机输出占空比#define	OFF_SPEED	5//改变风扇转向输出的PWM值,在BLDC开发板中输出PWM在1%~2.5%之间改变电机转向#define DIRECTION_CHANGE_PWM 15//睡眠模式下,风速改变时间#define SLEEP_TIME 700//上一次风扇速度,全局变量unsigned long last_fan_speed = 0;//风速sleep模式下,改变风速计数值和风速改变标志,全局变量unsigned long fen_count = SLEEP_TIME;_Bool sleep_speed_flag = TRUE;	

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

void setup(void)
{	//优先输出频率为1000HZ,占空比为5%,使电机处于关机状态
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);	__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, (OFF_SPEED * 10));	
	//打开与涂鸦三明治 Wi-Fi MCU 通信板(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灯状态进行提示。void connect_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())
	{				case SMART_CONFIG_STATE:	//SMART配网模式,快闪
						HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);						HAL_Delay(250);				break;				case AP_STATE:	//AP配网模式,快闪
						HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);						HAL_Delay(250);				break;				case WIFI_NOT_CONNECTED: //慢闪
						HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);						HAL_Delay(250);				break;				case WIFI_CONNECTED://常亮,连接到WIFI
				case WIFI_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。void set_fan_speed(unsigned long speed)
{	//输入为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()函数中:void check_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;
		} else if((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保护,堵转保护,缺相保护,过温保护,过功率保护,运放偏置电压异常保护。可根据需要选择使能对应的保护,再根据实际情况微调。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信