Page 1 of 1

[Solved] LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 6:49 pm
by BrettG
Hi, I am trying to supply a clock signal to a external device at a frequency of at least 10 MHz with the LEDC peripheral. After looking through a lot of the questions and answers on the forum it sounds quite possible, but when I gave it a shot the ESP32 seemed unable to provide a square wave at that high of a frequency. Here is a screen shot of my 10 MHz signal:
10MHZ PWM.PNG
10MHZ PWM.PNG (137.99 KiB) Viewed 14943 times
Here is the setup code I used for the LEDC module with defined values given in comments:

Code: Select all

esp_err_t image_init_clock(void) {
	ledc_timer_bit_t bit_num = (ledc_timer_bit_t) XVCLK_BIT_ACCURACY;		// 3

	// Enable LEDC PWM peripheral
	periph_module_enable(PERIPH_LEDC_MODULE);

	// Set Duty
	int duty = pow(2, (int) bit_num) / 2;

	// setup the timer
	ledc_timer_config_t xvclk_timer;
	xvclk_timer.bit_num = bit_num;						// 3
	xvclk_timer.freq_hz = XVCLK_FREQ;					// 10000000
	xvclk_timer.speed_mode = LEDC_HIGH_SPEED_MODE;
	xvclk_timer.timer_num = LEDC_TIMER_0;
	ledc_timer_config(&xvclk_timer);

	// setup the pwm channel
	ledc_channel_config_t servo_channel;
	servo_channel.channel = LEDC_CHANNEL_0;
	servo_channel.duty = duty;
	servo_channel.gpio_num = IMG_XVCLK;					// GPIO_NUM_4
	servo_channel.intr_type = LEDC_INTR_DISABLE;
	servo_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
	servo_channel.timer_sel = LEDC_TIMER_0;
	ledc_channel_config(&servo_channel);

	// Set the PWM to the duty specified
	ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, duty);
	ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
	
	return ESP_OK;
}
Is there anything wrong in my LEDC config? Is LEDC the correct tool to generate this clock signal, or is there a better option?

Thanks,
- Brett

Re: LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 6:55 pm
by Hans Dorn
What kind of load was connected to the pin when you took the measurement?

Looks like the output pin is struggling to charge and discharge a capacitive load.

Re: LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 7:18 pm
by BrettG
When I took that screen shot the only thing that was connected to the pin was a voltage divider (two 1K resistors to step the signal down to ~ 1.8V). Just to check I removed the voltage divider so nothing is on the pin and it still produced the same waveform.

Re: LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 7:37 pm
by BrettG
I took it a step further, the previous tests were on a new PCB design, so I decided to take that out of the equation and use my ESP_WROOM_32 DevKit. Same result, exact same waveform. Either my setup/config is incorrect, or the device is not capable of this high of a frequency.

Re: LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 7:42 pm
by Hans Dorn
Well, assuming the ESP32 pin will drive @10mA, I'm getting at something in the neighborhood of 150pF to match your waveform.

Are you using a 10:1 probe?


I might be able to borrow a scope over the weekend and have a look at some output waveforms myself...

Re: LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 8:39 pm
by BrettG
I think I got it. Since you mentioned the 10x option I looked into the probes specs and found:
1x DC-6MHz
10x DC-100MHz

I had it on 1x which was out of spec for the probe.

The new signal with the correct probe settings looks much better:
10MHZ PWM 10x.PNG
10MHZ PWM 10x.PNG (161.34 KiB) Viewed 14926 times
It is still a bit ugly, but a lot of that can be attributed to the sampling rate. The analog discovery is a useful tool but it is no replacement for a real lab oscilloscope.

Anyways this should be more than good enough for my uses.

Thanks a lot for the help.
- Brett

Re: LEDC Highspeed PWM

Posted: Thu Mar 23, 2017 9:17 pm
by Hans Dorn
You're welcome :)

I've been bitten by that one too. An 1x probe is too much of a capacitive load for fast signals.


Cheers

Re: [Solved] LEDC Highspeed PWM

Posted: Fri Jun 21, 2024 5:32 pm
by srjasz
This will not work on S3 version of esp32. S3 only supports low speed mode. The fastest I have been able to get using low speed mode is 9khz.

Re: [Solved] LEDC Highspeed PWM

Posted: Sun Jun 23, 2024 2:30 am
by ESP_Sprite
srjasz wrote:
Fri Jun 21, 2024 5:32 pm
This will not work on S3 version of esp32. S3 only supports low speed mode. The fastest I have been able to get using low speed mode is 9khz.
The S3 doesn't have the distinction between low and high speed anymore; that distinction in general was about having hardware to latch the settings when the PWM ended anyway, it didn't have anything to do with the max speed you can get out of a channel. If you're only getting 9KHz, you're probably doing something wrong.