首頁>家居>

智慧風扇是一款常見的智慧裝置,使用者可以使用手機 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)如下圖所示:

物料清單

硬體 (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

功耗型別:標準功耗

3、根據頁面提示選擇產品的標準功能和自定義功能。例如,功能選擇為風向、風速、工作模式、開關等。您還可以對某一項功能進行編輯。例如,如果您選擇了工作模式功能,可以繼續修改模式為自然風和睡眠風兩種。

4、選擇您喜歡的面板,第一次開始除錯也可以選擇為開發除錯面板,便於除錯,後面也可以更換面板。

5、面板選擇完後,進入 硬體開發 階段,在頁面拉到最下面,下載開發資料。

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()函式。

3、完善uart_receive_input()函式。

4、在MCUWIFI通訊板連線的串列埠的中斷服務函式中新增以下程式碼,注意新增標頭檔案或宣告您用到的函式。

5、將wifi_uart_service()函式按照#error中的提示資訊處理,處理後註釋掉。

6、將wifi_protocol_init()函式按照#error中的提示資訊處理,處理後註釋掉。

接下來便是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/register?from=http%3A%2F%2Fiot.tuya.com%2F&_source=e74d60a1928993e1892f7e5efbaa5467

更多資訊

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保護,堵轉保護,缺相保護,過溫保護,過功率保護,運放偏置電壓異常保護。可根據需要選擇使能對應的保護,再根據實際情況微調。

35
最新評論
  • 秋天養茉莉,進入“衰弱期”,多曬少澆水,“保命”是第一!
  • 日常斷舍離