AVR444. Понять и простить.

Ответить
Сообщение
Автор
Аватара пользователя
mihaildub
Site Admin
Сообщения: 262
Зарегистрирован: 05 июн 2019 12:36
Контактная информация:

AVR444. Понять и простить.

#1 Сообщение mihaildub » 29 июн 2019 10:34

Когда у разработчика или увлекающегося радиолюбителя возникает желание сделать контроллер BLDC двигателя, что он предпринимает? Верно, читает эти ваши интернеты. А уж там, а там... В общем, эйфория подбрасывает кажущуюся очевидной мысль "Сейчас за полчаса под пиво запилю, че они там копаются годами, рукожопы? Хе-хе.". Чуть позже в очередной раз придет понимание, что Интернет - большая помойка, в которой от форума к форуму и от статьи к статье как под копирку перепечатываются очевидные вещи, перемежающиеся потоками воды Средиземного моря. Забегая вперед, скажу, что во Всемирной Сети мне не встречалось готовых решений с открытым исходным кодом, которые бы позволяли полноценно работать с BLDC двигателями. Те разработчики, кто познал Дзен в этом вопросе, молчат, как рыба об лед. И это правильно, труд от идеи до серийного образца они проделали колоссальный.
Теперь давайте обратим внимание на тот факт, что у большинства производителей микроконтроллеров есть соответствующие этой теме аппноты.
В частности, у бывшего Atmel наиболее известен AVR444: Управление трехфазным бесколлекторным электродвигателем постоянного тока без датчиков. Ознакомиться с русским переводом можно здесь.
Исходный код из статьи выше, который мы будем смотреть:
AVR444.zip
(81.91 КБ) 11 скачиваний
(UPD 16022020. Пофиксил битый архив.)
Постараюсь разобрать код и показать, что это поделие в его первичном виде неработоспособно в общем, не касаясь алгоритма коммутации и способа запуска двигателя. Эти вещи суть коммерческая тайна нашей разработки и не подлежат разглашению. Поехали.

1. Метод запуска BLDC двигателя, описанный в аппноте, построен на подборе времени каждого коммутационного шага экспериментально. Т.е. вы долго и нудно будете подбирать эти значения, на каком-то этапе добьетесь уверенного старта двигателя, но вдруг окажется, что изменение внешних условий приводит к невозможности запуска. Подключив другой двигатель (более или менее мощный, с другим количеством полюсов на статоре/роторе), вас также может ждать разочарование.

2. За токовую защиту отвечает микроконтроллер.
Любители пиротехнических эффектов с искрами и дымом будут рады. Особенно эффектно это выглядит при высоком (выпрямленном от сетевого) напряжении DC шины. Да, в микроконтроллере токовая защита заведена на компаратор, а не АЦП, но пока сработает прерывание и выполнится код в нем, отключать ключи уже поздно. Они пробиты, сожгли драйверы и прочие полупроводники. Тушите свет, кина не будет.

3. Системная частота и частота ШИМ.
Смотрим файл BLDC.h, находим такие строки:

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

//! System clock frequecy. Used to calculate PWM TOP value.
#define SYSTEM_FREQUENCY        8000000
//! PWM base frequency. Used to calculate PWM TOP value.
#define PWM_BASE_FREQUENCY      20000
Тактовая микроконтроллера 8 МГц, частота ШИМ 20 кГц (период 50 мкс). У вас не хватит процессорного времени для полноценной отработки прерываний, не говоря уже о фоновом коде. Увеличение тактовой чипа, уменьшение частоты ШИМ и правильная организация алгоритма решают вопрос, но при этом от кода AVR444 мало что останется.

4. Старт и ожидание конца преобразования АЦП по флагу в прерывании таймера.

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

#pragma vector=TIMER0_OVF_vect
__interrupt void MotorPWMBottom()
{
  unsigned char temp;
  // Disable ADC auto-triggering. This must be done here to avoid wrong channel being sampled on manual samples later.
  ADCSRA &= ~((1 << ADATE) | (1 << ADIE));
  // Wait for auto-triggered ADC sample to complete.
  while (!(ADCSRA & (1 << ADIF)))
  {
  }
 temp = ADCH;
Что здесь происходит? В переполнении ШИМ-таймера (середина импульса ШИМ) измеряется ЭДС на свободной фазе двигателя. Обращаю внимание, мы в обработчике прерывания. Пребывание в обработчике прерывания нужно стараться делать как можно более коротким. Однако, в коде использован "ручной" запуск АЦП с ожиданием конца преобразования по флагу! Это очень, нет, просто чудовищно долго. Это неправильно с точки зрения логики программы и здравого смысла. И потом люди, используя этот код, говорят, что АTmega - слабый чип и нужно переходить на 32-битный STM. Ну да, ну да.

В коде еще много интересных моментов. Предлагаю читателю найти их самостоятельно.
Спрашивайте свои ответы

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость