Самодельный локомотивный декодер.

Первое новое сообщение

Аватара пользователя 451.tnt23 » Ср май 27, 2020 10:36 pm

Дык она то поди на ходу по другому совсем будет работать. Надоть на ходу пробовать.
И обязательно попробуем. Пока использую мозолистый палец для создания непредвиденных динамических нагрузок, тащит ОК.
Цитата

452.BR95009 » Пт май 29, 2020 11:04 am

А скетч то планируете выложить посмотреть?
Цитата

Аватара пользователя 453.tnt23 » Пт май 29, 2020 12:21 pm

У меня не ардуино - другая архитектура (stm32), и скетча как такового нет. Все раскидано по вороху файлов, включая очень недружелюбные низкоуровневые вещи и сомнительного качества комментарии. Когда-нибудь, возможно, причешу и опубликую.

Сам код регулятора прост, как валенок:

Код: Выделить всё

err = TARGET_BEMF_VOLTAGE - bemf; // P-term proportional = (err * ReadCV (CV56_KP)) / KPDIV; if (proportional > MAXKP) proportional = MAXKP; if (proportional < -MAXKP) proportional = -MAXKP; // I-term integral += err; if (integral > MAXINTEGRAL) integral = MAXINTEGRAL; if (integral < -MAXINTEGRAL) integral = -MAXINTEGRAL; ki = (integral * ReadCV (CV57_KI)) / KIDIV; if (ki > MAXKI) ki = MAXKI; if (ki < -MAXKI) ki = -MAXKI; fix = proportional + ki;
Все это крутится в цикле вместе с периодическим замером обратной ЭДС (таймеры, прерывания, DMA - все как у людей). Полученная поправка - fix - подмешивается в PWM мотору.
Цитата

454.BR95009 » Сб май 30, 2020 10:20 pm

А TARGET_BEMF_VOLTAGE как определяется?
Цитата

Аватара пользователя 455.tnt23 » Вс май 31, 2020 12:04 am

А TARGET_BEMF_VOLTAGE как определяется?
Сейчас отлаживаюсь с константой, для ушатанного BR 55 это 14..16 единиц. В реале думаю брать как разницу между CV5 и CV2, деленную на количество шагов.
Цитата

456.BR95009 » Вс май 31, 2020 4:01 pm

Те один и тот же PI алгоритм для малого хода и для нормальной скорости?

Вольтаж референсный лучше снимать до Н моста. Иначе при уходе вольтажа весь алгоритм начнет лажать.

И еще пару вопросов, если можно:
- можно ли финальную схему выложить?
- в какой момент и с какой частотой вы снимаете показания бек емф? Прерывает шим, или просто не доводите скважность до 100% и снимаете в этом промежутке, который гарантированно не заполнен?
Цитата

Аватара пользователя 457.tnt23 » Вс май 31, 2020 5:43 pm

Те один и тот же PI алгоритм для малого хода и для нормальной скорости?
Один, меня пока больше заботит тихий ход. Потом можно будет сделать отключение стабилизации, дискретное или плавное, по мере увеличения скорости.
Вольтаж референсный лучше снимать до Н моста. Иначе при уходе вольтажа весь алгоритм начнет лажать.
Он не снимается, а задается программно. На АЦП заведено только напряжение с мотора. В принципе можно и напряжение после выпрямителя измерять, только пока не вижу, где его дальше использовать. Регулятор старается поддерживать обороты так, чтобы с мотора приходило более-менее одно и то же. Просядет напряжение на рельсах - чуть упадет BEMF - регулятор поддаст газу - BEMF вырастет - все довольны. Мне так кажется.

Финальная схема будет, когда наступит финал-апофеоз. Пока схема практически как и у топикстартера, только управление мотором сделано на ZXMHC6A да процессор другой. Замер BEMF тоже такой же.

loco2 bridge.png

- в какой момент и с какой частотой вы снимаете показания бек емф? Прерывает шим, или просто не доводите скважность до 100% и снимаете в этом промежутке, который гарантированно не заполнен?
BEMF считывается периодически, по таймеру. Период задается в миллисекундах в CV, минимум 10мс, для отладки довольствуюсь 20мс.

замер ЭДС.png
замер ЭДС.png (10.31 КБ) 763 просмотра


Когда наступает время замера, ШИМ отключается, выжидаем усыхания тока в обмотке и появления напряжения обратной ЭДС, это примерно 1.5-2 миллисекунды с момента выключения ШИМ. Затем отрабатывает АЦП, и ШИМ включается обратно.
Цитата

458.BR95009 » Вс май 31, 2020 9:13 pm

А не многовато - 10 миллисекунд?

Народ меряет через микросекунды.
Цитата

Аватара пользователя 459.tnt23 » Вс май 31, 2020 10:51 pm

Вот прямо через микросекунды? как-то сомнительно. Есть ли в этом практический смысл?

Хотя мне хочется попробовать чаще, но пока не сделать интервал меньше 10мс. Надо плотно переделывать процедуру замера. С другой стороны, и так пауза в подаче ШИМ порядка 1-2мс.
Цитата

Аватара пользователя 460.tnt23 » Пн июн 01, 2020 4:05 pm

Вот еще отличная лекция про PID доступным языком: http://robofob.ru/materials/articles/pa ... bline1.pdf
ПИД-управление в нестрогом изложении

Настоящая работа представляет собой очередную попытку неформального, популярного описания основ построения ПИД-регулятора, причем с уклоном в робототехнику, если под этим уклоном понимать иллюстрацию теории на примере движения мобильного робота.
PS и еще нашелся скетч PID для ардуино на пол-странички, буквально: https://alexgyver.ru/gyverpid/

Код: Выделить всё

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ // величины регулятора int setpoint = 0; // заданная величина, которую должен поддерживать регулятор int input = 0; // сигнал с датчика (например температура, которую мы регулируем) int output = 0; // выход с регулятора на управляющее устройство (например величина ШИМ или угол поворота серво) int pidMin = 0; // минимальный выход с регулятора int pidMax = 255; // максимальный выход с регулятора // коэффициенты float Kp = 1.0; float Ki = 1.0; float Kd = 1.0; float _dt_s = 0.1; // время итерации в секундах // вспомогательные переменные int prevInput = 0; float integral = 0.0; // ПИД // функция расчёта выходного сигнала int computePID() { float error = setpoint - input; // ошибка регулирования float delta_input = prevInput - input; // изменение входного сигнала prevInput = input; output = 0; output += (float)error * Kp; // пропорционально ошибке регулирования output += (float)delta_input * Kd / _dt_s; // дифференциальная составляющая integral += (float)error * Ki * _dt_s; // расчёт интегральной составляющей // тут можно ограничить интегральную составляющую! output += integral; // прибавляем интегральную составляющую output = constrain(output, pidMin, pidMax); // ограничиваем выход return output; }
Цитата
Поле сортировки

« Цифровое управление, Аналоговая автоматика и их элементы