Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбор AVR микроконтроллера для 5ти фазного ШИМ.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
-=TRO=-
Хочу сделать контроллер для пятифазного моторчика BLDC. Имею опыт программирования только на ассемблере и вариациях бейсика для AVR. Програмно ШИМить как то не очень хочется. А процессоров которые могут синхронно пять аппаратных каналов ШИМ не встречал, так что бы от одного таймера пятью регистрами сравнения. Может я пропустил что нибудь, буду рад подсказке в сторону какого контроллера смотреть.
Xenia
Цитата(-=TRO=- @ Oct 25 2014, 19:58) *
А процессоров которые могут синхронно пять аппаратных каналов ШИМ не встречал, так что бы от одного таймера пятью регистрами сравнения. Может я пропустил что нибудь, буду рад подсказке в сторону какого контроллера смотреть.


У ATxmega на каждом таймере по 4 канала, но чтобы 5 было, такого у AVR не встречала.

Впрочем, можно сделать так, чтобы по срабатыванию канала одного таймера запускается другой таймер.
Например, 4-ый канал после своего срабатывания запускает другой таймер, который спустя какое-то время отработает 5-ую ступень уже своим каналом.
-=TRO=-
Жаль с ATxmega не знаком, по большому счету это не проблема. Однако я не совсем понял, зацепить таймеры можно будет аппаратно, или прийдется выныривать в программу по прерыванию в начале цикла ШИМ первого таймера чтобы сбросить и запустить второй таймер?
Xenia
Цитата(-=TRO=- @ Oct 25 2014, 23:12) *
Жаль с ATxmega не знаком, по большому счету это не проблема. Однако я не совсем понял, зацепить таймеры можно будет аппаратно, или прийдется выныривать в программу по прерыванию в начале цикла ШИМ первого таймера чтобы сбросить и запустить второй таймер?


Зацепить можно (и нужно) аппаратно, в том-то и дело. У Х-Мег есть, так называемая, система событий, позволяющая произвести коммутацию заранее, чтобы не использовать прерывания.

С точки зрения програмиста это делается просто - записать правильные биты в два регистра. Что на ассеблере сделать ничуть не сложнее, чем на С/С++.

Например, выберем 1-ый канал системы событий (их всего где-то 7 или 8):
EVSYS.CH1MUX = EVSYS_CHMUX_TCC0_CCA_gc; // это я так бит выставила
где:
EVSYS.CH1MUX - регистр системы событий, указующий откуда событие входит в канал
EVSYS_CHMUX_TCC_CCD_gc - константа из одного бита, указующая, что входящим событием является совпадение в канале D (4-ый) таймера C (таймеры имеют имена портов на которые могут генерировать ШИМ, на порту С их 2 штуки).
Знак равенства, т.к. вход будет только один.

TCC1.CTRLD = TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc; // это я так два бита выставила
где:
TCC1.CTRLD - регистр управления ДРУГИМ таймером (первый был TCC0, а этот TCC1).
TC_EVACT_RESTART_gc | TC_EVSEL_CH1_gc - константа из двух бит, указующая, что таймер надо перезапустить от 1-го канала системы событий.

Вот и всё. Теперь 4-ый (D) канал таймера TCC0 будет перезапускать таймер TCC1, на котором можно организовать свои ШИМы.

Тем не менее, тут есть определенная сложность с тем, что второй таймер станет считать до своего перезапуска. Поэтому я бы сделала чуть сложнее, но зато надежнее - задействовала 3 тамера:
3-ый таймер генерит тактовые импульсы в канал событий, а 1-ой и 2-ий таймеры от этого канала событий считают (инкрементируются).
После этого на 1-ом таймере организуете 4 ШИМа, а на 2-ем еще один. Хотя можно на 1-ом организовать 3 ШИМа, а на 2-ом остальные 2. Оно без разницы - лишь бы в сумме было 5.
При этом 3-ий таймер можно использовать как регулятор скорости, поскольку только от его темпа будет зависеть скорость работы ШИМ-генерирующих таймеров. При этом ковырять уровни сравнения не потребуется.
Получится что-то примерно такое:
EVSYS.CH1MUX = EVSYS_CHMUX_TCD0_CCA_gc; // таймер D0 подает импульсы в 1-ый канал системы событий
TCC0.CTRLA = TC_EVSEL_CH1_gc; // таймер C0 берет клоки из 1-ого канала системы событий
TCC1.CTRLA = TC_EVSEL_CH1_gc; // таймер C1 берет клоки оттуда же

