Чтобы добавить к предыдущему ответу, также рассмотрите случай целочисленного завершения в вашем коде.Должен быть какой-то механизм для сброса интегрального члена, если произойдет откат.Также выберите наибольший доступный тип данных, чтобы сохранить член интеграма (суммы), чтобы избежать целочисленного переполнения (обычно long long
).Также позаботьтесь о встроенном переполнении.
Если вы выбираете достаточно высокую частоту дискретизации, можно избежать деления, чтобы уменьшить количество вычислений.Однако, если вы хотите поэкспериментировать со временем выборки, оставьте время выборки кратным степеням двух, чтобы деление можно было выполнить с помощью операций сдвига.Например, предположим, что выбранное время выборки составляет 100 мс, 50 мс, 25 мс, 12,5 мс.Тогда делительными коэффициентами могут быть 1, 1 << 1, 1 << 2, 1 << 4. </p>
Удобно хранить все связанные переменные ПИД-регулятора в одном struct
, изатем используйте это struct
в качестве параметров в функциях, работающих с этим PID.Таким образом, код будет модульным, и многие микропроцессорные циклы могут одновременно работать на микроконтроллере, используя один и тот же код и только разные экземпляры struct
.Этот подход особенно полезен в больших робототехнических проектах, где у вас есть много циклов для управления с помощью одного процессора.