博客專欄

EEPW首頁 > 博客 > 聽說隔壁班的程序員給女友做了個智能風扇

聽說隔壁班的程序員給女友做了個智能風扇

發(fā)布人:智能物聯(lián)研習社 時間:2020-12-29 來源:工程師 發(fā)布文章

智能風扇是一款常見的智能設備,用戶可以使用手機 App 輕松控制,通過遠程控制開關、風速、場景聯(lián)動等來輕松創(chuàng)造出溫暖、放松、舒適的室內空間。本教程采用 Keil5 進行編程,基于涂鴉 IoT 平臺和三明治 BLDC 功能板,介紹如何快速開發(fā)一款安全性強的智能風扇的原型。

方案介紹

MCU 方案與 SoC 方案不同,傳感器和聯(lián)網(wǎng)模組的驅動代碼寫在 MCU 中,您可以自己開發(fā) MCU 代碼,擁有更多的可玩性。

涂鴉三明治開發(fā)板 BLDC 套件中,BLDC 板通過 PWM 接口接收 NUCLEO-G071RB 傳過來的 PWM,BLDC 板通過接收到的 PWM 的占空比的大小對電機進行驅動。MCU 控制板通過串口 與 Wi-Fi 通信板連接,使用涂鴉智能 App 配網(wǎng),可以將BLDC板的輸出參數(shù)狀態(tài)展現(xiàn)在手機端。MCU 型號為 STM32G071RB。

相關信息

只需簡單的外圍處理便可實現(xiàn)高效率的 FOC 電機驅動。FU6832 的有感啟動無感運行FOC驅動主要應用在各類低壓風機上,典型應用如落地扇、空氣凈化器等。

注意:雖然 BLDC 功能板支持串口,按鍵和PWM控制,但是 MCU 控制板和 Wi-Fi 通信板通過右下角串口通信,為了減少對 BLDC 控制的影響,該功能板默認是只支持 PWM 控制的。

BLDC 板的采樣頻率是 12M,通過 PWM 占空比的大小來控制電機轉速的,輸入 PWM 占空比越大轉速越快。PWM 占空比越大轉速越快,本教程中預設的輸出頻率為 1000HZ。

  • 開機 PWM 占空比:0.08,大于該占空比時開機

  • 關機 PWM 占空比:0.06,小于該占空比關機(停機占空比不要設置為改變轉向占空比區(qū)間內)

  • 改變轉向的 PWM 占空比:0.01~0.025,處于該占空比則停機改變方向

  • PWM 輸出極性(Polarity)為低(LOW)

PWM配置示例(主頻 16M)如下圖所示:


物料清單

硬件 (4)

涂鴉三明治 Wi-Fi MCU 通信板(WB3S)

數(shù)量:1

板載涂鴉 WB3S 模組,負責智能化連接。模組已燒錄通用固件,MCU 對接涂鴉串口協(xié)議,即可使用涂鴉模組、App、云一站式智能化服務。

涂鴉三明治BLDC電機驅動功能板

數(shù)量:1

負責通過判斷接收到的 PWM 的占空比大小進行對電機的控制。

涂鴉三明治直流供電電源板

數(shù)量:1

用標準的 Arduino 外形尺寸,您可以直接將相應的開發(fā)板堆疊在上方進行供電。因對BLDC功能板需要 12V,5V,3.3V 電源,使用電源板可以減少排線。

NUCLEO-G071RB

數(shù)量:1

采用 ST 官方 MCU 主控板,負責傳感數(shù)據(jù)接收和模組通訊控制。NUCLEO-G071RB 開發(fā)板支持 Arduino 接口。

  • 第 1 步:硬件連接和例程環(huán)境

本次使用的涂鴉三明治開發(fā)板 BLDC 套件主要包含:

BLDC 功能板

Wi-Fi MCU 通信板

NUCLEO-G071RB

涂鴉直供電源電源板將三明治開發(fā)板套件電源板,控制板、通訊板、功能板拼接組裝,實物效果如下圖。


軟件開發(fā)過程主要基于 Keil5 實現(xiàn) MCU 與傳感器和模組協(xié)議對接。首先調通 MCU 和模組的通訊,可以實現(xiàn)App配網(wǎng),MCU 數(shù)據(jù)傳輸?shù)紸pp。

  • 第 2 步:創(chuàng)建產(chǎn)品和工程

