Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Детекция ЭДС в регуляторе бесколлекторного двигателя.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
murmur
Коллеги, есть трупик модельного регулятора скорости бесколлекторного двигателя. Китайский. Плата 4-х слойная, прозвонила ее с трудом. На плате ATmega8.
Во первых Атмега горелая, буду ее менять. Во вторых, хочу залить свою прошивку по ряду причин - отрегулировать напряжение отключения при разряде, добавить изменение направления вращения по команде на пин и др.
В общем, частичный реверсинг.
В принципе схема очень похожа на вот это http://radioparty.ru/prog-avr/program-c/61...bldc-sensorless
С одним лишь отличием - посмотрите как реализована схема детекции обратной ЭДС там, и посмотрите в выложенный мной PDF - это в моем контроллере, для которого хочу писать прошивку.

В статье, которую я привела выше, замечательно расписано, как с помощью компаратора детектируется обратная ЭДС. Но совершенно непонятно, какую функцию выполняют входы ADC0 ADC1 ADC2. Ни в статье это не описано, ни в приведенном коде на С обращения к этим пинам нет.

Посмотрите на мою схему, в прилагающемся PDF. Там немного по другому. Но тоже идут 3 линии к ADC0 ADC6 ADC7.
Для чего же они нужны, какую роль они играют в управлении двигателем?

Ну и, учитывая то, что в моей схеме цепи детекции несколько иные, будет ли отличаться алгоритм обработки поступющих с них сигналов на компаратор и на ADC ?
AlexandrY
Цитата(murmur @ Jun 8 2018, 21:29) *
Ну и, учитывая то, что в моей схеме цепи детекции несколько иные, будет ли отличаться алгоритм обработки поступющих с них сигналов на компаратор и на ADC ?

В статье применялся очень маломощный двигатель. В таких случаях алгоритм на компараторах еще кое-как работает, особенно если отключен ШИМ.
Но в случае более мощного мотора вариант с компараторами не пройдет.
Поскольку обратная ЭДС будет зашумлена паразитными всплесками на фронтах ШИМ-а, как на рисунке ниже.
Нажмите для просмотра прикрепленного файла
Тогда применяют АЦП в строго синхронном с ШИМ-ом режиме и деалают медианную фильтрацию как у Microchip - http://www.microchip.com/wwwAppNotes/AppNo...ppnote=en533912
Другие применяют интегрирование и проч. методы
V_N
Входы ADC0 ADC1 ADC2 это РС1,PC2 и PC3 -аналоговые входы . По умолчанию порты РС1,PC2 и PC3 на строены как аналоговые входы в строках :
// Аналаговый компаратор
ADCSRA &= ~(1 << ADEN); // Выключаем АЦП
SFIOR |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП
ACSR |= (1 << ACIE); // Разрешаем прерывания от компаратора
в выбранном контроллере один компарато поэтому его по очереди подключают ко входам ADC0 ADC1 ADC2-
#define SENSE_U ADMUX = 0; // Вход обратной ЭДС фазы U
#define SENSE_V ADMUX = 1; // Вход обратной ЭДС фазы V
#define SENSE_W ADMUX = 2; // Вход обратной ЭДС фазы W
компаратор настраиваеми разрешаем прерівания
/ Аналаговый компаратор
ADCSRA &= ~(1 << ADEN); // Выключаем АЦП
SFIOR |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП
ACSR |= (1 << ACIE); // Разрешаем прерывания от компаратора
murmur
Цитата
В статье применялся очень маломощный двигатель. В таких случаях алгоритм на компараторах еще кое-как работает, особенно если отключен ШИМ.
Но в случае более мощного мотора вариант с компараторами не пройдет.


Статья статьей, но я привела свою схему, на которой именно компаратор, а мотор к ней можно подключать до 20 ампер. И схема работает.
Конденсаторы фильтров на плате есть, я их просто на схеме не привела. За статью спасибо, очень интересно.

V_N, вам тоже спасибо. СЛона то я и не заметила)))

Следующий вопрос - ШИМ. В статье, которую я привела, все просто и логично - управление верхними ключами осуществляется через ШИМ выходы контроллера. При проектировании же моей платы китайцы наверное следовали Конфуцию или еще кому-то... Но у меня OC1A, OC1B и OC2 вообще не заняты. Управление верхними ключами повешено на PC3 PC5 PD4.

