I want to output 100kHz PWM to a pin on my arduino. Wondering if anyone has code that can do this or can point out any error in the codes I tried.
Here is my naive approach:
#define TOGGLE(x) digitalWrite(x, digitalRead(x) ? LOW : HIGH)
float DUTY_CYCLE = 0.5; // 0.0 - 1.0
float FREQUENCY = 100000; // unit: hz
byte PIN = 2;
void setup() {
pinMode(PIN, OUTPUT);
}
void loop() {
TOGGLE(PIN);
delay(1.0/FREQUENCY * DUTY_CYCLE * 1000);
TOGGLE(PIN);
delay(1.0/FREQUENCY * (1-DUTY_CYCLE) * 1000);
}
When measured on oscilloscope, this reads at about 32.5kHz when I expect it to be 100kHz.
Next, I tried an Arduino library "RP2040_PWM", this code is taken from the examples folder on the library github page:
/****************************************************************************************************************************
basic_pwm.ino
For RP2040 boards
Written by Dr. Benjamin Bird
A basic example to get you up and running.
Library by Khoi Hoang https://github.com/khoih-prog/RP2040_PWM
Licensed under MIT license
The RP2040 PWM block has 8 identical slices. Each slice can drive two PWM output signals, or measure the frequency
or duty cycle of an input signal. This gives a total of up to 16 controllable PWM outputs. All 30 GPIO pins can be driven
by the PWM block
*****************************************************************************************************************************/
#define _PWM_LOGLEVEL_ 3
#include "RP2040_PWM.h"
//creates pwm instance
RP2040_PWM* PWM_Instance;
float frequency;
float dutyCycle;
#define pinToUse 25
void setup()
{
//assigns pin 25 (built in LED), with frequency of 20 KHz and a duty cycle of 0%
PWM_Instance = new RP2040_PWM(pinToUse, 20000, 0);
}
void loop()
{
delay(1000);
frequency = 20000;
dutyCycle = 90;
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
delay(1000);
dutyCycle = 10;
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
}
This code results in the following errors:
In file included from C:\Users\rozno\Documents\Arduino\realpwm\realpwm.ino:17:0:
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h: In member function 'bool RP2040_PWM::setPWM_manual(const uint8_t&, const uint16_t&, const uint8_t&, uint16_t&, bool)':
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h:340:26: error: invalid conversion from 'pwm_config*' to 'uint {aka unsigned int}' [-fpermissive]
pwm_init(_slice_num, &config, true);
^~~~~~~
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h:340:39: error: cannot convert 'bool' to 'pwm_config*' for argument '3' to 'void pwm_init(uint, uint, pwm_config*, bool)'
pwm_init(_slice_num, &config, true);
^
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h: In member function 'bool RP2040_PWM::setPWMPushPull_Int(const uint8_t&, const uint8_t&, const float&, const uint32_t&)':
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h:478:32: error: invalid conversion from 'pwm_config*' to 'uint {aka unsigned int}' [-fpermissive]
pwm_init(_slice_num, &config, true);
^~~~~~~
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h:478:45: error: cannot convert 'bool' to 'pwm_config*' for argument '3' to 'void pwm_init(uint, uint, pwm_config*, bool)'
pwm_init(_slice_num, &config, true);
^
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h: In member function 'bool RP2040_PWM::setPWM_Int(const uint8_t&, const float&, const uint32_t&, bool)':
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h:617:32: error: invalid conversion from 'pwm_config*' to 'uint {aka unsigned int}' [-fpermissive]
pwm_init(_slice_num, &config, true);
^~~~~~~
C:\Users\rozno\Documents\Arduino\libraries\RP2040_PWM\src/RP2040_PWM.h:617:45: error: cannot convert 'bool' to 'pwm_config*' for argument '3' to 'void pwm_init(uint, uint, pwm_config*, bool)'
pwm_init(_slice_num, &config, true);
^
exit status 1
Compilation error: exit status 1
Any help is appreciated. Let me know if I should upload any more info to help with a solution.