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











評論