Вопросы по библиотеке"GyverPID.h"

sonmax

✩✩✩✩✩✩✩
11 Фев 2022
1
0
Всем привет!
Пытаюсь применить данную библиотеку для своих нужд.
что нужно.
есть датчик давления работающий в диапазоне -100 _ 100 Па. (данные с него приходят в виде напряжения 0 _ 10 В)
Уставка = -20 Па,
необходимо поддерживать данное давление путем увеличения/уменьшения частоты вращения вентилятора (частота изменяется по напряжению 0 _ 10 В)
Изменяться должно через ПИД регулирование,
Код в Arduino:
int sensorValue = analogRead(A0);                   // считываю с А0 значение  в диапазоне 0 _1023
float pressure = (sensorValue * 0.195) - 100;       // привожу к виду давления -100 _ 100 Па
int pid = computePID(pressure, -20, 5, 3, 0, 0.02, 0, 255);  
float outputValue = pid / 4.82 * 255.0;             // полученное значение перевожу в вольты
analogWrite(pin9, outputValue);                     // данное напряжение увеличивает/уменьшает вращения вентилятора
Значение pid при отрицательной уставке не считается вообще
да и при положительной уставке тоже все печально.
Не могу разобраться в чем проблема.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Значение pid при отрицательной уставке не считается вообще
Ну, нормализуйте данные, чтобы минимальное значение не было отрицательным.

Не могу разобраться в чем проблема.
В коэффициентах. По большому счету, настройка ПИД-регулятора - это отдельная наука.
Да, есть автоматические методы для более-менее нормального подбора коэффициентов, но почти все они перегружают управляемый элемент. И часто использование их на живом объекте грозит аварийной ситуацией, если не предусмотрена защита.
 

Soy

✩✩✩✩✩✩✩
12 Мар 2021
12
0
Парни, не совсем понятно как использовать библиотеку PWMrelay
совместно с GyverPID, а именно что подставлять в getResultTimer: setPeriod при жестко заданным setPWM, или же подставлять setPWM при жестко заданным setPeriod? что лучше работает?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
611
145

@sonmax, вот в этом участке кода
C++:
float outputValue = pid / 4.82 * 255.0;    // полученное значение перевожу в вольты
разве есть острая необходимость? Ведь, согласно документации на библиотеку GyverPID функция computePID() в твоём коде выдает результат от 0 до 255. Далее МК его пересчитывает, например PID =127, outputValue =127/4*255 = 6718.88 при передаче этого значения в analogWrite() там окажется совсем иное число (допустимо от 0 до 255). Поэтому и работает так не понятно.
 
Изменено: