目前對于遙控雙發差速小飛機計劃采用如下架構:
遙控小飛機框圖
馬達控制要用到 pwm,今天把 esp32c3 的 pwm 跑一下。
簡介
esp32c3 中把 pwm 外設稱為“LED PWM 控制器”,共有 6 個通道,可分配到任意 GPIO 管腳:
- 四個獨立定時器,可實現小數分頻
- 波形的周期和占空比可配置,占空比精確度可達 14 位
- PWM 輸出信號相位可調節
- 可在 Light-sleep 模式下工作
- 多種時鐘源選擇,包括 APB 總線時鐘、外置主晶振時鐘
- 支持硬件自動步進式地增加或減少占空比,可用于 LED RGB 彩色梯度發生器
占空比自動漸變是一個特色功能,用于呼吸燈或其它 LED 燈效會很方便,在官方文檔特意介紹說是 LED PWM 控制器。
使用方法
LED PWM控制器架構
4 個定時器可獨立配置(可配置時鐘分頻器和計數器最大值),每個定時器內部有一個時基計數器(即基于基準時鐘周期計數的計數器)。每個 PWM 生成器在四個定時器中擇一,以該定時器的計數值為基準生成 PWM 信號。
下圖為定時器和 PWM 生成器的主要功能塊。
定時器和PWM生成器功能塊
LED PWM 控制器的每個定時器內部都有一個時基計數器。上圖中時基計數器使用的時鐘信號稱為ref_pulsex
。所有定時器使用同一個時鐘源信號LEDC_CLKx
,該時鐘源信號經分頻器分頻后產生ref_pulsex
供計數器使用。
設置 LEDC 通道分三步完成。注意,與 ESP32 不同,ESP32-C3 僅支持設置通道為低速模式。
- 定時器配置,指定 PWM 信號的頻率和占空比分辨率。
- 通道配置,綁定定時器和輸出 PWM 信號的 GPIO。
- 改變 PWM 信號,輸出 PWM 信號來驅動 LED??赏ㄟ^軟件控制或使用硬件漸變功能來改變 LED 的亮度。
另一個可選步驟是可以在漸變終端設置一個中斷。
LED PWM 控制器 API 的關鍵配置
首次 LEDC 配置時,最好先配置定時器(調用函數 ledc_timer_config()
),再配置通道(調用函數 ledc_channel_config()
)。這樣可以確保 IO 腳上的 PWM 信號自有輸出開始其頻率就是正確的。
定時器配置
要設置定時器,可調用函數 ledc_timer_config()
,并將包括如下配置參數的數據結構 ledc_timer_config_t
傳遞給該函數:
- 速度模式(值必須為
LEDC_LOW_SPEED_MODE
) - 定時器索引
ledc_timer_t
- PWM 信號頻率(Hz)
- PWM 占空比分辨率
- 時鐘源
ledc_clk_cfg_t
頻率和占空比分辨率相互關聯。PWM 頻率越高,占空比分辨率越低,反之亦然。如果 API 不是用來改變 LED 亮度,而是用于其它目的,這種相互關系可能會很重要。時鐘源同樣可以限制 PWM 頻率。選擇的時鐘源頻率越高,可以配置的 PWM 頻率上限就越高。
esp32c3 ledc時鐘源特性
備注
1.如果 ESP32-C3 的定時器選用了 RC_FAST_CLK 作為其時鐘源,驅動會通過內部校準來得知這個時鐘源的實際頻率。這樣確保了輸出 PWM 信號頻率的精準性。
- ESP32-C3 的所有定時器共用一個時鐘源。因此 ESP32-C3 不支持給不同的定時器配置不同的時鐘源。
當一個定時器不再被任何通道所需要時,可以通過調用相同的函數 ledc_timer_config()
來重置這個定時器。此時,函數入參的配置結構體需要指定:
ledc_timer_config_t::speed_mode
重置定時器的所屬速度模式 (ledc_mode_t
)ledc_timer_config_t::timer_num
重置定時器的索引 (ledc_timer_t
)ledc_timer_config_t::deconfigure
將指定定時器重置必須配置此項為true
通道配置
定時器設置好后,請配置所需的通道(ledc_channel_t
之一)。配置通道需調用函數 ledc_channel_config()
。
通道的配置與定時器設置類似,需向通道配置函數傳遞包括通道配置參數的結構體 ledc_channel_config_t
。
此時,通道會按照 ledc_channel_config_t
的配置開始運作,并在選定的 GPIO 上生成由定時器設置指定的頻率和占空比的 PWM 信號。在通道運作過程中,可以隨時通過調用函數 ledc_stop()
將其暫停。
改變 PWM 占空比
調用函數 ledc_set_duty()
可以設置新的占空比。之后,調用函數 ledc_update_duty()
使新配置生效。要查看當前設置的占空比,可使用 _get_
函數 ledc_get_duty()
。
另外一種設置占空比和其他通道參數的方式是調用 通道配置 一節提到的函數 ledc_channel_config()
。
傳遞給函數的占空比數值范圍取決于選定的 duty_resolution
,應為 0
至 (2 ** duty_resolution) - 1
。例如,如選定的占空比分辨率為 10
,則占空比的數值范圍為 0
至 1023
。此時分辨率為 ~0.1%。
常用配置頻率及精度
實例
/* LEDC (LED Controller) basic example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include < stdio.h >
#include "driver/ledc.h"
#include "esp_err.h"
#define LEDC_OUTPUT_IO (5) // Define the output GPIO
#define LEDC_DUTY (4095) // Set duty to 50%. ((2 ** 13) - 1) * 50% = 4095
#define LEDC_FREQUENCY (5000) // Frequency in Hertz. Set frequency at 5 kHz
static void example_ledc_init(void)
{
// Prepare and then apply the LEDC PWM timer configuration
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.duty_resolution = LEDC_TIMER_13_BIT,
.freq_hz = LEDC_FREQUENCY, // Set output frequency at 5 kHz
.clk_cfg = LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
// Prepare and then apply the LEDC PWM channel configuration
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE,
.gpio_num = LEDC_OUTPUT_IO,
.duty = 0, // Set duty to 0%
.hpoint = 0
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}
void app_main(void)
{
// Set the LEDC peripheral configuration
example_ledc_init();
// Set duty to 50%
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY));
// Update duty to apply the new value
ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}
編譯后運行,捕捉如下波形:
5kHz 50%占空比
修改下占空比:
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY-400));
編譯后運行,捕捉如下波形:
5kHz 45.1%占空比
-
led
+關注
關注
242文章
23295瀏覽量
661251 -
控制器
+關注
關注
112文章
16382瀏覽量
178303 -
陀螺儀
+關注
關注
44文章
785瀏覽量
98742 -
PWM
+關注
關注
114文章
5190瀏覽量
214109 -
定時器
+關注
關注
23文章
3250瀏覽量
114910
發布評論請先 登錄
相關推薦
評論