Есть статейка от АТМЕL, где есть интересное решение - один ШИМ выход и логические элементы. Но у меня такое решение не применено.
Неужели у меня был программный ШИМ?

Как на практике еще организовывают ШИМ управление? Может есть какой-то способ шимировать все ключи или ток регулировать?
У меня на плате есть еще несколько элементов, предназначение которых я понять не могу пока, в виду того, что плата 4-х слойная.

Кстати - на плате почему то целых 3 преобразователя напряжения 7805, которые соединены параллельно, только выход их развязаны маломощными резисторами 22 ом. И это при том, что из 5-ти вольтовых потребителей только Атмега... Никого ни на какие мысли не наводит?
AlexandrY
Цитата(murmur @ Jun 9 2018, 05:57) *
И схема работает.
Конденсаторы фильтров на плате есть, я их просто на схеме не привела.

BLDC многое стерпят.
Они даже в асинхронном режиме крутятся.
Вопрос как эффективно вы хотите управлять.
Конденсаторы фильтров дадут вам неизвестную фазовую задержку, которая на высоких оборотах приведет к плохому регулированию, низкому КПД и неприятному шуму.
murmur
Хм... странно все таки. Почему разработчик моего контроллера не использовал аппаратные возможности шим....
Скажите я ведь могу, используюя для управления верхними ключами навязанные мне пины, завести таймер и с его помощью тупо менять состояния пинов обычным "ногодрыгом" и возвращать их обратно? Это будет адекватная замена аппаратным возможностям?
AlexandrY
Цитата(murmur @ Jun 9 2018, 10:01) *
Хм... странно все таки. Почему разработчик моего контроллера не использовал аппаратные возможности шим....
Скажите я ведь могу, используюя для управления верхними ключами навязанные мне пины, завести таймер и с его помощью тупо менять состояния пинов обычным "ногодрыгом" и возвращать их обратно? Это будет адекватная замена аппаратным возможностям?

Конечно можете.
Более того, мотор будет крутится даже если вовсе не будете следить за обратной ЭДС.
Все упирается в назначение мотора и характеристики регулирования.
Если не планируется какое-то точное регулирование, то всеми ключами можно управлять программно без аппаратного ШИМ-а.

murmur
Цитата(AlexandrY @ Jun 9 2018, 10:59) *
Конечно можете.
Более того, мотор будет крутится даже если вовсе не будете следить за обратной ЭДС.
Все упирается в назначение мотора и характеристики регулирования.
Если не планируется какое-то точное регулирование, то всеми ключами можно управлять программно без аппаратного ШИМ-а.

Мотор изначально предназначен для авиамодели. Но мной он будет установлен в детский автомобильчик (через редуктор), взамен старого и дохлого.
gosha-z
АвтоESCи сильно отличаются от авиа. По характеру нагрузки и условиям охлаждения.
jcxz
Цитата(murmur @ Jun 9 2018, 10:01) *
Скажите я ведь могу, используюя для управления верхними ключами навязанные мне пины, завести таймер и с его помощью тупо менять состояния пинов обычным "ногодрыгом" и возвращать их обратно? Это будет адекватная замена аппаратным возможностям?

На Атмеге это будет довольно сложно делать. Слабовата имхо.
Я конечно делал подобное на STM8 на 16МГц (ШИМ=10кГц), но аппаратным ШИМом. И то пришлось бОльшую часть кода на асме писать. И это без всяких векторных управлений, без обратных связей, чисто синусное управление. А на синусном управлении моторчиком под нагрузкой (да ещё переменной нагрузкой) имхо не по-управлять. laughing.gif

Но можно сделать без ШИМа и без векторного управления, коммутируя ключи в соответствии с датчиком положения ротора. Это называется BLDC.
Но всё равно схема будет очень чувствительна к задержкам выполнения кода (на разных скоростях ротора влияние задержек будет меняться). Задержка будет вызвана: скоростью вычисления положения ротора по показаниям датчиков положения ротора (зависит от типа датчиков) и скоростью выставления управляющих воздействий на ключи по вычисленному положению.
А как, кстати, положение ротора на вашей плате определяется? д.Холла или бездатчиковое?
gosha-z
Цитата(jcxz @ Jun 9 2018, 13:11) *
А как кстати положение ротора на вашей плате определяется? д.Холла или бездатчиковое?


