--提示:啟明智顯專為智能產(chǎn)品提供一站式彩屏顯示+連接+云端服務+APP軟件開發(fā)、維護等解決方案,幫廠商快速實現(xiàn)硬件的智能化。作為啟明云端旗下方案公司,我們用心整理了開發(fā)小伙伴在開發(fā)過程中可能會遇到的問題以及快速上手的簡明教程,同時也用心整理了連接+顯示應用的新方案!希望你能第一時間了解并快速用上好的方案和產(chǎn)品!--
 
 
## 一、LED PWM 控制器
 
### 1、簡介
LED 控制器 (LEDC) 主要用于控制 LED,也可產(chǎn)生 PWM 信號用于其他設備的控制。 該控制器有 16 路通道,可以產(chǎn)生獨立的波形來驅(qū)動 RGB LED 等設備。
LEDC 通道共有兩組,分別為 8 路高速通道和 8 路低速通道。高速通道模式在硬件中實現(xiàn),可以自動且無干擾地改變 PWM 占空比。低速通道模式下,PWM 占空比需要由軟件中的驅(qū)動器改變。每組通道都可以使用不同的時鐘源。
LED PWM 控制器可在無需 CPU 干預的情況下自動改變占空比,實現(xiàn)亮度和顏色漸變。
[參考](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html)
設置 LEDC 通道在 [高速模式或低速模式](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#ledc-api-high-low-speed-mode) 下運行,需要進行如下配置:
1. [定時器配置](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#ledc-api-configure-timer) 指定 PWM 信號的頻率和占空比分辨率。
另一個可選步驟是可以在漸變終端設置一個中斷。
在解釋ESP32上的PWM功能之前,讓我們討論一些與PWM相關(guān)的術(shù)語。
●  **TON(導通時間)**:信號為高電平時的持續(xù)時間。
●  **TOFF(關(guān)斷時間)**:信號為低電平時的持續(xù)時間。
●  **周期**:PWM信號的導通時間和關(guān)斷時間之和。
●  **占空比**:PWM信號周期內(nèi)信號為高電平的時間百分比。
?    例如,如果總周期為10ms的脈沖保持 ON(高)5ms。然后,占空比將為:占空比 = 5/10 * 100 = 50%
●  **PWM的頻率:**PWM信號的頻率決定了PWM完成一個周期的速度。一個周期是一個PWM信號的完整ON和OFF,如上圖所示。
### 2、配置定時器
要設置定時器,可調(diào)用函數(shù) [`ledc_timer_config()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv417ledc_timer_configPK19ledc_timer_config_t),并將包括如下配置參數(shù)的數(shù)據(jù)結(jié)構(gòu) [`ledc_timer_config_t`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv419ledc_timer_config_t) 傳遞給該函數(shù):
- 速度模式 [`ledc_mode_t`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv411ledc_mode_t)
頻率和占空比分辨率相互關(guān)聯(lián)。PWM 頻率越高,占空比分辨率越低,反之亦然。如果 API 不是用來改變 LED 亮度,而是用于其它目的,這種相互關(guān)系可能會很重要。更多信息詳見 [頻率和占空比分辨率支持范圍](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#ledc-api-supported-range-frequency-duty-resolution) 一節(jié)。
時鐘源同樣可以限制PWM頻率。選擇的時鐘源頻率越高,可以配置的PWM頻率上限就越高。
	
		
			時鐘名稱 
			時鐘頻率 
			速度模式 
			時鐘功能 
		 
		
			APB_CLK 
			80 MHz 
			高速 / 低速 
			/ 
		 
		
			REF_TICK 
			1 MHz 
			高速 / 低速 
			支持動態(tài)調(diào)頻(DFS)功能 
		 
		
			RTC8M_CLK 
			~8 MHz 
			低速 
			支持動態(tài)調(diào)頻(DFS)功能,支持Light-sleep模式 
		 
	 
**通道配置**
定時器設置好后,請配置所需的通道([`ledc_channel_t`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv414ledc_channel_t) 之一)。配置通道需調(diào)用函數(shù) [`ledc_channel_config()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv419ledc_channel_configPK21ledc_channel_config_t)。
通道的配置與定時器設置類似,需向通道配置函數(shù)傳遞包括通道配置參數(shù)的結(jié)構(gòu)體 [`ledc_channel_config_t`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv421ledc_channel_config_t) 。
此時,通道會按照 [`ledc_channel_config_t`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv421ledc_channel_config_t) 的配置開始運作,并在選定的 GPIO 上生成由定時器設置指定的頻率和占空比的 PWM 信號。在通道運作過程中,可以隨時通過調(diào)用函數(shù) [`ledc_stop()`](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/ledc.html#_CPPv49ledc_stop11ledc_mode_t14ledc_channel_t8uint32_t) 將其暫停。
### 3、示例
```c
    ledc_timer_config_t ledc_timer = {
    ledc_timer_config(&ledc_timer);
    ledc_channel_config(&ledc_channel);
    while (1) {
 
## 二、Motor Control Pulse Width Modulator(MCPWM)
### 1、簡介
ESP32有兩個MCPWM單元,可用于控制不同類型的電機。每個單元有三對PWM輸出。
**作用**:
- PWM輸出
每個A/B對可由三個定時器中的任何一個MCPWM定時器0、1和2中的任何一個時鐘。(相同的定時器可用于時鐘多對PWM輸出)
從上圖我們不難發(fā)現(xiàn),MCPWM具有的功能(上圖彩色的虛線框)有:
- `OPERATOR `操作器模塊
 
**1、操作器模塊 Operator**
**操作員 (Operator) 用于操作連接到MCPWM單元的電機。**例如改變旋轉(zhuǎn)方向(順時針或逆時針),或改變轉(zhuǎn)速。
?      操作員輸出一共有 3 對,我們可以對其施加控制信號。標記為“A”和“B”的稱為一對。A、B均有自己對應的名為“Generator”的子模塊來驅(qū)動諸如PWM的輸出信號。
?      為了提供PWM信號,每個Operator本身由三個可用的定時器(MCPWM Timer)中的任何一個進行計時。  
?      為了簡化API,API會 自動關(guān)聯(lián) 具有相同索引`Timer`以驅(qū)動`Operator`。例如`Timer 0`與`Operator 0`關(guān)聯(lián)。
**2、捕獲模塊 Capture**
?      對于無刷直流電機,控制的要求之一是感應轉(zhuǎn)子位置。
?      為了完成這一任務,每個 MCPWM單元提供三個傳感輸入以及專用的硬件。該硬件能夠檢測輸入信號的邊緣,并測量信號之間的時間。
?       因此,控制軟件更簡單,CPU功率可能用于其他任務。
注意:3個Capture可以在不使用PWM輸出時**單獨使用**,即只配置Capture實現(xiàn)邊緣捕獲功能。**因此MCPWM還可用于非電機外設**。例如,使用MCPWM的Capture0去捕獲**HC-SR04**超聲波模塊ECHO引腳的高電平時間,進而實現(xiàn)測距。
**3、故障處理器模塊 Fault Detect**
- 鎖定輸出的當前狀態(tài)
- 設置低輸出
- 設置高輸出
- 開關(guān)輸出
  用戶應確定電機可能的故障模式以及在檢測到特定故障時應采取的行動。
  例如:對有刷電機驅(qū)動所有輸出為低,或?qū)Σ竭M電機鎖定電流狀態(tài)等。這個動作會使電機處于安全狀態(tài),以減少故障造成的損壞的可能性。
**4、載波 Carrier和中斷 Interrupts**
?       通過調(diào)用`mcpwm_isr_register()`可以注冊MCPWM中斷處理程序。
### 2、使用 MCPWM 輸出 PWM 信號
#### 2.1 創(chuàng)建MCPWM
初始化MCPWM需要的步驟:
- 配置GPIO口
- 在一個`mcpwm_config_t`結(jié)構(gòu)體中設置定時器頻率和初始任務的設置。
- 非必須:設置定時器分辨率(默認為10,000,000)。使用函數(shù)`mcpwm_group_set_resolution() `和 `mcpwm_timer_set_resolution()`
 
1,配置GPIO口:使用函數(shù)mcpwm_gpio_init()或函數(shù)mcpwm_set_pin()。
兩者的區(qū)別是前者為指定的功能配置   GPIO,而后者是一次性配置所有的GPIO。
**mcpwm_gpio_init()**  //初始化一個GPIO
```c
**mcpwm_set_pin()**   //配置所有與MCPWM有關(guān)的GPIO
```c
2,配置mcpwm參數(shù)
通過函數(shù)`mcpwm_init()`,傳遞一個`mcpwm_config_t`結(jié)構(gòu)體指針
**mcpwm_init()**
```c
 
//示例
#### 2.2  PWM信號控制
- **1、設置為全速(非PWM信號)**
   **mcpwm_set_signal_high(或low) ()**   // 設置MCPWM的某個generator信號為高[或低]
  ```c
- **2、設置PWM信號**
  **mcpwm_set_duty (in_us) ()** //設置占空比
  ```c
**mcpwm_set_duty_type()**   //設置占空比類型,并恢復PWM輸出
 
  ```c
- **3、啟動輸出**
  **mcpwm_start(或stop)()** // 啟動[或關(guān)閉]MCPWM輸出
  ```c
 
### 3、示例
使用mcpwm驅(qū)動直流電機
```c
#define GPIO_PWM0A_OUT 15 //設置 GPIO 15 作為 PWM0A
//---------電機向前移動
//--------- 電機向后移動
    mcpwm_set_duty_type(mcpwm_num, timer_num, MCPWM_OPR_B, MCPWM_DUTY_MODE_1);
//---------電機停止
//---------為直流電機配置MCPWM
    //2. 初始化 mcpwm 配置
    while (1)
void app_main(void)