buzzer.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <math.h>
  2. #include <stdint.h>
  3. #include "driver/ledc.h"
  4. #include "esp_clk_tree.h"
  5. #include "esp_err.h"
  6. #include "esp_log.h"
  7. #include "freertos/FreeRTOS.h" // IWYU pragma: keep
  8. #include "freertos/task.h"
  9. #include "hal/ledc_types.h"
  10. #include "soc/clk_tree_defs.h"
  11. #include "buzzer.h"
  12. static const char* TAG = "BUZZER_C";
  13. const uint32_t init_buzzer_freq = 2731;
  14. void buzzer_init(const uint32_t frequency) {
  15. uint32_t clk_freq = 0;
  16. ESP_ERROR_CHECK(esp_clk_tree_src_get_freq_hz(
  17. SOC_MOD_CLK_RC_FAST, ESP_CLK_TREE_SRC_FREQ_PRECISION_EXACT, &clk_freq));
  18. uint32_t duty_resolution =
  19. ledc_find_suitable_duty_resolution(clk_freq, frequency);
  20. if (duty_resolution == 0) {
  21. ESP_LOGE(TAG, "Could not determine optimal duty resolution.\n");
  22. return;
  23. }
  24. ledc_timer_config_t ledc_config = {.speed_mode = LEDC_LOW_SPEED_MODE,
  25. .timer_num = LEDC_TIMER_0,
  26. .freq_hz = frequency,
  27. .duty_resolution = duty_resolution,
  28. .clk_cfg = LEDC_USE_RC_FAST_CLK};
  29. ESP_ERROR_CHECK(ledc_timer_config(&ledc_config));
  30. ledc_channel_config_t ledc_ch_config = {
  31. .gpio_num = 9,
  32. .speed_mode = LEDC_LOW_SPEED_MODE,
  33. .channel = LEDC_CHANNEL_0,
  34. .timer_sel = LEDC_TIMER_0,
  35. .duty = (uint32_t)(pow(2, duty_resolution) / 2),
  36. // .hpoint = ((uint32_t) pow(2, duty_resolution)) - 1,
  37. .hpoint = 0,
  38. .sleep_mode = LEDC_SLEEP_MODE_KEEP_ALIVE,
  39. .flags.output_invert = false};
  40. ESP_ERROR_CHECK(ledc_channel_config(&ledc_ch_config));
  41. }
  42. uint32_t modify_frequency(int amount) {
  43. uint32_t freq = ledc_get_freq(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0) + amount;
  44. if (freq < 10) {
  45. freq = 10;
  46. }
  47. buzzer_pause();
  48. ESP_ERROR_CHECK(ledc_set_freq(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0, freq));
  49. buzzer_resume();
  50. return freq;
  51. }
  52. uint32_t reset_frequency() {
  53. ESP_ERROR_CHECK(
  54. ledc_set_freq(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0, init_buzzer_freq));
  55. return init_buzzer_freq;
  56. }
  57. void set_frequency(const uint32_t freq) {
  58. ESP_ERROR_CHECK(ledc_set_freq(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0, freq));
  59. }
  60. void buzzer_pause() {
  61. ESP_ERROR_CHECK(ledc_timer_pause(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0));
  62. }
  63. void buzzer_reset() {
  64. ESP_ERROR_CHECK(ledc_timer_rst(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0));
  65. }
  66. void buzzer_resume() {
  67. ESP_ERROR_CHECK(ledc_timer_resume(LEDC_LOW_SPEED_MODE, LEDC_TIMER_0));
  68. }