У авиаторов - исключительно BackEMF
jcxz
Цитата(gosha-z @ Jun 9 2018, 13:23) *
У авиаторов - исключительно BackEMF

Читать много лень. sm.gif
Для авиа-назначения, можно считать, что нагрузка примерно постоянна (вентиляторная нагрузка)? И можно обойтись без обратной связи? Если так, то можно и синусным ШИМом по-управлять, заранее зная параметры инерции вала с пропеллером.
Но ТС ведь хочет этот моторчик для авто применить. А там уже так не поработать. Обратная связь по положению ротора нужна. И самое простое тут - датчики Холла laughing.gif
gosha-z
Цитата(jcxz @ Jun 9 2018, 13:33) *
Читать много лень. sm.gif
Для авиа-назначения, можно считать, что нагрузка примерно постоянна (вентиляторная нагрузка)? И можно обойтись без обратной связи?

Авиа, в свою очередь, делятся на самолетные и вертолетные. Основное отличие - для вертолетов через BackEMF (обратная ЭДС по-русски sm.gif) делается стабилизация частоты вращения ротора под любой нагрузкой (governor mode)
Цитата(jcxz @ Jun 9 2018, 13:33) *
Если так, то можно и синусным ШИМом по-управлять, заранее зная параметры инерции вала с пропеллером.

Чаще всего так и делается
Цитата(jcxz @ Jun 9 2018, 13:33) *
Но ТС ведь хочет этот моторчик для авто применить. А там уже так не поработать. Обратная связь по положению ротора нужна. И самое простое тут - датчики Холла laughing.gif


Все зависит от kV мотора и передаточного отношения редуктора. Но не припоминаю на модельных автомоторах датчика Холла...
jcxz
Цитата(gosha-z @ Jun 9 2018, 13:41) *
Но не припоминаю на модельных автомоторах датчика Холла...

Зато гироскутеры наверное все на них бегают rolleyes.gif
murmur
Смущает в коде, что по ссылке в первом сообщении, отсутствие deadtime. Или я слепая и не вижу?

Цитата(jcxz @ Jun 9 2018, 13:50) *
Зато гироскутеры наверное все на них бегают rolleyes.gif

Гироскутеры на них не просто бегают, они на них равновесие держат. Именно этим определяется необходимость в датчиках Холла.
Lagman
Цитата(murmur @ Jun 9 2018, 14:29) *
Гироскутеры на них не просто бегают, они на них равновесие держат. Именно этим определяется необходимость в датчиках Холла.


Мне кажется для этих дел уже давно гироскопы используют.
jcxz
Цитата(murmur @ Jun 9 2018, 14:29) *
Гироскутеры на них не просто бегают, они на них равновесие держат. Именно этим определяется необходимость в датчиках Холла.

д.Холла - именно только для определения положения ротора. Для определения наклона доски - гироскоп.
Lagman
Цитата(jcxz @ Jun 9 2018, 17:14) *
д.Холла - именно только для определения положения ротора. Для определения наклона доски - гироскоп.

Зачем дублировать одну и ту же информацию? Это же не робот у которого надо знать положение колесика.
murmur
Цитата(jcxz @ Jun 9 2018, 17:14) *
д.Холла - именно только для определения положения ротора. Для определения наклона доски - гироскоп.

Я предельно ясно выразилась - "держат равновесие". Гироскоп определяет наклон. А Холлы - держат
Lagman
Цитата(jcxz @ Jun 9 2018, 13:33) *
Читать много лень. sm.gif
Для авиа-назначения, можно считать, что нагрузка примерно постоянна (вентиляторная нагрузка)? И можно обойтись без обратной связи? Если так, то можно и синусным ШИМом по-управлять, заранее зная параметры инерции вала с пропеллером.
Но ТС ведь хочет этот моторчик для авто применить. А там уже так не поработать. Обратная связь по положению ротора нужна. И самое простое тут - датчики Холла laughing.gif

На 3d rc вертолетах во всю используют гувернер оборотов (система поддержания постоянных оборотов) либо в регуляторе либо в flybarless system (ФБЛке), если гувернер используют в ФБЛке то, сейчас, обычно берут (цифру) с регулятора, либо используют датчик оборотов в простом случае это припаянные провода на два провода из трех от регулятора к двигателю.
В rc автомобилях, я не знаю, может тоже есть регуляторы оборотов но по моему они там сильно не нужны ведь в руках джойстик и там есть газ, им и можно держать обороты т.е. скорость.


