raspikeyer/src/sidetone.cpp
2024-02-16 20:56:03 +01:00

26 lines
820 B
C++

#include "hardware/pwm.h"
#include "pico/stdlib.h"
#include "sidetone.h"
Sidetone::Sidetone(uint gpio) : m_gpio(gpio)
{
gpio_set_function(gpio, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(gpio);
pwm_config config = pwm_get_default_config();
pwm_init(slice_num, &config, true);
}
void Sidetone::on(uint freq)
{
// Calculate and cofigure new clock divider according to the frequency
// This formula is assuming we are running at 125MHz.
// TODO: Make this work for any frequency
float clkdiv = (1.f / freq) * 2000.f;
uint slice_num = pwm_gpio_to_slice_num(m_gpio);
pwm_set_clkdiv(slice_num, clkdiv);
// Configure duty to 50% ((2**16)-1)/2) to generate a square wave
pwm_set_gpio_level(m_gpio, 32768U);
}
void Sidetone::off() { pwm_set_gpio_level(m_gpio, 0); }