STM32 - ESC: проблема с моим BEMF
Я делаю ESC для своего двигателя BLDC. Я использовал STM32 (для генерации моего ШИМ), 3 драйвера mosfet IR2101 (https://www.infineon.com/dgdl/ir2101.pdf?fileId=5546d462533600a4015355c7a755166c) и 6 МОП-транзисторов для управления разными фазами двигателя.
Моя схема:
Я генерирую свою фазу с помощью ШИМ на стороне High и GPO на стороне Low.
ВЫСОКАЯ сторона моего ШИМ (фазы A, B и C)
ФАЗА A (ниже 0 В!)
Сигнал кажется правильным, но когда я подключаю свой двигатель, мы видим, что BEMF является обратным по сравнению с хорошим BEMF.
ФАЗА ABC
BEMF ABC
Я пытаюсь изменить частоту ШИМ, изменить рабочий цикл или задержку между каждой фазой, но ничего не меняется (а иногда и хуже ...). Вы знаете почему?
Мой STM работает на частоте 8 МГц. Частота ШИМ: 900 Гц с рабочим циклом 5%. Во время этого теста мой двигатель потребляет 12 В / 0,8 А.
РЕДАКТИРОВАТЬ
Я не знаю, почему мой BEMF перевернут по сравнению с хорошим.
Ниже вы можете увидеть мою фазу C (желтый), виртуальное заземление моего двигателя (голубой), математическую операцию Фаза C - виртуальное заземление (темно-синий) и выходной сигнал моего LM339 (розовый).
Я видел множество тем об этой проблеме на Stack exchange, но каждый раз ответ не был ясен. ( введите здесь описание ссылки ).
Я предполагаю, что мои PWM и BEMF не «совпадают по фазе» .. Мне нужны некоторые пояснения.
Ответы
Добро пожаловать в StackExchange! Молодец первый пост.
Вы правы, ваше форсирующее напряжение не совпадает по фазе с вашим двигателем.
Мне кажется, что вы отбираете сэмплы в неправильном месте во время цикла ШИМ. Убедитесь, что выборка АЦП находится в центре цикла ШИМ, когда цикл ШИМ высокий. Для получения правильного образца может потребоваться минимальный рабочий цикл, но это может быть не так, поскольку 900 Гц - довольно низкая частота.
Из снимков экрана вашего осциллографа сложно предположить, но похоже, что фаза отрицательная на нижней стороне вашего ШИМ и положительная на верхней стороне вашего ШИМ ... так что ваш код, вероятно, делает именно то, что вы говорят, что нужно делать, но не в том месте цикла.
Мне нравится проверять время прерывания (примерно), настраивая вывод, чтобы он включался при запуске прерывания АЦП и выключался, когда прерывание АЦП завершается. Обычно я могу почерпнуть из этого хорошую информацию.
Если вы проверили / исправили время выборки АЦП, и проблема не исчезла, опубликуйте снимок экрана одной фазы, когда она растет, по оси Y в полном масштабе.
Придерживаться! Проблемы решаются, если опустить голову и работать над этим. Но не забудьте уйти и немного поспать. Утром проблемы выглядят совсем иначе!
отредактировано, чтобы добавить
Основываясь на ваших комментариях, у меня возникает ощущение, что могут быть некоторые основные недопонимания (я могу ошибаться).
Расчет нейтрального напряжения
Во-первых, вам не нужно измерять напряжение нейтрали. Это бесполезный модуль АЦП. Вы можете рассчитать напряжение нейтрали: neutral = (phaseA + phaseB + phaseC) / 3;. Рекомендую преобразовать это в обозначение скорости с фиксированной точкой, но математика верна. Теперь у вас на один АЦП меньше!
Ваш нейтральный взгляд в значительной степени правильный. Если вы мысленно проделаете математику, которую я только что описал, вы увидите, что напряжение нейтрали действительно является средним (или очень близким) к фазным напряжениям.
Настроить регистры для работы
Затем, если вы настраиваете регистры TIM1 и ADC12 с выравниванием по центру и запускаете на пике режима счетчика, то для правильной выборки не требуется никаких вычислений.
Когда коммутировать
В своем комментарии вы написали
если плавающая фаза - виртуальная земля = 0. Если это правда, то я теоретически знаю продолжительность ожидания перед переключением следующей фазы на высокий
Это верно только в половине случаев, и я просто хочу выразить это четко. Обратите внимание, что фаза BEMF попеременно возрастает на одной фазе и падает на другой.
if(phaseIsRising){
if(phaseVoltage > neutral)
commutate();
}else{
if(phaseVoltage < neutral)
commutate();
}
Если вы правильно реализуете приведенный выше код, вы сможете управлять двигателем, но на 30 градусов вперед. Поверьте, это будет выглядеть намного лучше, чем на ваших скриншотах.
Дальнейшая работа
Если вы зайдете так далеко, я оставлю вам решать, как сместить событие коммутации на 30 градусов.