Цитата(murmur @ Jun 9 2018, 17:26) *
Я предельно ясно выразилась - "держат равновесие". Гироскоп определяет наклон. А Холлы - держат

Сделайте простой опыт поставьте на гироскутер мешок картошки и посмотрите как гироскутер будет держать равновесие.
jcxz
Цитата(murmur @ Jun 9 2018, 17:26) *
Я предельно ясно выразилась - "держат равновесие". Гироскоп определяет наклон. А Холлы - держат

Тогда уж скорее мотор "держит". Или управляющее ПО. Но не Холлы. laughing.gif
Lagman
Тут недавно была информация про плату https://www.terraelectronica.ru/news/4985?u...icroelectronics
Вот к ней почти все доступно и исходники и плата.
Можно посмотреть что и как реализовано.
jcxz
Цитата(Lagman @ Jun 9 2018, 17:24) *
Зачем дублировать одну и ту же информацию? Это же не робот у которого надо знать положение колесика.

Вы о чём? wacko.gif
Lagman
Цитата(jcxz @ Jun 9 2018, 18:04) *
Вы о чём? wacko.gif

О том что для удержания площадки гироскопа в горизонтальном положении не надо дополнительно никаких датчиков Холла, достаточно гироскопа на самой площадке, ведь там не важно 5 или 10 см он отъедет в сторону для самовыравнивания.
jcxz
Цитата(Lagman @ Jun 9 2018, 18:12) *
О том что для удержания площадки гироскопа в горизонтальном положении не надо дополнительно никаких датчиков Холла, достаточно гироскопа на самой площадке, ведь там не важно 5 или 10 см он отъедет в сторону для самовыравнивания.

Вы мне то это зачем пишете? Я разве писал, что д.Холла для определения наклона? Почитайте мои сообщения....
murmur
Может вы не будете спорить, а ответите мне про deadtime? Вопрос был на предыдущей странице в конце
jcxz
Цитата(murmur @ Jun 9 2018, 18:51) *
Может вы не будете спорить, а ответите мне про deadtime? Вопрос был на предыдущей странице в конце

Во-первых: у меня например это только первая страница. Размер страниц тут у всех свой. laughing.gif
А во-вторых: почему отсутствует? Вы на процедуру commutation() внимательно посмотрите. Где там верхний и нижний ключи пересекаются?
Lagman
Еще можете посмотреть исходники BLHeli https://github.com/bitdump/BLHeli , популярная открытая прошивка для регуляторов (авиа: дроны, вертолеты).
murmur
Что-то не получается у меня с ЭДС. Господа, взгляните на схему цепочки детектирования в статье в первом сообщении, на ту же схему, но выложенную мной в PDF и скажите, будет ли отличаться алгоритм работы с компаратором?
У меня ЭДС детектируется, прерывание срабатывает где надо (хотя впрочем, посмотрите на осциллограмму и оцените).
Но двигатель пищит и не стартует.

ОСЦИЛЛОГРАММА - красный график - вход компаратора, синий - строка PORTD.3=~PORTD.3 в самом начале обработчика прерывания от компаратора, чтобы понять, в какой момент времени он срабатывает.


Код (мне его пришлось переделать) привожу

Код
#include <mega8.h>
#include <delay.h>

// Фаза U(Верхнее плечо)
#define UH_ON   PORTD.4=1;
#define UH_OFF  PORTD.4=0;

// Фаза U(Нижнее плечо)
#define UL_ON   PORTD.5=1;
#define UL_OFF  PORTD.5=0;

// Фаза V(Верхнее плечо)
#define VH_ON   PORTC.5=1;
#define VH_OFF  PORTC.5=0;

// Фаза V(Нижнее плечо)
#define VL_ON   PORTC.4=1;
#define VL_OFF  PORTC.4=0;

// Фаза W(Верхнее плечо)
#define WH_ON   PORTC.3=1;
#define WH_OFF  PORTC.3=0;

// Фаза W(Нижнее плечо)
#define WL_ON   PORTB.0=1;
#define WL_OFF  PORTB.0=0;

