如何计算esp32c3的ledc的pwm的频率

Moderator: ESP_ZT

hzlijianjun
Posts: 5
Joined: Fri Jan 06, 2023 1:34 am

如何计算esp32c3的ledc的pwm的频率

Postby hzlijianjun » Tue Jan 10, 2023 2:31 am

我想利用esp32c3的ledc获得频率小于等于1的pwm,但目前测试pwm的最小频率只能设置到2,相关代码如下:
  1. ...
  2. ledc_timer_config_t ledc_timer = {
  3.     .duty_resolution = LEDC_TIMER_14_BITS,
  4.     .freq_hz             = 2,
  5.     .speed_mode      = LEDC_LOW_SPEED_MODE,
  6.     .timer_num        = LEDC_TIMER_0,
  7.     .clk_cfg             = LEDC_USE_RTC8M_CLK
  8. }
请问,有没有可能获取频率小于等于1的pwm?如上代码freq_hz可以设置为2背后的逻辑是怎样的?
谢谢!

ESP_@In逍遥子
Posts: 132
Joined: Thu Nov 15, 2018 2:06 am

Re: 如何计算esp32c3的ledc的pwm的频率

Postby ESP_@In逍遥子 » Tue Jan 10, 2023 3:00 am

The LED PWM Controller is designed primarily to drive LEDs.

可以提供下你使用时的错误信息吗?你是希望完成什么应用,需要使用这么低的频率呢

hzlijianjun
Posts: 5
Joined: Fri Jan 06, 2023 1:34 am

Re: 如何计算esp32c3的ledc的pwm的频率

Postby hzlijianjun » Tue Jan 10, 2023 3:46 am

ESP_@In逍遥子 wrote:
Tue Jan 10, 2023 3:00 am
The LED PWM Controller is designed primarily to drive LEDs.

可以提供下你使用时的错误信息吗?你是希望完成什么应用,需要使用这么低的频率呢
错误信息如下:
E(271) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=287612

我是在实验时钟源相关的知识,通过一些边界值设定,更容易理解相关知识。
我尝试改用时钟源: Internal 8MHZ oscillator, divided by 256, 测试结果没变化。

谢谢!

ESP_@In逍遥子
Posts: 132
Joined: Thu Nov 15, 2018 2:06 am

Re: 如何计算esp32c3的ledc的pwm的频率

Postby ESP_@In逍遥子 » Thu Jan 12, 2023 7:59 am

你设置的这个 频率,通常不会使用 LEDC 来实现了,1s 一个周期,可以使用 GPIO 定时变化了。

这个频率,当前不允许设置。

ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: 如何计算esp32c3的ledc的pwm的频率

Postby ESP_ZB2 » Thu Jan 12, 2023 12:50 pm

如果想做深入理解,可以去看我们的硬件参考。
我们的LEDC_PWM时钟配置接口留出了:时钟源的选择、输出频率和计数范围。对时钟的分频我们有一个18bit的分频器,因为频率和时钟存在不整除的情况,为了提高PWM精度,我们将18bit分为A与B部分,A部分负责整数分频,B部分负责小数分频,其中A部分占10bit,B部分占8bit。所以分频系数=A+B/256
我们的输出频率计算公式是:f(输出频率)=f(时钟源频率)/(2^(计数范围)*分频系数),可以将这个公式转换得到:分频系数=f(时钟源频率)/(2^(计数范围*f(输出频率))。
但是我们的LEDC_USE_RTC8M_CLK时钟要根据实际获取的CLK,并不是真的8M,在实际读取中,这个时钟可能会达到18M,所以在计算的时候要根据实时时钟去计算。比如我读了几次都是18193408左右。
如果我们的输出频率设置为2HZ、时钟源选择RTC_8MHZ(带入实际值18M)、计数范围14bit。就可以计算得到分频系数=555.21875。那么整数部分是:555小于1023。小数部分0.21875*256=56。
如果我们的输出频率设置为1HZ、时钟源选择RTC_8MHZ(带入实际值18M)、计数范围14bit。就可以计算得到分频系数=1110.4375。整数部分超过了1023,所以不会配置成功。

ESP_ZB2
Posts: 21
Joined: Wed Dec 28, 2022 12:33 pm

Re: 如何计算esp32c3的ledc的pwm的频率

Postby ESP_ZB2 » Thu Jan 12, 2023 12:56 pm

你也可以选择外部时钟LEDC_USE_XTAL_CLK,加一个32K的低速晶振。然后就可以达到1HZ的输出。
你也可以选择支持LEDC_USE_REF_TICK时钟的芯片。他的实际频率在1M左右,就可以配置到1HZ的输出。

hzlijianjun
Posts: 5
Joined: Fri Jan 06, 2023 1:34 am

Re: 如何计算esp32c3的ledc的pwm的频率

Postby hzlijianjun » Mon Jan 16, 2023 2:19 pm

ESP_ZB2 wrote:
Thu Jan 12, 2023 12:50 pm
如果想做深入理解,可以去看我们的硬件参考。
我们的LEDC_PWM时钟配置接口留出了:时钟源的选择、输出频率和计数范围。对时钟的分频我们有一个18bit的分频器,因为频率和时钟存在不整除的情况,为了提高PWM精度,我们将18bit分为A与B部分,A部分负责整数分频,B部分负责小数分频,其中A部分占10bit,B部分占8bit。所以分频系数=A+B/256
我们的输出频率计算公式是:f(输出频率)=f(时钟源频率)/(2^(计数范围)*分频系数),可以将这个公式转换得到:分频系数=f(时钟源频率)/(2^(计数范围*f(输出频率))。
但是我们的LEDC_USE_RTC8M_CLK时钟要根据实际获取的CLK,并不是真的8M,在实际读取中,这个时钟可能会达到18M,所以在计算的时候要根据实时时钟去计算。比如我读了几次都是18193408左右。
如果我们的输出频率设置为2HZ、时钟源选择RTC_8MHZ(带入实际值18M)、计数范围14bit。就可以计算得到分频系数=555.21875。那么整数部分是:555小于1023。小数部分0.21875*256=56。
如果我们的输出频率设置为1HZ、时钟源选择RTC_8MHZ(带入实际值18M)、计数范围14bit。就可以计算得到分频系数=1110.4375。整数部分超过了1023,所以不会配置成功。
非常感谢你的详细解说,了解了上述要点后,也容易理解ledc.c代码了。
谢谢!

Who is online

Users browsing this forum: No registered users and 19 guests