Регулятор оборотов коллекторного двигателя

flying
Offline
Зарегистрирован: 12.11.2011

 У меня получается такое:

RPM = 1525 PWM = 255 P = 0 I = 396
RPM = 1527 PWM = 255 P = 0 I = 396
RPM = 1527 PWM = 255 P = 0 I = 396
RPM = 1526 PWM = 255 P = 0 I = 343
RPM = 1528 PWM = 255 P = 0 I = 343
RPM = 1529 PWM = 255 P = 0 I = 343
RPM = 1528 PWM = 255 P = 0 I = 290
RPM = 1527 PWM = 255 P = 0 I = 290
RPM = 1525 PWM = 255 P = 0 I = 290
RPM = 1522 PWM = 237 P = 0 I = 237
RPM = 1522 PWM = 237 P = 0 I = 237
RPM = 9881 PWM = 237 P = 0 I = 237
RPM = 7396 PWM = 0 P = 0 I = 0
RPM = 2764 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 1030 PWM = 0 P = 0 I = 0
RPM = 0 PWM = 200 P = 200 I = 0
RPM = 106 PWM = 255 P = 200 I = 100
RPM = 7132 PWM = 100 P = 0 I = 100
RPM = 4921 PWM = 100 P = 0 I = 100
RPM = 4217 PWM = 0 P = 0 I = 0

 

постоянно дергается.

Завтра попробую с библиотекой PID http://arduino.cc/playground/Code/PIDLibrary

maksim
Offline
Зарегистрирован: 12.02.2012

Значит не правильно подобраны параметры регулирования

flying
Offline
Зарегистрирован: 12.11.2011

 Попробую уже завтра покрутить параметры.

whoim
Offline
Зарегистрирован: 03.11.2011

 а как выглядит управление двигателем?

maksim
Offline
Зарегистрирован: 12.02.2012

 И если будете использовать мой код ПИ-ругулятора, перекопируйте его снова, я там внес изменения.

flying
Offline
Зарегистрирован: 12.11.2011

 Управление двигателем, после arduinы стоит драйвер ir2110 и 9 шт IRF640

whoim
Offline
Зарегистрирован: 03.11.2011

flying пишет:

 Управление двигателем, после arduinы стоит драйвер ir2110 и 9 шт IRF640

 

схемкой не поделитесь?

flying
Offline
Зарегистрирован: 12.11.2011

 Она у на работе, в понедельник поделюсь. Схемка очень простая) Долго не мог подобрать транзисторы, одни сразу горели, вторые через пару минут под нагрузкой. Остановился на IRF640B, в понедельник выложу, будет все понятно.

Вам спасибо за помощь.

maksim
Offline
Зарегистрирован: 12.02.2012

Дописал плавный пуск и начальную компансацию статической ошибки.

Чтобы получить минимальное значение ШИМ для старта, можно использовать код:

01#define PWMpin 5
02int pwm = 0;
03 
04void setup()  {
05  Serial.begin(9600);
06  pinMode(PWMpin, OUTPUT);
07}
08 
09void loop()  {
10  analogWrite(PWMpin, pwm); 
11  Serial.print("PWM = ");
12  Serial.print(pwm, DEC); // об/мин 
13  Serial.print('\n');    
14  delay(3000);
15  pwm++; 
16}

При каком значении начнет вращаться двигатель, то значение и есть минимальное.

Установите его в 21 и 22 строки и подберите время нарастания значения ШИМ в 26 строке, чтобы двигатель запускался плано.
 

maksim
Offline
Зарегистрирован: 12.02.2012

RPM = 0
RPM = 762
RPM = 1221
RPM = 1458
RPM = 1649
RPM = 1835
RPM = 2028
RPM = 2231
RPM = 2439
RPM = 2654
RPM = 2855
RPM = 3029

NORM = 37

RPM = 3030 PWM = 33 P = 34 I = -1
RPM = 3013 PWM = 33 P = 34 I = -1
RPM = 2992 PWM = 35 P = 36 I = -1
RPM = 2986 PWM = 38 P = 38 I = 0
RPM = 2994 PWM = 37 P = 37 I = 0
RPM = 3010 PWM = 36 P = 36 I = 0
RPM = 3019 PWM = 35 P = 35 I = 0
RPM = 3017 PWM = 35 P = 35 I = 0
RPM = 3012 PWM = 35 P = 35 I = 0
RPM = 3007 PWM = 36 P = 36 I = 0
RPM = 3009 PWM = 36 P = 36 I = 0
RPM = 3013 PWM = 35 P = 35 I = 0
RPM = 3011 PWM = 35 P = 35 I = 0
RPM = 3006 PWM = 36 P = 36 I = 0
RPM = 3006 PWM = 36 P = 36 I = 0