#define PHASE_ALL_OFF   UH_OFF;UL_OFF;VH_OFF;VL_OFF;WH_OFF;WL_OFF;

#define SENSE_U     ADMUX = 6; // Вход обратной ЭДС фазы U
#define SENSE_V     ADMUX = 7; // Вход обратной ЭДС фазы V
#define SENSE_W     ADMUX = 0; // Вход обратной ЭДС фазы W

#define SENSE_UVW   (ACSR&(1 << ACO)) // Выход компаратора

#define START_PWM   10 // Минимальный ШИМ при запуске
#define WORK_PWM   100 // Рабочий уровень ШИМ

unsigned char start_stop = 0;
unsigned char current_phase = 0;
volatile unsigned char motor_pwm = WORK_PWM;
volatile unsigned char commutation_step = 0;
volatile unsigned char rotor_run = 0; // Счетчик импульсов обратной ЭДС

// Крутим по часовой стрелке
void commutation(unsigned char startup)
{
    switch (commutation_step)
    {
        case (0):
            if(!SENSE_UVW || startup)
            {
                UH_ON; // На фазе U - ШИМ
                WH_OFF; // Фаза W отключена
                SENSE_W; // Активируем вход фазы W
                commutation_step = 1; // Следующий шаг
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (1):
            if(SENSE_UVW || startup)
            {
                VL_OFF; // На фазе V - лог. 0
                WL_ON;  // На Фазе W - лог. 1
                SENSE_V; // Активируем вход фазы V
                commutation_step = 2;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (2):
            if(!SENSE_UVW || startup)
            {
                UH_OFF; // Фаза U отключена
                VH_ON;  // На фазе V - ШИМ    
                SENSE_U; // Активируем вход фазы U
                commutation_step = 3;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;
    
        case (3):
            if(SENSE_UVW || startup)
            {
                UL_ON;  // На фазе U - лог. 1
                WL_OFF; // На Фаза W - лог. 0
                SENSE_W; // Активируем вход фазы W
                commutation_step = 4;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

         case (4):
            if(!SENSE_UVW || startup)
            {
                VH_OFF;  // Фаза V отключена
                WH_ON;   // На фазе W - ШИМ
                SENSE_V; // Активируем вход фазы V
                commutation_step = 5;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (5):
            if(SENSE_UVW || startup)
            {
                UL_OFF; // На фазе U - лог. 0
                VL_ON;  // На Фазе V - лог. 1
                SENSE_U; // Активируем вход фазы U
                commutation_step = 0;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;
    }
}
// Обработчик прерывания по компаратору. Детектор обратной ЭДС


// Analog Comparator interrupt service routine
interrupt [ANA_COMP] void ana_comp_isr(void)
{
PORTD.3=~PORTD.3;
rotor_run++; // инкрементируем импульсы
if(rotor_run > 200) rotor_run = 200;
if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, крутим наполную
{

commutation(0);

}
}

// Обработчик прерывания по переполнению Т0. Работа двигателя без сигналов обратной ЭДС
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{  

commutation(1); // Если сработало прерывание, есть пропуски импульсов обратной ЭДС
rotor_run = 0;  // Сбрасываем счетчик импульсов

}

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
        
/*
// // ЭТО ПОПЫТКА СДЕЛАТЬ ПРОГРАМНМНЫЙ ШИМ, РАЗБЕРУСЬ ПОТОМ
   if (commutation_step==0) UH_ON;
   if (commutation_step==2) VH_ON;
   if (commutation_step==4) WH_ON;
  */
  
      
}

// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
        
// ЭТО ПОПЫТКА СДЕЛАТЬ ПРОГРАМНМНЫЙ ШИМ, РАЗБЕРУСЬ ПОТОМ
    /*
   if (commutation_step==0) UH_OFF;
   if (commutation_step==2) VH_OFF;
   if (commutation_step==4) WH_OFF;
   */  
}



void main(void)
{


// Порты ввода/вывода

DDRD.4=1; // UH
DDRD.5=1; // UL
DDRC.5=1; // VH
DDRC.4=1; // VL
DDRC.3=1; // WH
DDRB.0=1; // WL

DDRD.3=1;
PORTD.3=0;

/*
while(1)
{

PORTD.4=1; // UH
PORTD.5=0; // UL
PORTC.5=1; // VH
PORTC.4=0; // VL
PORTC.3=1; // WH
PORTB.0=0; // WL
delay_ms(10);

PORTD.4=0; // UH
PORTD.5=0; // UL
PORTC.5=0; // VH
PORTC.4=0; // VL
PORTC.3=0; // WH
PORTB.0=0; // WL
delay_ms(10);
  
}
  */
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
OCR2=20;

// T0 - для старта и работы двигателя без сигналов обратной ЭДС
TCCR0=0x05;

TIMSK |= (1 << TOIE0)| (1 << TOIE2)|(1 << OCIE2); // Разрешаем прерывание по переполнению T0

                                                                                      

PHASE_ALL_OFF; // Выключаем все фазы
    
// Аналаговый компаратор
ADCSRA &= ~(1 << ADEN); // Выключаем АЦП
SFIOR |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП
ACSR |= (1 << ACIE); // Разрешаем прерывания от компаратора

#asm("sei") // Глобально разрешаем прерывания

start_stop=1;

if(start_stop)
{

ACSR |= (1 << ACIE); // Разрешаем прерывание от компаратора
TIMSK |= (1 << TOIE0)| (1 << TOIE2)|(1 << OCIE2); // Разрешаем прерывание по переполнению T0
  
  
  if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, можем менять ШИМ
  {
   // OCR2=0x0F;
  }

}
else
{

PHASE_ALL_OFF; // Все фазы выключены
ACSR &= ~(1 << ACIE); // Запрещаем прерывание от компаратора
TIMSK &= ~(1 << TOIE0); // Запрещаем прерывание по переполнению T0

}

}

Lagman
А если помочь рукой прокрутить, стартует?
murmur
Не стартует.
К слову, ШИМ у меня сейчас пока нет, обмотки коммутируются максимальным током.
jcxz
Цитата(murmur @ Jun 10 2018, 17:16) *
Не стартует.

Попробуйте сначала коммутировать ключи с фиксированной частотой. 1 Гц например. Без всяких ADC.
murmur
Цитата
Попробуйте сначала коммутировать ключи с фиксированной частотой. 1 Гц например

Этот этап пройден. Работает, пыхтит, греется, но крутит.
jcxz
Цитата(murmur @ Jun 10 2018, 19:45) *
Этот этап пройден. Работает, пыхтит, греется, но крутит.

значит теперь смещайте угол пока не закрутится.
murmur
Поигралась с настройками - увеличила таймаут, по которому обычный режим переключается в режим с контролем ЭДС. Программа не дожидалась и сбрасывала сччетчик в ноль. И доходило до этого, в том числе, из-за отсутсвия ШИМ и инерции мотора. Сейчас заработало. Дергается, но через некоторое время раскручивается. Попробую реализовать программный ШИМ.

Мда... с ШИМом он почему-то вообще не стартует, только дергается.
Будем искать...

Цитата
значит теперь смещайте угол пока не закрутится.

Это что-то вроде угла опережения зажигания?

Где-то здесь задержку ставить надо?
Код
switch (commutation_step)
    {
        case (0):
            if(!SENSE_UVW || startup)
            {
                UH_ON; // На фазе U - ШИМ
                WH_OFF; // Фаза W отключена
                SENSE_W; // Активируем вход фазы W
                commutation_step = 1; // Следующий шаг
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (1):
            if(SENSE_UVW || startup)
            {
                VL_OFF; // На фазе V - лог. 0
                WL_ON;  // На Фазе W - лог. 1
                SENSE_V; // Активируем вход фазы V
                commutation_step = 2;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (2):
            if(!SENSE_UVW || startup)
            {
                UH_OFF; // Фаза U отключена
                VH_ON;  // На фазе V - ШИМ    
                SENSE_U; // Активируем вход фазы U
                commutation_step = 3;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;
    
        case (3):
            if(SENSE_UVW || startup)
            {
                UL_ON;  // На фазе U - лог. 1
                WL_OFF; // На Фаза W - лог. 0
                SENSE_W; // Активируем вход фазы W
                commutation_step = 4;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

         case (4):
            if(!SENSE_UVW || startup)
            {
                VH_OFF;  // Фаза V отключена
                WH_ON;   // На фазе W - ШИМ
                SENSE_V; // Активируем вход фазы V
                commutation_step = 5;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;

        case (5):
            if(SENSE_UVW || startup)
            {
                UL_OFF; // На фазе U - лог. 0
                VL_ON;  // На Фазе V - лог. 1
                SENSE_U; // Активируем вход фазы U
                commutation_step = 0;
                TCNT0 = 0; // Обнуляем счетчик T0
            }
            break;
    }
murmur
Все пока хорошо, но вот почему то запускается двигатель с дерганьем. Непредсказуемым по времени. Поможешь рукой - крутится.

Посмотрела на управляющие импульсы на фазах - они какие-то неодинаковые по ширине.
Что-то мне подсказывает, что сигнал обратной ЭДС кривой.
Посмотрите на эту ЭКГ - что с ней не так?
Herz
С ней всё не так. Вообще непонятно, что это: может, и вправду ЭКГ подопытного мышонка из ближайшей биолаборатории? Ни шкал, ни легенды, ни пояснений... Ток? ЭДС? Где снято, при каких условиях?
варп
Цитата(murmur @ Jun 11 2018, 01:30) *
.... но вот почему то запускается двигатель с дерганьем. Непредсказуемым по времени.

...именно в этом главный недостаток работы по сигналу ЭДС (в отличие от Холлов)... Ведь вот что происходит - при старте, вращение отсутствует, и сигнала ЭДС нет ВООБЩЕ..., а для уверенного старта, контроллер должен точно знать в каком положении ротор в ДАННЫЙ момент, чтобы подключить нужные фазы... А информации о положении ротора у контроллера нет... Вот контроллер и подключает СЛУЧАЙНЫМ образом фазы (или перебирает по очереди все шесть возможных комбинаций..., не знаю, как там реально программно организовано...), чтобы хоть как то заставить ротор вращаться и выдать сигнал ЭДС (очень слабый при старте, надо отметить...) и только потом станет ясно, в каком положении ротор, и в нужную ли сторону вращается...
jcxz
Цитата(murmur @ Jun 10 2018, 21:07) *
Это что-то вроде угла опережения зажигания?

Управление вашим двигателем сводится к одной простой вещи: "держать магнитное поле статора к магнитному полю ротора под 90 градусов!" И всё будет ок.
Под +90 или под -90 - в зависимости от требуемого направления вращения.
А значит: нужно знать угловое положение м.поля статора и м.поля ротора.
Для формирования поля статора у Вас есть ключи (грубое задание углового положения поля, с большой дискретностью - просто коммутацией; и более точное - с помощью ШИМ).
А для того, чтобы определить положение ротора (и его магнитного поля), используют датчики угла разных типов (д.Холла, ресольверы, синус-косинусные датчики, энкодеры и т.п.).
Также в самых дешёвых случаях используют бездатчиковое определение: по ЭДС на неиспользуемых обмотках. Естественно это и самый плохой случай. О недостатках полно инфы в инете.
Например хотя-бы то, что не завращав ротор (а без вращения не получить эту самую ЭДС) не получить и показаний угла. Да и на малых скоростях ЭДС мала и определять угол по ней сложно.
Наилучшие варианты: ресольвер или синус-косинусный датчик. Но дорого и громоздко.
Вот измерили Вы угловое положение поля ротора и можете задать угловое положение поля статора, но остаётся вопрос: каков угол между началом координат (точкой 0 градусов) статора и началом координат ротора? А они естественно обычно не совпадают. А чтобы выставить поле под 90 градусов эту угловую разницу нужно знать. Обычно её измеряют. Или задают конструктивно. Ну или в крайнем случае грубо можно определить методом тыка.
Вот про этот угол (угловую разницу) я и говорю. Обычно, когда я неверно выставлю этот угол, то у меня как раз такая картина и наблюдается: моторчик гудит, свистит, но не едет. Это если заданная угловая разница далека от истинной. Если ошибка не очень большая, то едет, но с гораздо бОльшим током по обмоткам (греется).
Примерно так.

Цитата(варп @ Jun 11 2018, 04:24) *
в отличие от Холлов

Не вводите в заблуждение! д.Холла - это всего лишь частный случай датчиков положения ротора. Не самый лучший кстати. Их много разных бывает.
AlexandrY
Цитата(jcxz @ Jun 11 2018, 08:37) *
Примерно так.

Вообще-то есть способы определения угла поворота ротора с помощью измерения напряжений даже в статическом состоянии.
Они описаны в апнотах у TI, Microchip, ST и прочих
Обратная ЭДС достаточная для синхронизации в модельных моторчиках возникает уже со второго импульса.
Надо только применять не компаратор, а АЦП этак на сотню килогерц.

Lagman
Цитата(AlexandrY @ Jun 11 2018, 08:57) *
Вообще-то есть способы определения угла поворота ротора с помощью измерения напряжений даже в статическом состоянии.
Они описаны в апнотах у TI, Microchip, ST и прочих
Обратная ЭДС достаточная для синхронизации в модельных моторчиках возникает уже со второго импульса.
Надо только применять не компаратор, а АЦП этак на сотню килогерц.

Речь про это документ?
SENSORLESS BLDC MOTOR CONTROL AND BEMF SAMPLING METHODS WITH ST7MC
AlexandrY
Цитата(Lagman @ Jun 11 2018, 11:45) *

Нет не это.
Что-то вроде этого - https://www.researchgate.net/publication/43...hless_DC_Drives
khach
Цитата(AlexandrY @ Jun 11 2018, 22:16) *

Измерять индуктивность обмоток в зависимости от углового положений ротора конечно можно, но только если нет никаких других возможностей определить начальное положение ротора. Да и калибровать надо под каждый двигатель. А в многополюсном двигателе угловая зависимость индуктивности вообще слабая очень.
Гораздо проше использовать датчики холла в аналоговом режиме. Кстати, нет ли где примеров такого кода, чтобы на удержании и низких оборотах использовались холлы аналогово, а на больших оборотах- через таймера. Интересует вопрос плавного перехода из первого режима во второй и отратно.

AlexandrY
Цитата(khach @ Jun 12 2018, 11:59) *
Измерять индуктивность обмоток в зависимости от углового положений ротора конечно можно, но только если нет никаких других возможностей определить начальное положение ротора. Да и калибровать надо под каждый двигатель. А в многополюсном двигателе угловая зависимость индуктивности вообще слабая очень.
Гораздо проше использовать датчики холла в аналоговом режиме. Кстати, нет ли где примеров такого кода, чтобы на удержании и низких оборотах использовались холлы аналогово, а на больших оборотах- через таймера. Интересует вопрос плавного перехода из первого режима во второй и отратно.

Бьюсь над похожей задачей.

В моторе стоят цифровые холлы, на плате управления цифровой магнитометр, который ловит поле от дверной петли.
Задача максимально плавно, бесшумно и с максимальным моментом закрывать и открывать дверь.
Пока ничего лучше чем слияние Калмана не придумал, но еще не реализовал.

Кстати в этом моторе 8-мь полюсов, но определение позиции ротора по индуктивности вполне четкое.
Калибровка не требуется ибо определение идет по разнице.
alexvu
Не касаясь особенностей ШИМ (я в этом не профи),
1) AlexandrY про дверь (извините, если не для этой темы) - лучше переделать систему рычагов так, чтобы в начале и в конце открывания двери тоже было максимальное передаточное число, т.е. медленный поворот двери при одинаковой скорости двигателя. А в середине открывания чтоб было побыстрее.
2) про вентиляторный момент: это когда нагрузка пропорциональна квадрату скорости. В частности, при 0 скорости и нагрузка почти 0. Поэтому авиа-мотор стартует как-нибудь без нагрузки, а потом уже и ЭДС появляется.
В автомобиле при 0 скорости момент максимальный, а при разгоне уменьшается. А также возможна длительная работа с низкими оборотами и большим моментом. Т.е. кое-как старт и низкие обороты нельзя реализовывать, а скорее всего, и двигатели нужны разные. И, например, может понадобиться отдельный вентилятор для охлаждения мотора на низких оборотах, когда собственная крыльчатка не вентилирует.
Herz
Цитата(alexvu @ Jun 13 2018, 21:28) *
Не касаясь особенностей ШИМ (я в этом не профи),
1) AlexandrY про дверь (извините, если не для этой темы) - лучше переделать систему рычагов так, чтобы в начале и в конце открывания двери тоже было максимальное передаточное число, т.е. медленный поворот двери при одинаковой скорости двигателя. А в середине открывания чтоб было побыстрее.

А у него так и есть, ИМХО.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.