Немного оптимизации

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
Здравствуйте у кого есть маленький алгоритм pid регулятора, а то мой памяти занимает много
C++:
uint8_t computePID(int g_temp, int s_temp, uint8_t id) {
  int16_t _Time = timer4_millis - previousTime[id];  
  s_temp -= g_temp;                    
  cumError[id] += s_temp * _Time;              
  double out = s_temp - lastError[id];
  out /= _Time;
  out *= kd[id];
  out += (ki[id]*cumError[id]);
  out += (kp[id]*s_temp);
  lastError[id] = s_temp;                                
  previousTime[id] = timer4_millis;                        
  return (uint8_t)out;
да плюс выходит за пределы строки 512байт. при прошивке. шью stm8. Пол нета облазил все только больше. и да 2 выхода во почему kd[id] и тд. массивом
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Уходить от float и делений. Определить точность и пользоваться приблизительными вычислениями. Хранить максимум int. Интервал времени сделать одинаковым, чтобы исключить его из расчётов.
 
  • Лойс +1
Реакции: Normalek

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Если уж пользуетесь плавающей запятой, то максимум float, double для 8-битного контроллера это слишком, да и оверкилл в данной ситуации.
Ну и как сказали, не использовать float. Даже если загляните в ардуиновскую библиотеку FastPID, то там float перемножается при установке коэффициентов и далее используются целые числа. Можно совсем от float отказаться в параметрах, если сразу целые числа в параметры передавать. FastPID/FastPID.cpp at master · mike-matera/FastPID · GitHub
 
Изменено:
  • Лойс +1
Реакции: Normalek