Я инженер-электрик, который был как бы втянут в цифровой мир и учусь на ходу. Я программирую процессор TI для выполнения цикла PID (пропорционально-интегрально-производная) , проиллюстрированного этой диаграммой:
Я также опишу это:
Операционный усилитель с отрицательной обратной связью, с неинвертирующей клеммой, заземленной. Вход через отрицательный терминал. Контур обратной связи представляет собой последовательную цепь RE параллельно с резистором и все это параллельно с заглушкой.
Кто-нибудь есть идеи, как преобразовать эту схему в C-код? Я немного не согласен с этим и могу воспользоваться помощью.
dt
на константы, вместо того, чтобы делать дополнительные деления и умножения в цикле.Ответы:
Схема
Хорошо, я только что создал учетную запись здесь, когда я увидел этот вопрос. Я не могу отредактировать ваш вопрос, чтобы исправить опечатку, которую вы сделали. Я полагаю, что вы имели в виду параллельную цепь RC вместо RE (если это так, я не имею ни малейшего понятия, что это значит)
Похоже, аналоговая схема, которую вы хотите смоделировать с помощью C выглядит примерно так
(Я не смог устоять перед желанием нарисовать это, потому что хотел рассказать вам, как инженеры-электрики и электроники общались на форумах и в электронных письмах без изображений ... и почему нам просто нравится курьер, шрифт с фиксированной шириной)
Я должен признаться, что схема, которую вы используете, проста в настройке, но очень сложна математически, когда речь идет о настройке пропорциональных, интегральных и производных констант системы на желаемое значение по отдельности, что невозможно.
Я настоятельно рекомендую вам использовать схему из этого источника для изучения.
Хотя это немного утомительно для настройки, математически гораздо проще анализировать, так как вы можете напрямую связать ее со стандартной математической формой вместо идеальной.
Наконец, Vout используется для управления двигателем или чем-либо еще, что необходимо контролировать. А Vin - это переменное напряжение процесса.
Прежде чем промочить ноги в C (море?)
Я предполагаю, что вы читаете сигналы от какого-то аналого-цифрового преобразователя. Если нет, то вам придется смоделировать сигнал в качестве входа.
Если мы используем стандартную форму,
Предполагая, что время выполнения цикла достаточно мало (медленный процесс), мы можем использовать следующую функцию для расчета выхода:
где
где изначально 'der' и 'int' будут равны нулю. Если вы используете функцию задержки в коде для настройки частоты цикла, скажем, 1 кГц, тогда ваш dt будет равен 0,001 секундам.
Рисование в C
Я нашел этот отличный код для PID в C, хотя он не охватывает все его аспекты, тем не менее, он хороший.
Если мы возьмем медленный процесс, то мы можем использовать более низкую частоту, такую, что dt >>> время выполнения кода для одного цикла (намного больше, чем). В таких случаях мы можем покончить с таймером и использовать функцию задержки.
источник