Т.е. програмирование тут ерунда - главное сообразить, какие константы в регистры записать. sm.gif
Genadi Zawidowski
Цитата(-=TRO=- @ Oct 25 2014, 19:58) *
буду рад подсказке в сторону какого контроллера смотреть.

Я делал ШИМ на 16-ти (или менее) битах порта STM32. DMA было настроено на выдачу по таймеру из буфера в порт данных, которые ставили/сбрасывали нужные биты. Если исходник будет нужен, выложу здесь.
Xenia
Цитата(Genadi Zawidowski @ Oct 26 2014, 02:05) *
Я делал ШИМ на 16-ти (или менее) битах порта STM32. DMA было настроено на выдачу по таймеру из буфера в порт данных, которые ставили/сбрасывали нужные биты. Если исходник будет нужен, выложу здесь.


А что? Хороша у вас идея. Сами придумали? sm.gif Впрочем, идея носится в воздухе, поскольку именно так проигрывают аудиофайлы.

В самом деле, можно "проигрывать пластинку" в порт, чтобы получить в нем любую, заранее заданную, последовательность чередования бит. В том случае, если эта последовательность зациклена, а состояние порта меняется редко, метод, предложенный Genadi Zawidowski, действительно очень хорош.

Кстати, если чередование фаз не такое уж быстрое (а если это мотор, то так оно и будет), то схему можно реализовать даже на прерываниях на какой-нибудь простенькой Тиньке, когда в процедуре прерывания циклически обходится массив, байты из которого копируются в порт. Когда-то я точно так же пыталась управлять шаговым двигателем, рассчитывая не на ШИМ, а на расписание переключения обмоток (ШИМом тогда еще пользоваться не умела).
Егоров
Самый эффективный путь создания пятифазного контроллера - сделать шестифазный или даже N-фазный. Причем, на самом плохом МК.
Тогда останется только убрать лишнее.
Сергей Борщ
В самом обычном "двухзначном" AVR (88 и т.п.) есть три таймера по 2 канала ШИМ на каждом. Там есть возможность запустить все три таймера одновременно, тогда все ШИМы будут работать абсолютно синфазно.
-=TRO=-
Цитата(Сергей Борщ @ Oct 26 2014, 03:03) *
В самом обычном "двухзначном" AVR (88 и т.п.) есть три таймера по 2 канала ШИМ на каждом. Там есть возможность запустить все три таймера одновременно, тогда все ШИМы будут работать абсолютно синфазно.


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


Электрическая частота коммутации фаз у меня будет не более 250Гц (полный период, реально в 10 раз чаще), на борту есть датчики холла по которым и прийдется менять фазы ШИМ, причем хотелось бы по периоду переключения холлов предсказывать длину следующего периода и выдергивать из таблицы участки синуса для каждой из фазы, и не просто выплевывать их в ШИМ, а сравнивать с датчиком тока фазы и ПИД регулировать (думаю сначала попробовать простым пропорционалом отделатся).

Всем спасибо.

Xenia вам отдельное мерси, за очень подробный и понятный ликбез, как начну таймеры в даташите разбирать в икс-меге, буду ваш текст перечитывать как шпаргалку.
Herz
А что, действительно существуют пятифазные двигатели? Не знал. Хотелось бы взглянуть.
Xenia
Цитата(-=TRO=- @ Oct 26 2014, 11:20) *
Спасибо, я как раз боялся что синфазно работать небудет. Как раз вычитал что пределитель таймеров можно останавливать и запускать чтобы таймеры стартовали одновременно (а то наверно пока настройки для второго вобьёшь, то первый уже убежать успеет).