flying
Offline
Зарегистрирован: 12.11.2011

 Загрузил програмку, но что то у меня никак.

Нарастание оборотов очень медленное пришлось изменить с 1000 на 1, и как только не игрался с параметрами, не хочет крутится постоянно. Только дергается.

maksim
Offline
Зарегистрирован: 12.02.2012

А вы минимальные значени ШИМ для старта установили? Какое? С 1000 на 1 это слишком круто, все равно что и без плавного пуска, попробуйте 500, меньше 300 не советую, лучше увеличте минимальные значени ШИМ для старта т.е. сначала он будет быстро раскручиваться, а потом медленно. Как раз первая причина того, что дергается это резкий старт.

1.Обязательно добейтесь плавного нарастания оборотов, иначе никак.

2.Далее нужно настроить пропорциональную составляющую, для этого нужно отключить интегральную - Ki = 0.0 . При отключенной интегр. составляющей добейтесь стабильной работы двигателя не обращая внимания на статическую ошибку. Если двигатель дергается значит Kp сликом большой, уменьшайте его, пробуйте 0.1, 0.07, 0.04, 0.01, 0.007, 0.004, 0.001 и т.д., но пока двигатель не начнет стабильно работать дальше настраивать нет смысла.

Отпишитесь какие установили значения: заданные обороты, минимальные значени ШИМ для старта, время нарастания ШИМ и Кр.

maksim
Offline
Зарегистрирован: 12.02.2012

Вот попробовал с библиотекой PID :

Сириал:

 

flying
Offline
Зарегистрирован: 12.11.2011

 Как у вас все красиво.) А у меня что то ни как. Может связано с arduino-й.?

maksim
Offline
Зарегистрирован: 12.02.2012

Наврядли дело в ардуине. Просто я проверяю на небольшом двигателе и задаю средние обороты. Вы, кстати, так и не отписались какие обороты хотите поддерживать?

flying
Offline
Зарегистрирован: 12.11.2011

 Минимальные гдето 800-1000. Дома на месте проверяю тоже на маленьком двигателе. Еще хочу попробовать на оптическом датчике, думаю как к двигателю его прикрутить.

maksim
Offline
Зарегистрирован: 12.02.2012

А чем датчик холла не устраивает? 

flying
Offline
Зарегистрирован: 12.11.2011

 Вроде бы устраивает, и понадежнее чем оптический.

maksim
Offline
Зарегистрирован: 12.02.2012

Я кстати, там где скачал библиотеку PID, видил библиотеку для автоматической настройки этого регулятора. Пробовали?

flying
Offline
Зарегистрирован: 12.11.2011

 Нет, не видел. Есть что то интересное?

maksim
Offline
Зарегистрирован: 12.02.2012
flying
Offline
Зарегистрирован: 12.11.2011

 Сейчас добился пока того что, пока обороты не достигли заданых (регулирую напряжение двигателя) крутится равномерно, как только доходит до заданого значения (1000), начинает дергатся

maksim
Offline
Зарегистрирован: 12.02.2012

Какие параметры Kp, Ki, Kd?

flying
Offline
Зарегистрирован: 12.11.2011

 0.3 0.3 0.06 При разных Kp Ki, изменений не замечал.

Roman
Offline
Зарегистрирован: 15.02.2013

maksim пишет:

 И если будете использовать мой код ПИ-ругулятора, перекопируйте его снова, я там внес изменения.

здравствуйте!

у меня похожая проблема. нужен код или библиотека ПИ, ПД, или ПИД регулятора, с обратной связью по импульсному сигналу от датчика Холла.

не могли бы вы поделится своим кодом ПИ регулятора?

maksim
Offline
Зарегистрирован: 12.02.2012

Код в сообщении #63, библиотеку качать отсюда.

Roman
Offline
Зарегистрирован: 15.02.2013

maksim пишет:

Код в сообщении #63, библиотеку качать отсюда.

спасибо! буду разбираться.

crecker
Offline
Зарегистрирован: 15.12.2013

при установке библиотеки PID: 

java.io.FileNotFoundException: C:\Users\serega\AppData\Local\Temp\arduino_555176\br3ttb_Arduino_PID_Library_d21d7e3470\br3ttb_Arduino_PID_Library_d21d7e3\PID_v1\Examples\PID_AdaptiveTunings\PID_AdaptiveTunings.ino (??????? ?? ??????? ????? ????????? ????)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
 
что можно сделать?

 

sergey_mak
Offline
Зарегистрирован: 07.01.2014

А как код ПИ регулятора переделать, если у меня датчик выдает 60 импульсов за один оборот вала?