智慧風扇是一款常見的智慧裝置,使用者可以使用手機 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保護,堵轉保護,缺相保護,過溫保護,過功率保護,運放偏置電壓異常保護。可根據需要選擇使能對應的保護,再根據實際情況微調。