Для этой цели бывает специальный регистр:
GTCCR – General Timer/Counter Control Register,
а в нем
Bit 7 – TSM: Timer/Counter Synchronization Mode
У "AVR (88 и т.п.)", которые Сергей Борщ предложил, этот регистр есть.
Оно как раз сделано для того, чтобы таймеры синхронизовать.
Однако сама ни разу этим не пользовалась, т.к. не было в том необходимости.
-=TRO=-
Цитата(Herz @ Oct 26 2014, 12:43) *
А что, действительно существуют пятифазные двигатели? Не знал. Хотелось бы взглянуть.

Вот ссылочка: http://www.falcoemotors.com/?page_id=1413


Цитата
Advanced 5 phase Motor Technology


Сначала думал что может получится в трехфазный перемотать, но 25 зубов с катушками только на 5 делятся.
Если интересно могу сфотать обмотки и датчики холла. Контроллер уже выпаял и унес на работу, там рулит всем какой то STM. Думаю использовать силовую часть платы. И усилители с шунтов фаз на операционниках от АналогДевайс, феты 10шт. IRFB3306 (3.3 мОм, 120А корпус, 160А кристалл), драйвера еще не смотрел на чем, но тут в силе и датчиках хоть заменить сгоревшее можно (если есть такое), а чё там было у проца на уме, сам черт теперь не разберет.


Xenia, и снова гран мерси, Приятно так конкретно носом ткнули a14.gif . Сейчас по разным контроллерам пройдусь на предмет синхронизации таймеров.
Herz
Цитата(-=TRO=- @ Oct 26 2014, 14:17) *

Спасибо, буду знать. Немного удивительно это количество фаз.
-=TRO=-
Маленький миниотчет. Эксперименты ставил в BASCOM-AVR.
Сконфигурировал оба таймера меги128 на двухпроходный ШИМ, записал в регистры сравнения числа, и стал в протеусе глядеть осцилограмки. Воочию виден рассинхрон около 32 тактов таймера (если считать что весть двухпроходный период 512 тактов). Поменял местами строки конфигурирования таймеров и увидел такой же рассинхрон в другую сторону. очевидно что конфигурация с запуском таймера в BASCOM-AVR длится целых 32 такта. Перед тем как опускатся до прямого редактирования регистров управления таймерами, решил после строки конфигурации таймер останавливать, а потом после того как они сконфигурированы оба в той же последовательности запустить. И о чудо, таймера пошли ноздря в ноздрю. (для проверки попробовал запустить таймеры не в той последовательности в которой останавливал, и снова рассинхрон, но уже всего в 2 такта). Итого имеем 6 каналов работающих синхронно без низкоуровневых плясок с конфигурационными регистрами. Осталось проверить в железе.

Результирующий рабочий код:
Код
$regfile = "m128def.dat"
$crystal = 8000000

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up , Prescale = 1
Config Portb = Output
Stop Timer1

Config Timer3 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Compare C Pwm = Clear Up , Prescale = 1
Config Porte = Output
Stop Timer3

Start Timer1
Start Timer3

Compare3a = 32
Compare3b = 1
Compare3c = 96

Compare1a = 132
Compare1b = 1
Compare1c = 196

Do

Loop

End


Авось кому сгодится.
Сергей Борщ
Цитата(-=TRO=- @ Nov 2 2014, 16:21) *
Итого имеем 6 каналов работающих синхронно без низкоуровневых плясок с конфигурационными регистрами.
Наоборот, имеем пляски с симулятором и шаманство вместо двух тупых записей в специально предназначенный для этого регистр. Впрочем, каждый сам себе злобный.
nordnative
Ретроспективно замечу, что есть микроконтроллер, который хорошо подошел бы под данную задачу.
Silicon Labs C8051F120 имеет на борту 16-разрядный Programmable Counter Array (PCA) с 6-ю модулями захвата/сравнения и ассоциированными с ними пинами. В наборе режимов PCA есть и ШИМ, правда, без мертвых зон.

C8051F120 - доработанная и разогнанная архитектура С51. Конвеер инструкций (большинство инструкций выполняются за 1-2 такта), тактовая частота до 100 МГц (PLL), производительность до 100 MIPS, 16х16 МАС за 2 такта. Как-то пришлось на этом микроконтроллере управлять ассинхронным двигателем 30 кВт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.