目前對(duì)于遙控雙發(fā)差速小飛機(jī)計(jì)劃采用如下架構(gòu):
遙控小飛機(jī)框圖
- ESP32C3 做主控,兼具遙控收發(fā)和飛行控制
- 鋰電池供電,帶電量檢測(cè)
- 雙發(fā),720 空心杯電機(jī),55mm 槳,帶電流檢測(cè)
- MPU6050 加速度計(jì)和陀螺儀
- 預(yù)留 4 個(gè)控制信號(hào)輸出
馬達(dá)控制要用到 pwm,今天把 esp32c3 的 pwm 跑一下。
簡(jiǎn)介
esp32c3 中把 pwm 外設(shè)稱(chēng)為“LED PWM 控制器”,共有 6 個(gè)通道,可分配到任意 GPIO 管腳:
- 四個(gè)獨(dú)立定時(shí)器,可實(shí)現(xiàn)小數(shù)分頻
- 波形的周期和占空比可配置,占空比精確度可達(dá) 14 位
- PWM 輸出信號(hào)相位可調(diào)節(jié)
- 可在 Light-sleep 模式下工作
- 多種時(shí)鐘源選擇,包括 APB 總線時(shí)鐘、外置主晶振時(shí)鐘
- 支持硬件自動(dòng)步進(jìn)式地增加或減少占空比,可用于 LED RGB 彩色梯度發(fā)生器
占空比自動(dòng)漸變是一個(gè)特色功能,用于呼吸燈或其它 LED 燈效會(huì)很方便,在官方文檔特意介紹說(shuō)是 LED PWM 控制器。
使用方法
LED PWM控制器架構(gòu)
4 個(gè)定時(shí)器可獨(dú)立配置(可配置時(shí)鐘分頻器和計(jì)數(shù)器最大值),每個(gè)定時(shí)器內(nèi)部有一個(gè)時(shí)基計(jì)數(shù)器(即基于基準(zhǔn)時(shí)鐘周期計(jì)數(shù)的計(jì)數(shù)器)。每個(gè) PWM 生成器在四個(gè)定時(shí)器中擇一,以該定時(shí)器的計(jì)數(shù)值為基準(zhǔn)生成 PWM 信號(hào)。
下圖為定時(shí)器和 PWM 生成器的主要功能塊。
定時(shí)器和PWM生成器功能塊
LED PWM 控制器的每個(gè)定時(shí)器內(nèi)部都有一個(gè)時(shí)基計(jì)數(shù)器。上圖中時(shí)基計(jì)數(shù)器使用的時(shí)鐘信號(hào)稱(chēng)為ref_pulsex
。所有定時(shí)器使用同一個(gè)時(shí)鐘源信號(hào)LEDC_CLKx
,該時(shí)鐘源信號(hào)經(jīng)分頻器分頻后產(chǎn)生ref_pulsex
供計(jì)數(shù)器使用。
設(shè)置 LEDC 通道分三步完成。注意,與 ESP32 不同,ESP32-C3 僅支持設(shè)置通道為低速模式。
- 定時(shí)器配置,指定 PWM 信號(hào)的頻率和占空比分辨率。
- 通道配置,綁定定時(shí)器和輸出 PWM 信號(hào)的 GPIO。
- 改變 PWM 信號(hào),輸出 PWM 信號(hào)來(lái)驅(qū)動(dòng) LED??赏ㄟ^(guò)軟件控制或使用硬件漸變功能來(lái)改變 LED 的亮度。
另一個(gè)可選步驟是可以在漸變終端設(shè)置一個(gè)中斷。
LED PWM 控制器 API 的關(guān)鍵配置
首次 LEDC 配置時(shí),最好先配置定時(shí)器(調(diào)用函數(shù) ledc_timer_config()
),再配置通道(調(diào)用函數(shù) ledc_channel_config()
)。這樣可以確保 IO 腳上的 PWM 信號(hào)自有輸出開(kāi)始其頻率就是正確的。
定時(shí)器配置
要設(shè)置定時(shí)器,可調(diào)用函數(shù) ledc_timer_config()
,并將包括如下配置參數(shù)的數(shù)據(jù)結(jié)構(gòu) ledc_timer_config_t
傳遞給該函數(shù):
- 速度模式(值必須為
LEDC_LOW_SPEED_MODE
) - 定時(shí)器索引
ledc_timer_t
- PWM 信號(hào)頻率(Hz)
- PWM 占空比分辨率
- 時(shí)鐘源
ledc_clk_cfg_t
頻率和占空比分辨率相互關(guān)聯(lián)。PWM 頻率越高,占空比分辨率越低,反之亦然。如果 API 不是用來(lái)改變 LED 亮度,而是用于其它目的,這種相互關(guān)系可能會(huì)很重要。時(shí)鐘源同樣可以限制 PWM 頻率。選擇的時(shí)鐘源頻率越高,可以配置的 PWM 頻率上限就越高。
esp32c3 ledc時(shí)鐘源特性
備注
1.如果 ESP32-C3 的定時(shí)器選用了 RC_FAST_CLK 作為其時(shí)鐘源,驅(qū)動(dòng)會(huì)通過(guò)內(nèi)部校準(zhǔn)來(lái)得知這個(gè)時(shí)鐘源的實(shí)際頻率。這樣確保了輸出 PWM 信號(hào)頻率的精準(zhǔn)性。
- ESP32-C3 的所有定時(shí)器共用一個(gè)時(shí)鐘源。因此 ESP32-C3 不支持給不同的定時(shí)器配置不同的時(shí)鐘源。
當(dāng)一個(gè)定時(shí)器不再被任何通道所需要時(shí),可以通過(guò)調(diào)用相同的函數(shù) ledc_timer_config()
來(lái)重置這個(gè)定時(shí)器。此時(shí),函數(shù)入?yún)⒌呐渲媒Y(jié)構(gòu)體需要指定:
ledc_timer_config_t::speed_mode
重置定時(shí)器的所屬速度模式 (ledc_mode_t
)ledc_timer_config_t::timer_num
重置定時(shí)器的索引 (ledc_timer_t
)ledc_timer_config_t::deconfigure
將指定定時(shí)器重置必須配置此項(xiàng)為true
通道配置
定時(shí)器設(shè)置好后,請(qǐng)配置所需的通道(ledc_channel_t
之一)。配置通道需調(diào)用函數(shù) ledc_channel_config()
。
通道的配置與定時(shí)器設(shè)置類(lèi)似,需向通道配置函數(shù)傳遞包括通道配置參數(shù)的結(jié)構(gòu)體 ledc_channel_config_t
。
此時(shí),通道會(huì)按照 ledc_channel_config_t
的配置開(kāi)始運(yùn)作,并在選定的 GPIO 上生成由定時(shí)器設(shè)置指定的頻率和占空比的 PWM 信號(hào)。在通道運(yùn)作過(guò)程中,可以隨時(shí)通過(guò)調(diào)用函數(shù) ledc_stop()
將其暫停。
改變 PWM 占空比
調(diào)用函數(shù) ledc_set_duty()
可以設(shè)置新的占空比。之后,調(diào)用函數(shù) ledc_update_duty()
使新配置生效。要查看當(dāng)前設(shè)置的占空比,可使用 _get_
函數(shù) ledc_get_duty()
。
另外一種設(shè)置占空比和其他通道參數(shù)的方式是調(diào)用 通道配置 一節(jié)提到的函數(shù) ledc_channel_config()
。
傳遞給函數(shù)的占空比數(shù)值范圍取決于選定的 duty_resolution
,應(yīng)為 0
至 (2 ** duty_resolution) - 1
。例如,如選定的占空比分辨率為 10
,則占空比的數(shù)值范圍為 0
至 1023
。此時(shí)分辨率為 ~0.1%。
常用配置頻率及精度
實(shí)例
/* 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));
}
編譯后運(yùn)行,捕捉如下波形:
5kHz 50%占空比
修改下占空比:
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY-400));
編譯后運(yùn)行,捕捉如下波形:
5kHz 45.1%占空比
-
led
+關(guān)注
關(guān)注
242文章
23798瀏覽量
672854 -
控制器
+關(guān)注
關(guān)注
114文章
17066瀏覽量
183735 -
陀螺儀
+關(guān)注
關(guān)注
44文章
839瀏覽量
99874 -
PWM
+關(guān)注
關(guān)注
116文章
5474瀏覽量
218904 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
117692
發(fā)布評(píng)論請(qǐng)先 登錄
利用ESP32 PWM信號(hào)控制LED的亮度

基于XIAO ESP32C3的智能家居四路控制器設(shè)計(jì)

基于ESP32C3的智能小車(chē)設(shè)計(jì)

esp32c3項(xiàng)目采用wss_server例程,把wifi斷開(kāi)的話esp32c3會(huì)重啟,為什么?
esp32c3是否能在40mhz運(yùn)行,功耗是多少?
【DFRobot Beetle ESP32-C3開(kāi)發(fā)板試用體驗(yàn)】WEBSOKET—PWM—LED
esp32c3連接wifi和tcp服務(wù)器速度能否加快,esp8266 速度在5-7s左右,esp32c3能否加快?
esp32c3不能操縱RTC引腳而只能保持它們或被喚醒嗎?
esp32c3不能操縱RTC引腳而只能保持它們或被喚醒嗎?
深入剖析esp32c3的系統(tǒng)底層啟動(dòng)

在Arduino IDE環(huán)境下用ESP32控制多路LED調(diào)光
【DFRobot Beetle ESP32-C3開(kāi)發(fā)板試用體驗(yàn)】WEBSOKET—PWM—LED

ESP32 PWM驅(qū)動(dòng)電機(jī)

如何使用ESP32的LEDC進(jìn)行PWM控制?

評(píng)論