您可以根據(jù)以下步驟,快速在涂鴉 IoT 平臺上開發(fā)一個智能風扇。

1、進入 涂鴉智能IoT平臺。

2、參考 選品類創(chuàng)建產(chǎn)品 創(chuàng)建一款門磁產(chǎn)品。其中產(chǎn)品屬性如下:

開發(fā)方式:自定義方案

聯(lián)網(wǎng)方式:Wi-Fi

功耗類型:標準功耗



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


4、選擇您喜歡的面板,第一次開始調試也可以選擇為開發(fā)調試面板,便于調試,后面也可以更換面板。

5、面板選擇完后,進入 硬件開發(fā) 階段,在頁面拉到最下面,下載開發(fā)資料。


6、硬件測試。下載到 MCU 開發(fā)包后,使用開發(fā)包中的涂鴉模組調試助手,您可以使用助手模擬 MCU 模式,配合調試模組通訊板,驗證模組是否通訊正常,同時也可以熟悉涂鴉串口協(xié)議提高對接效率。確定通信板正??捎玫模梢蕴^此步驟。若調試過程中對協(xié)議收發(fā)有疑問,也可以使用此助手協(xié)助查看正確數(shù)據(jù)交互格式。 使用步驟可參考 涂鴉模組調試助手使用說明。

  • 第 3 步:移植 MCU SDK

本章節(jié)簡單介紹了移植過程和功能實現(xiàn),將 mcu_sdk 中的文件加入工程后,編譯根據(jù)報錯提示,進行修改。如需查看詳細的移植調試教程,請參考 MCU SDK 移植。

1、如果編譯過程中發(fā)生錯誤 #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()函數(shù)。


3、完善uart_receive_input()函數(shù)。


4、在MCUWIFI通信板連接的串口的中斷服務函數(shù)中添加以下代碼,注意添加頭文件或聲明您用到的函數(shù)。


5、將wifi_uart_service()函數(shù)按照#error中的提示信息處理,處理后注釋掉。


6、將wifi_protocol_init()函數(shù)按照#error中的提示信息處理,處理后注釋掉。


接下來便是all_data_update()函數(shù),該函數(shù)會自動上報系統(tǒng)中所有DP信息,您不需要調用該函數(shù)。

第4 步:定義結構體

定義一個結構體,用來記錄電扇的工作狀態(tài)。

//工作模式typedef enum {
	nature = 0,
	sleep
}fan_mode_t;//正反轉typedef enum {
	forward = 0,
	reverse
}fan_direction_t;//電扇工作狀態(tài)結構體typedef struct {
	_Bool OnOff;	fan_mode_t e_fan_mode;	unsigned long speed;	fan_direction_t e_fan_direction;
}fan_status_t;//電扇狀態(tài)結構體,全局變量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()這四個功能處理函數(shù)。
在protocol.c文件的dp_download_switch_handle()函數(shù)中:

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數(shù)據(jù)后應有反饋
    ret = mcu_dp_bool_update(DPID_SWITCH,switch_1);    if(ret == SUCCESS)        return SUCCESS;    else
        return ERROR;
}

在protocol.c文件的dp_download_mode_handle()函數(shù)中:

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數(shù)據(jù)后應有反饋
    ret = mcu_dp_enum_update(DPID_MODE, mode);    if(ret == SUCCESS)        return SUCCESS;    else
        return ERROR;
}

在protocol.c文件的dp_download_fan_speed_handle()函數(shù)中:

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類型數(shù)據(jù)處理
    
    */
    gs_fan_status.speed = fan_speed;	//將下發(fā)的速度值給全局變量
    //處理完DP數(shù)據(jù)后應有反饋
    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()函數(shù)中:

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:		//判斷當前風向是否為正轉,當前風向若不是正轉,則改變風向,并將當前狀態(tài)給全局變量
					if(gs_fan_status.e_fan_direction != forward) {
						change_fan_direction();
						gs_fan_status.e_fan_direction = forward;
					}        break;        
        case 1:		//判斷當前風向是否為反轉,當前風向若不是反轉,則改變風向,并將當前狀態(tài)給全局變量
					if(gs_fan_status.e_fan_direction != reverse) {
						change_fan_direction();
						gs_fan_status.e_fan_direction = reverse;
					}        break;        
        default:        break;
    }    
    //處理完DP數(shù)據(jù)后應有反饋
    ret = mcu_dp_enum_update(DPID_FAN_DIRECTION, fan_direction);    if(ret == SUCCESS)        return SUCCESS;    else
        return ERROR;
}

