реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Выбор AVR микроконтроллера для 5ти фазного ШИМ., Есть ли модели с 5 регистрами сравнения для одного таймера?
-=TRO=-
сообщение Oct 25 2014, 15:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



Хочу сделать контроллер для пятифазного моторчика BLDC. Имею опыт программирования только на ассемблере и вариациях бейсика для AVR. Програмно ШИМить как то не очень хочется. А процессоров которые могут синхронно пять аппаратных каналов ШИМ не встречал, так что бы от одного таймера пятью регистрами сравнения. Может я пропустил что нибудь, буду рад подсказке в сторону какого контроллера смотреть.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 25 2014, 16:32
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(-=TRO=- @ Oct 25 2014, 19:58) *
А процессоров которые могут синхронно пять аппаратных каналов ШИМ не встречал, так что бы от одного таймера пятью регистрами сравнения. Может я пропустил что нибудь, буду рад подсказке в сторону какого контроллера смотреть.


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

Впрочем, можно сделать так, чтобы по срабатыванию канала одного таймера запускается другой таймер.
Например, 4-ый канал после своего срабатывания запускает другой таймер, который спустя какое-то время отработает 5-ую ступень уже своим каналом.
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Oct 25 2014, 19:12
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



Жаль с ATxmega не знаком, по большому счету это не проблема. Однако я не совсем понял, зацепить таймеры можно будет аппаратно, или прийдется выныривать в программу по прерыванию в начале цикла ШИМ первого таймера чтобы сбросить и запустить второй таймер?

Сообщение отредактировал -=TRO=- - Oct 25 2014, 20:07
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 25 2014, 21:55
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(-=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
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 25 2014, 22:05
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

Я делал ШИМ на 16-ти (или менее) битах порта STM32. DMA было настроено на выдачу по таймеру из буфера в порт данных, которые ставили/сбрасывали нужные биты. Если исходник будет нужен, выложу здесь.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 25 2014, 22:40
Сообщение #6


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



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


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

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

Кстати, если чередование фаз не такое уж быстрое (а если это мотор, то так оно и будет), то схему можно реализовать даже на прерываниях на какой-нибудь простенькой Тиньке, когда в процедуре прерывания циклически обходится массив, байты из которого копируются в порт. Когда-то я точно так же пыталась управлять шаговым двигателем, рассчитывая не на ШИМ, а на расписание переключения обмоток (ШИМом тогда еще пользоваться не умела).
Go to the top of the page
 
+Quote Post
Егоров
сообщение Oct 25 2014, 23:20
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 3 868
Регистрация: 15-03-13
Пользователь №: 76 048



Самый эффективный путь создания пятифазного контроллера - сделать шестифазный или даже N-фазный. Причем, на самом плохом МК.
Тогда останется только убрать лишнее.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 26 2014, 00:03
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



В самом обычном "двухзначном" AVR (88 и т.п.) есть три таймера по 2 канала ШИМ на каждом. Там есть возможность запустить все три таймера одновременно, тогда все ШИМы будут работать абсолютно синфазно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Oct 26 2014, 08:20
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



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


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


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

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

Xenia вам отдельное мерси, за очень подробный и понятный ликбез, как начну таймеры в даташите разбирать в икс-меге, буду ваш текст перечитывать как шпаргалку.

Сообщение отредактировал -=TRO=- - Oct 26 2014, 08:58
Go to the top of the page
 
+Quote Post
Herz
сообщение Oct 26 2014, 09:43
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



А что, действительно существуют пятифазные двигатели? Не знал. Хотелось бы взглянуть.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 26 2014, 11:25
Сообщение #11


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



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


Для этой цели бывает специальный регистр:
GTCCR – General Timer/Counter Control Register,
а в нем
Bit 7 – TSM: Timer/Counter Synchronization Mode
У "AVR (88 и т.п.)", которые Сергей Борщ предложил, этот регистр есть.
Оно как раз сделано для того, чтобы таймеры синхронизовать.
Однако сама ни разу этим не пользовалась, т.к. не было в том необходимости.
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Oct 26 2014, 12:17
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



Цитата(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 . Сейчас по разным контроллерам пройдусь на предмет синхронизации таймеров.

Сообщение отредактировал -=TRO=- - Oct 26 2014, 12:29
Go to the top of the page
 
+Quote Post
Herz
сообщение Oct 26 2014, 12:47
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(-=TRO=- @ Oct 26 2014, 14:17) *

Спасибо, буду знать. Немного удивительно это количество фаз.
Go to the top of the page
 
+Quote Post
-=TRO=-
сообщение Nov 2 2014, 14:21
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 24-10-07
Из: zp.ua
Пользователь №: 31 690



Маленький миниотчет. Эксперименты ставил в 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, 14:27
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 2 2014, 16:01
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(-=TRO=- @ Nov 2 2014, 16:21) *
Итого имеем 6 каналов работающих синхронно без низкоуровневых плясок с конфигурационными регистрами.
Наоборот, имеем пляски с симулятором и шаманство вместо двух тупых записей в специально предназначенный для этого регистр. Впрочем, каждый сам себе злобный.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 09:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016