3 #include "pico/stdlib.h"
5 #include "hardware/gpio.h"
6 #include "hardware/adc.h"
7 #include "hardware/pwm.h"
8 #include "hardware/clocks.h"
9 #include "PicoPinFunction.h"
19 #define PWM_MAX_NUMER 65535
26 Logger.debug(
"PicoPWMNano");
27 period_nano_sec = periodNanoSeconds;
29 rangeDivider = (1.0 * period_nano_sec) / PWM_MAX_NUMER;
33 void begin(pin_size_t pin, uint64_t initialDutyCyleNanoSeconds=0){
34 Logger.debug(
"PicoPWMNano::begin");
36 Logger.debug(
"gpio_set_function");
37 gpio_set_function(pin, GPIO_FUNC_PWM);
39 uint8_t slice_num = pwm_gpio_to_slice_num(pin);
41 Logger.debug(
"pwm_init");
42 pwm_init(slice_num, &config,
true);
43 setDutyCycle(pin, initialDutyCyleNanoSeconds);
48 void end(pin_size_t pin){
49 Logger.debug(
"PicoPWMNano::end");
51 PinFunction.clear(pin);
55 void setDutyCycle(pin_size_t pin, uint64_t dutyCyleNanoSeconds){
56 uint slice_num = pwm_gpio_to_slice_num(pin);
57 uint channel = pwm_gpio_to_channel(pin);
58 uint16_t value = (1.0 * dutyCyleNanoSeconds) / rangeDivider;
60 if (Logger.isLogging(PicoLogger::Debug)){
62 sprintf(str,
"%lu", dutyCyleNanoSeconds);
63 Logger.debug(
"PWM duty cycle ns:",str);
64 sprintf(str,
"%lu", value);
65 Logger.debug(
"PWM duty cycle(internal):",str);
67 pwm_set_chan_level(slice_num, channel, value);
71 uint64_t frequency(uint64_t periodNanoSeconds){
72 return 1000000000l / period_nano_sec;
77 return frequency(period_nano_sec);
82 return period_nano_sec;
87 uint64_t period_nano_sec;
91 bool is_config_done =
false;
95 if (!is_config_done) {
96 Logger.debug(
"PicoPWMNano::setupConfig");
97 is_config_done =
true;
98 config = pwm_get_default_config();
100 uint32_t freq = clock_get_hz(clk_sys);
101 float dividerClock = (1.0 * freq) / frequency();
103 float divider = dividerClock / PWM_MAX_NUMER;
105 uint16_t wrap = PWM_MAX_NUMER ;
107 if (Logger.isLogging(PicoLogger::Debug)){
109 sprintf(str,
"%ul", period_nano_sec);
110 Logger.debug(
"Period ns:", str);
111 sprintf(str,
"%f", rangeDivider);
112 Logger.debug(
"Range divider:", str);
113 sprintf(str,
"%d", frequency());
114 Logger.debug(
"PWM hz:", str);
115 sprintf(str,
"%d", freq);
116 Logger.debug(
"Systemclock hz:", str);
117 sprintf(str,
"%f", divider);
118 Logger.debug(
"PWM divider:", str);
119 sprintf(str,
"%d", wrap);
120 Logger.debug(
"PWM wrap:", str);
124 pwm_config_set_clkdiv(&config, divider);
125 pwm_config_set_wrap(&config, wrap);
141 PicoPWM(uint64_t frequency, uint64_t maxValue){
143 period_nano_sec = 1000000000l / frequency;
145 max_value = maxValue;
152 void begin(pin_size_t pin, uint64_t initalValue=0){
153 nano->begin(pin, initalValue);
157 void end(pin_size_t pin){
162 void write(pin_size_t pin, uint64_t value){
163 nano->setDutyCycle(pin, valueToDutyCycle(value));
168 return nano->period();
172 uint64_t frequency(){
173 return nano->frequency();
179 uint64_t period_nano_sec;
181 uint64_t valueToDutyCycle(uint64_t value){
182 return map(value, 0, max_value, 0, period_nano_sec);
This is an even more powerfull PWM API where we can specify a user defined input range and the cycle ...
Definition: PicoPWM.h:139
Definition: PicoPinFunction.h:30