Управление скоростью BLDC со встроенным контроллером (Hall out, PWM in)
Я стремлюсь к точному контролю скорости этот двигатель BLDC: он имеет встроенный контроллер, выдающий цифровой сигнал Холла (период 20,8 мс на осциллографе, без нагрузки) и использующий ШИМ в качестве входа для регулирования скорости.
Насколько мне известно, это задача ПИД-регулятора: измерить импульсы Холла на входе, отрегулировать рабочий цикл ШИМ на основе целевого периода/частоты выходного сигнала Холла.
Скорость должна контролироваться с погрешностью < 1% (чем меньше, тем лучше).
- Реалистична ли эта цель для данного двигателя?
- Как измерить длительность импульса?
- Будет ли
pulseIn
(с отключенными прерываниями) достаточно точным? Должен ли я измерять минимумы или максимумы? - Должен ли я вместо этого измерять несколько импульсов (и как)? Или я должен принять неточность в периоде импульса и компенсировать (сгладить) его, используя интегральные/производные члены?
- Нужно ли для этой задачи разрешение ШИМ более 8 бит? (Сначала я буду использовать Nano, но могу переключиться на Nano Every, который имеет 10-битный ШИМ).
Приветствуются любые другие комментарии/предложения.
@eudoxos, 👍0
Обсуждение2 ответа
Лучший ответ:
Это лишь частичный ответ об измерении периода или продолжительности пульса.
Для максимальной точности я бы рекомендовал использовать функцию "захват ввода".
16-битного таймера. Это не так просто, как использовать pulseIn()
или синхронизацию.
сигнал с помощью micros()
: вам придется внимательно изучить MCU
datasheet и вручную настроить биты некоторых регистров ввода/вывода. Ты
будет вознагражден высокой точностью (один цикл, если таймер работает в
тактовой частоты MCU) и без джиттера, присущего любому
программный подход.
Остерегайтесь того, что Nano и Nano Every используют разные микроконтроллеры с очень разные таймеры. Оба имеют возможность захвата ввода, но если вы переключите от одного к другому вам придется переделывать большую часть работы. Обратите внимание, что Nano поддерживает 10-битный ШИМ, если вы запрограммируете его на низком уровне.
Программный подход (pulseIn()
или attachInterrupt()
+
micros()
) имеет преимущество переносимости.
Чтобы немного расширить ответ Эдгара:
Есть два основных способа измерения частоты, каждый из которых требует разных ресурсов и лучше подходит для разных ситуаций.
Метод, описанный Эдгаром с использованием метода захвата входного сигнала, хорош для быстро меняющихся низкочастотных сигналов, когда вы хотите очень быстро реагировать на изменения частоты. Он работает путем измерения времени между двумя импульсами с помощью автономного таймера. Конечно, вы можете измерять частоты только с той скоростью, с которой может работать таймер, что в любом случае довольно быстро, и при правильной настройке он может работать почти полностью асинхронно, поэтому вы можете просто запросить текущее записанное время, когда вам нужно.
Другой вариант – подсчет количества импульсов за заданный период времени. Это также можно сделать аппаратно, но с использованием другого набора периферийных устройств.
Для этого у вас есть два таймера. Таймер 1 может использовать внешний сигнал на выводе D5 в качестве часов. По сути, это превращает его в счетчик импульсов, и каждый раз, когда импульс поступает на вывод таймера, счетчик увеличивается на единицу.
Затем у вас есть второй таймер, который запускает прерывание в заданный период времени. Каков этот период, зависит от желаемой чувствительности и частотного диапазона, который вы хотите измерить. Вы также можете использовать "предделитель" Таймера 1, чтобы увеличить диапазон измерения частоты, подсчитывая только каждый 2-й, 4-й или 8-й и т. д. фронт.
Конечно, все это использование таймера будет мешать генерации ШИМ на Nano, но должно быть лучше на Nano Every, но вам следует проверить таблицу данных на предмет использования таймера.
Подводя итог:
Захват ввода
- Быстрый ответ
- Ограниченный диапазон частот
Подсчет импульсов с помощью таймера 1
- Замедленный отклик
- Естественно сглаженный вывод
- Более широкий частотный диапазон
- Понимает концепцию нулевой частоты.
- Мешает генерации ШИМ
Какой бы метод вы ни выбрали, обязательно пропустите его через PID, чтобы создать стабильный выходной RPM.
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Попытка контролировать скорость двигателя постоянного тока с помощью ПИД
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- ПИД-регулятор для управления скоростью двигателя
- Как управлять 6 шаговыми двигателями с помощью Arduino?
- Реализация Dshot на Arduino (протокол ESC)
- Двигатель постоянного тока шумит, но не вращается
- Не могу контролировать скорость двигателей постоянного тока с помощью analogWrite()
вы можете иметь 16-битный ШИМ с Timer1 (библиотекой) на Nano, @Juraj