第 5 步:功能實現(xiàn)

在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開發(fā)板中輸出PWM在1%~2.5%之間改變電機轉向#define DIRECTION_CHANGE_PWM 15//睡眠模式下,風速改變時間#define SLEEP_TIME 700//上一次風扇速度,全局變量unsigned long last_fan_speed = 0;//風速sleep模式下,改變風速計數(shù)值和風速改變標志,全局變量unsigned long fen_count = SLEEP_TIME;_Bool sleep_speed_flag = TRUE;	

啟動后,進入while(1){}循環(huán)前需處理的:

void setup(void)
{	//優(yōu)先輸出頻率為1000HZ,占空比為5%,使電機處于關機狀態(tài)
	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協(xié)議初始化
	wifi_protocol_init();
}

在while(1){}循環(huán)內:

while (1)
  {		//wifi串口數(shù)據(jù)處理服務
		wifi_uart_service();		
		//進入配網(wǎng)模式,并改變LED燈狀態(tài)進行提示
		connect_tuya();		
		if (gs_fan_status.OnOff == TRUE) { //開機
			//判斷工作模式
			check_mode();
		} else {			set_fan_speed(0);
		}
  }
```

在connect_tuya()函數(shù)中:

```objectivec//該函數(shù)主要功能為:當PC3被拉低后,進入配網(wǎng)模式。根據(jù)不同聯(lián)網(wǎng)狀態(tài),改變LED燈狀態(tài)進行提示。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);
		}
	}	
	//獲取當前連接狀態(tài),顯示LED提示
	switch(mcu_get_wifi_work_state())
	{				case SMART_CONFIG_STATE:	//SMART配網(wǎng)模式,快閃
						HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);						HAL_Delay(250);				break;				case AP_STATE:	//AP配網(wǎng)模式,快閃
						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()函數(shù)中:

//該函數(shù)主要功能為:根據(jù)不同轉速,輸出對應的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()函數(shù)中: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);			//計數(shù)清零,改變風速
			fen_count = 0;
			sleep_speed_flag = FALSE;
		} else if((sleep_speed_flag == FALSE) && (fen_count >= SLEEP_TIME)) {
			
			set_fan_speed(MIN_SPEED);			//計數(shù)清零,改變風速
			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);
		}
	}
}

小結

基于涂鴉智能平臺, 使用三明治開發(fā)板,Keil開發(fā)環(huán)境您可以快速地開發(fā)一款智能風扇產(chǎn)品的原型。

還等什么?

auth.tuya.com/?from=https%3A%2F%2Fiot.tuya.com%2F&_source=5da300e50745947aec50c44f209c5367

更多信息

BLDC 功能板采用 FU6832s 作為主控芯片,F(xiàn)U6832 系列是一款集成電機控制引擎(ME)和 8051 內核的高性能電機驅動專用芯片,ME 集成FOC、MDU、LPF、PI、SVPWM/SPWM 等諸多硬件模組,可硬件自動完成電機 FOC/BLDC運算控制。8051 內核用于參數(shù)配置和日常事務處理,雙核并行工作實現(xiàn)各種高性能電機控制。其中8051 內核大部分指令周期為 1T 或 2T,芯片內部集成有高速運算放大器、比較器、Pre-driver、高速 ADC、高速乘/除法器、CRC、SPI、I2C、UART、LIN、多種 TIMER、PWM 等功能,內置高壓 LDO,適用于 BLDC/PMSM 電機的方波、SVPWM/SPWM、FOC 驅動控制。

FU6832 內部具有全面保護,包括過壓保護,欠壓保護, 過流保護,F(xiàn)O保護,堵轉保護,缺相保護,過溫保護,過功率保護,運放偏置電壓異常保護??筛鶕?jù)需要選擇使能對應的保護,再根據(jù)實際情況微調。

快來做出你的創(chuàng)意叭,推薦平臺如下,親測有效:

https://auth.tuya.com/?_source=7c8653b7bd61bf9239a1a6c12e52124d   


*博客內容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞: 嵌入式 工程師

相關推薦

技術專區(qū)

關閉