|
Выбор AVR микроконтроллера для 5ти фазного ШИМ., Есть ли модели с 5 регистрами сравнения для одного таймера? |
|
|
|
Oct 25 2014, 16:32
|

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

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

Гуру
     
Группа: Модератор 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 берет клоки оттуда же Т.е. програмирование тут ерунда - главное сообразить, какие константы в регистры записать.
|
|
|
|
|
Oct 25 2014, 22:40
|

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

|
Цитата(Genadi Zawidowski @ Oct 26 2014, 02:05)  Я делал ШИМ на 16-ти (или менее) битах порта STM32. DMA было настроено на выдачу по таймеру из буфера в порт данных, которые ставили/сбрасывали нужные биты. Если исходник будет нужен, выложу здесь. А что? Хороша у вас идея. Сами придумали?  Впрочем, идея носится в воздухе, поскольку именно так проигрывают аудиофайлы. В самом деле, можно "проигрывать пластинку" в порт, чтобы получить в нем любую, заранее заданную, последовательность чередования бит. В том случае, если эта последовательность зациклена, а состояние порта меняется редко, метод, предложенный Genadi Zawidowski, действительно очень хорош. Кстати, если чередование фаз не такое уж быстрое (а если это мотор, то так оно и будет), то схему можно реализовать даже на прерываниях на какой-нибудь простенькой Тиньке, когда в процедуре прерывания циклически обходится массив, байты из которого копируются в порт. Когда-то я точно так же пыталась управлять шаговым двигателем, рассчитывая не на ШИМ, а на расписание переключения обмоток (ШИМом тогда еще пользоваться не умела).
|
|
|
|
|
Oct 26 2014, 08:20
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 26 2014, 11:25
|

Гуру
     
Группа: Модератор 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 и т.п.)", которые Сергей Борщ предложил, этот регистр есть. Оно как раз сделано для того, чтобы таймеры синхронизовать. Однако сама ни разу этим не пользовалась, т.к. не было в том необходимости.
|
|
|
|
|
Oct 26 2014, 12:17
|

Местный
  
Группа: Участник
Сообщений: 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, и снова гран мерси, Приятно так конкретно носом ткнули  . Сейчас по разным контроллерам пройдусь на предмет синхронизации таймеров.
Сообщение отредактировал -=TRO=- - Oct 26 2014, 12:29
|
|
|
|
|
Nov 2 2014, 14:21
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|