ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
3 апреля
1502776 Топик полностью
Бoмж (02.03.2025 20:10, просмотров: 307) ответил Nikolaev_Aleksey на А можно попросить сгенерировать код ПИД регулятора без использования float? Обычный ШИМ регулятор температуры комнаты. Ну или лампочки накаливания с датчиком освещенности.
Прости, про float запямятовал. Но Клод всё равно порадовал. А теперь нам ответит Грок-3. 

Я помогу разработать решение для ПИД-регулятора освещенности на ATMega16 без использования float. Используем целочисленную арифметику для оптимизации под микроконтроллер.
Вот пошаговое решение:
Аппаратная часть:
Лампа 300 Вт подключается через симистор (например, BT137) с опторазвязкой (MOC3021)
Фоторезистор в делителе напряжения с резистором 10 кОм на АЦП
Питание схемы: 5В для ATMega16
Логика работы:
Считываем значение с фоторезистора через АЦП (0-1023)
Задаём целевую освещённость (setpoint) в тех же единицах АЦП
Управляем лампой через ШИМ (PWM) на симисторе
Код ПИД-регулятора на C:


... include <avr/io.h>
... include <util/delay.h>

// Константы ПИД (настраиваются экспериментально)
... define Kp 10    // Пропорциональный коэффициент * 10
... define Ki 2     // Интегральный коэффициент * 10
... define Kd 5     // Дифференциальный коэффициент * 10
... define SCALE 10 // Масштаб для целочисленных вычислений

// Глобальные переменные
int16_t error_prev = 0;     // Предыдущая ошибка
int32_t integral = 0;       // Интегральная сумма
uint16_t setpoint = 512;    // Целевая освещённость (половина диапазона АЦП)

// Инициализация
void init(void) {
    // Настройка АЦП
    ADMUX = (1<<REFS0);     // Опорное напряжение AVcc
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // Включение АЦП, делитель 64
    
    // Настройка ШИМ на OC1A (PB1)
    DDRB |= (1<<PB1);
    TCCR1A = (1<<COM1A1) | (1<<WGM10); // Fast PWM 8-bit
    TCCR1B = (1<<CS11);    // Предделитель 8
}

// Чтение значения с фоторезистора
uint16_t read_light(void) {
    ADCSRA |= (1<<ADSC);        // Запуск преобразования
    while(ADCSRA & (1<<ADSC));  // Ждём окончания
    return ADC;
}

// ПИД-регулятор
uint8_t pid_control(uint16_t current_light) {
    // Вычисление ошибки
    int16_t error = setpoint - current_light;
    
    // Пропорциональная составляющая
    int16_t p_term = (Kp * error) / SCALE;
    
    // Интегральная составляющая
    integral += error;
    // Ограничение интеграла
    if (integral > 10000) integral = 10000;
    if (integral < -10000) integral = -10000;
    int16_t i_term = (Ki * integral) / SCALE;
    
    // Дифференциальная составляющая
    int16_t derivative = error - error_prev;
    int16_t d_term = (Kd * derivative) / SCALE;
    
    // Суммирование
    int32_t output = p_term + i_term + d_term;
    
    // Ограничение и масштабирование на 0-255 для ШИМ
    if (output > 255) output = 255;
    if (output < 0) output = 0;
    
    error_prev = error;
    return (uint8_t)output;
}

int main(void) {
    init();
    
    while(1) {
        uint16_t light = read_light();      // Читаем текущую освещённость
        uint8_t pwm = pid_control(light);   // Вычисляем ШИМ
        OCR1A = pwm;                       // Устанавливаем ШИМ
        _delay_ms(10);                     // Задержка для стабильности
    }
}


Особенности реализации:
Все вычисления целочисленные
Коэффициенты Kp, Ki, Kd умножены на SCALE (10) для сохранения точности
Результат делится на SCALE для возврата к исходному масштабу
Интеграл ограничен для предотвращения переполнения
Выход ШИМ в диапазоне 0-255
Настройка:
Подберите setpoint (512 - примерное значение, половина диапазона АЦП)
Настройте Kp, Ki, Kd экспериментально:
Начните с Kp=10, Ki=0, Kd=0
Увеличивайте Kp до появления небольших колебаний
Добавляйте Ki для устранения статической ошибки
Добавляйте Kd для уменьшения перерегулирования
Рекомендации:
Добавьте фильтр на вход АЦП (конденсатор 0.1 мкФ)
Используйте прерывания для более точного времени
Добавьте гистерезис для стабильности при малых изменениях
Это базовое решение, которое можно доработать под конкретные условия комнаты и фоторезистора. Для точной настройки потребуется калибровка под реальные условия освещения.

memento mori