I am quite enthusiastic about the new Raspberry Pico. However I find the C SDK not very friendly and I prefer to have something as simple as the Arduino API. I did not want to wait for the official Arduino support – so I started my own project.
PWM in the Pico
- clock frequencies and frequency dividers
- counters and wraps
- channels and slices
Finally I think I have got it now. I decided to provide a nice high level API for PWM which can support any type of application because you can define the frequency yourself.
Pico PWM reading logic
It took me quite a while to grok the reading logic. I have implemented it in the following way:
- The API provides the
pwm_get_counter()method which can count the number of high cycles. The counting high logic can be defined by calling the
- With the help of the interrupt we can determine the counter overflow
- With the above we can measure the total high cycles during a predefined measuring time period
- I am repeating the measurement n times in order to calculate the average
- With the help of the
clock_get_hz(clk_sys)method we can calculate the total cycles during the measuring time period. I am not using any clock divider, so the system is counting at the highest resolution.
- Finally we can just calculate the duty cycle (rate) by dividing: counted high cycles / total cycles!
If you want to study my source code: this functionality is provided by the PicoPWMReader class.
PWM in the Arduino
My simple API is then just used to provide the implementation for the standard Arduino, so that you can just call
The Arduino PWM frequency is usually around 490 Hz. This is good enough to drive some LED but not suited for Servos or Motors.
On top I also provide a Pico compatible Servo class which can be used to drive Servos.
Here are the links to the examples:
As a conclusion: I have pretty much the full Arduino functionality working now. The only outstanding topic is I2S and taking into consideration the lacking maturity of the standard Pico Framework support for I2S – I am not sure if I want to pick this up myself….