Advertisement
Shurik_X

PID 32 cooling 2

May 14th, 2024 (edited)
626
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.15 KB | None | 0 0
  1. Для интеграции ШИМ (широтно-импульсной модуляции) с разрешением 4095 и ограничения максимального интегрального значения (i_max) в ваш PID регулятор, вы можете использовать следующий код:
  2. Этот код включает настройку ШИМ с использованием ESP-IDF SDK и функцию ограничения максимального значения интегральной составляющей. Пожалуйста, убедитесь, что вы настроили GPIO и другие параметры в соответствии с вашей аппаратной конфигурацией. Удачи в реализации вашего проекта!
  3. Да, предоставленный код предназначен для системы охлаждения на базе ESP32. Он использует PID регулятор для контроля температуры, поддерживая её на заданном уровне. ШИМ с разрешением 4095 используется для управления мощностью охлаждающего устройства, а параметр i_max ограничивает максимальное значение интегральной составляющей, чтобы предотвратить перерегулирование.
  4.  
  5. #include <stdio.h>
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "driver/ledc.h"
  9. #include "esp_err.h"
  10.  
  11. // Параметры PID регулятора
  12. float Kp = 1.0f; // Пропорциональный коэффициент
  13. float Ki = 0.1f; // Интегральный коэффициент
  14. float Kd = 0.05f; // Дифференциальный коэффициент
  15. float i_max = 100.0f; // Максимальное значение интегральной составляющей
  16.  
  17. // Переменные для хранения значений
  18. float setpoint = 25.0f; // Желаемая температура
  19. float current_temperature; // Текущая температура
  20. float integral = 0.0f; // Интегральная сумма
  21. float previous_error = 0.0f; // Предыдущая ошибка
  22.  
  23. // Настройки ШИМ
  24. #define LEDC_HS_TIMER          LEDC_TIMER_0
  25. #define LEDC_HS_MODE           LEDC_HIGH_SPEED_MODE
  26. #define LEDC_HS_CH0_GPIO       (18) // GPIO номер для ШИМ сигнала
  27. #define LEDC_HS_CH0_CHANNEL    LEDC_CHANNEL_0
  28. #define LEDC_TEST_DUTY         (4095) // Максимальное значение ШИМ
  29. #define LEDC_TEST_FADE_TIME    (3000)
  30.  
  31. // Функция для чтения текущей температуры
  32. float read_temperature() {
  33.     // Здесь должен быть код для получения температуры от датчика
  34.     return 0.0f; // Временное значение
  35. }
  36.  
  37. // Функция для управления охлаждением с использованием ШИМ
  38. void control_cooling(float output) {
  39.     // Преобразование выходного сигнала PID в значение ШИМ
  40.     uint32_t duty = (uint32_t)((output / 100.0f) * LEDC_TEST_DUTY);
  41.     // Ограничение значения ШИМ
  42.     if (duty > LEDC_TEST_DUTY) {
  43.         duty = LEDC_TEST_DUTY;
  44.     }
  45.     // Установка значения ШИМ
  46.     ledc_set_duty(LEDC_HS_MODE, LEDC_HS_CH0_CHANNEL, duty);
  47.     ledc_update_duty(LEDC_HS_MODE, LEDC_HS_CH0_CHANNEL);
  48. }
  49.  
  50. void pid_task(void *pvParameters) {
  51.     while(1) {
  52.         current_temperature = read_temperature();
  53.         float error = setpoint - current_temperature;
  54.         integral += error * 0.1f; // Интегрирование с учетом времени (dt)
  55.         // Ограничение интегральной составляющей
  56.         if (integral > i_max) {
  57.             integral = i_max;
  58.         } else if (integral < -i_max) {
  59.             integral = -i_max;
  60.         }
  61.         float derivative = (error - previous_error) / 0.1f; // Дифференцирование
  62.         float output = Kp * error + Ki * integral + Kd * derivative;
  63.         control_cooling(output);
  64.         previous_error = error;
  65.         vTaskDelay(100 / portTICK_PERIOD_MS); // Задержка 100 мс
  66.     }
  67. }
  68.  
  69. void app_main() {
  70.     // Настройка ШИМ
  71.     ledc_timer_config_t ledc_timer = {
  72.         .duty_resolution = LEDC_TIMER_12_BIT, // Разрешение 4095
  73.         .freq_hz = 5000,                      // Частота ШИМ
  74.         .speed_mode = LEDC_HS_MODE,           // Режим высокой скорости
  75.         .timer_num = LEDC_HS_TIMER            // Таймер
  76.     };
  77.     ledc_timer_config(&ledc_timer);
  78.  
  79.     ledc_channel_config_t ledc_channel = {
  80.         .channel    = LEDC_HS_CH0_CHANNEL,
  81.         .duty       = 0,
  82.         .gpio_num   = LEDC_HS_CH0_GPIO,
  83.         .speed_mode = LEDC_HS_MODE,
  84.         .timer_sel  = LEDC_HS_TIMER
  85.     };
  86.     ledc_channel_config(&ledc_channel);
  87.  
  88.     xTaskCreate(&pid_task, "pid_task", 2048, NULL, 5, NULL);
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement