Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 07:40

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 25 ] 
Автор Сообщение
 Заголовок сообщения: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 22 июл 2016, 21:22 
Старожил

Зарегистрирован: 19 мар 2010, 13:24
Сообщения: 352
Добрый вечер

Разжуйте пожалуйста следующую тему.
На STM32F407 на TIM1 сделал генерацию 3 фазного шима. Все работает. Сейчас надо чтобы из таблички через DMA выводились значения для генерации шима.

Меня ни как не отпускают два вопроса:
1. Как каждый (из трех) канал TIM1 сдвинуть относительно друг друга на 120 градусов, при условии что табличка синусов у нас одна.
2. Как шим в каждом канале регулировать по аплитуде не меняя таблицу синусов ?

Если делать программно одновление таймеров тогда на кой черт DMA, а как сделать синус совсем аппаратным не понимаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 22 июл 2016, 21:36 
Старожил
Аватара пользователя

Зарегистрирован: 28 мар 2012, 10:33
Сообщения: 1198
Откуда: Сочи
pndr_soft писал(а):
Добрый вечер

Разжуйте пожалуйста следующую тему.
На STM32F407 на TIM1 сделал генерацию 3 фазного шима. Все работает. Сейчас надо чтобы из таблички через DMA выводились значения для генерации шима.

Меня ни как не отпускают два вопроса:
1. Как каждый (из трех) канал TIM1 сдвинуть относительно друг друга на 120 градусов, при условии что табличка синусов у нас одна.
2. Как шим в каждом канале регулировать по аплитуде не меняя таблицу синусов ?

Если делать программно одновление таймеров тогда на кой черт DMA, а как сделать синус совсем аппаратным не понимаю.


На каждое обновление нужно загружать 3 значения - по одному в каждый канал таймера.
Если, например, в таблице 360 значений и текущий шаг ==0, то в 1 канал - значение 0 ячейки, во 2-й канал - 120-й, в 3-й - 240.
Как это сделать - не знаю, вам нужно найти оптимальный вариант. Как я понял, есть несколько путей.
Нужно ли тут задействовать DMA (в смысле, будет ли выигрыш по производительности), я не знаю.

В принципе, если переполнение таймера пинает 3 канала DMA на загрузку данных, а прерывание по окончанию передачи DMA производит расчет нового значения адресов для DMA, может и получится.

Регулировать амплитуду можно, если период шим заведомо больше максимального заполнения.
Тогда перед загрузкойв регистры таймера все три значения из таблицы можно умножить на коэффициент, который увеличит или уменьшит заполнение.
В течение всего периода синуса коэффициент не менять.

Все вышесказанное - исключительно мои мысли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 22 июл 2016, 21:46 
Старожил

Зарегистрирован: 19 мар 2010, 13:24
Сообщения: 352
Хочется всей этой программной обработки избежать.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 22 июл 2016, 22:40 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Да легко - делаете на 3х выходе только синусный переключатель (фазы 1-2-3), а запитываете эти переключаемые фазы от отдельного StepDown. Регулировкой (статичной) PWM на нём выставляется напряжение питания мотора.
Одновременно 3 канала можно управлять так-же, как и 1. Т.е. через 3 канала DMA писать в TIMx_CCRx. Для каждого свой фазовый сдвиг. Дабы не плодить несколько таблиц синуса, можно =одну= таблицу удвоить и в ней указывать разное начало смещения начала для разных фаз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 23 июл 2016, 00:00 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 742
pndr_soft писал(а):
На STM32F407 на TIM1 сделал генерацию 3 фазного шима. Все работает. Сейчас надо чтобы из таблички через DMA выводились значения для генерации шима.


Для реального двигателя повышать частоту шима выше десятков килогерц - означает в пустую греть медь и железо. Для 407 доступна математика, в том числе и в прерывании - можно высчитывать и заполнять новые значения шима в последней точке. Будет задержка новых значений на один полный период шима, с инертностью механики это не столь существенно. Кстати, обойти эту задержку очень сложно даже с применением дма - придётся ограничивать максимальные значения, а значит снижать мах мощу движка. Непрогразируемое изменение механической нагрузки на двигатель - делает не актуальным ранее просчитанную фазу и напряжение выхлопа шима, и как следствие применение железного дма.

И того, достаточно 1/4 синуса - всё остальное математика.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 23 июл 2016, 00:27 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 679
1) генерируем таблицу синуса
допусти максимально открытый ШИМ 100 дискретность в 1 градус запускаем цикл от 1 до 90 градусов синус, результат умножаем на 100 и складываем р ячейки от 0 до 90 потом копируем значения в обратном порядке в ячейки от 90-180 потом инвертируем значение ШИМ (значение син не 1 а 0) в ячейки от 180-360 в ПДП настраиваем кольцевой буфер на 360 элементов но 1-вый начинается с 0 2-ой с 120 ячейки 3-тий с 240 ячейки
2) изменение амплитуды
изменяем коэффициент умножения со 100 на 80 и максимальная амплитуда будет 80%


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 23 июл 2016, 01:24 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1444
RM0090, стр. 644

Example of how to use the DMA burst feature

In this example the timer DMA burst feature is used to update the contents of the CCRx registers (x = 2, 3, 4) with the DMA transferring half words into the CCRx registers.
This is done in the following steps:
1. Configure the corresponding DMA channel as follows:
– DMA channel peripheral address is the DMAR register address
– DMA channel memory address is the address of the buffer in the RAM containing the data to be transferred by DMA into CCRx registers.
– Number of data to transfer = 3 (See note below).
– Circular mode disabled.
2. Configure the DCR register by configuring the DBA and DBL bit fields as follows:
DBL = 3 transfers, DBA = 0xE.
3. Enable the TIMx update DMA request (set the UDE bit in the DIER register).
4. Enable TIMx
5. Enable the DMA channel

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 23 июл 2016, 01:46 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Здесь есть один маленький пустячек. Сущая мелочь - при данном способе управления возможна только полное переключение 0/Vdd по фазам. А это означает удвоение ВЧ составляющей в 2 раза, по сравнению с коммутацией z/Vdd(0).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 24 июл 2016, 17:55 
Старожил

Зарегистрирован: 19 мар 2010, 13:24
Сообщения: 352
u37 писал(а):
Здесь есть один маленький пустячек. Сущая мелочь - при данном способе управления возможна только полное переключение 0/Vdd по фазам. А это означает удвоение ВЧ составляющей в 2 раза, по сравнению с коммутацией z/Vdd(0).


Я не понял вашу мысль. Можете как-то по другому сказать ? Что есть z ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 24 июл 2016, 18:02 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Есть два способа установки напряжения на "фазе" - либо попеременно выдавать 0/Vdd ключами, либо подключать только один из уровней (0 или Vdd), в зависимости от необходимой величины на выходе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 24 июл 2016, 18:52 
Старожил

Зарегистрирован: 19 мар 2010, 13:24
Сообщения: 352
u37 писал(а):
Есть два способа установки напряжения на "фазе" - либо попеременно выдавать 0/Vdd ключами, либо подключать только один из уровней (0 или Vdd), в зависимости от необходимой величины на выходе.


Понял. А если практически смотреть ? На сколько это важно ? Предела перфекционизма не существует ....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 24 июл 2016, 19:15 
Старожил
Аватара пользователя

Зарегистрирован: 28 мар 2012, 10:33
Сообщения: 1198
Откуда: Сочи
pndr_soft писал(а):
u37 писал(а):
Есть два способа установки напряжения на "фазе" - либо попеременно выдавать 0/Vdd ключами, либо подключать только один из уровней (0 или Vdd), в зависимости от необходимой величины на выходе.


Понял. А если практически смотреть ? На сколько это важно ? Предела перфекционизма не существует ....

Практически, все равно нужно ставить диод от земли к (индуктивной) нагрузке, через который потечет ток, который вызовет нагрев диода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 07 авг 2018, 16:13 
Здравствуйте!

Зарегистрирован: 07 авг 2018, 16:03
Сообщения: 1
Решение очень простое.
На самом деле, весь массив из синусов содержит 127 * 2. То есть положительный период и отрицательный период.
Не будем обращать внимание на размерность, вы сделали его в 2 раза больше - пускай.
Разделение на 3 фазы делается просто, делим массив на 3 части.
1-я фаза - начало с 0
2-я фаза 1/3 вашего массива
3-я фаза 2/3 вашего массива.
У меня весь массив занял 126 байт, начиная с нулевого и заканчивая 126 включительно.
Разделив мой массив на 3 я получил значения 42.
По моему принципу и как у меня все работает -
1 прерывание от таймера, который непосредственно задает частоту вашего частотника, ну пускай 50 герц. Теперь, что бы все работало правильно 50*127 - истинная частота, которая нужна.
И каждое прерывание от этого таймера инкрементируем значение указателя на массив синусов:
index_pwm1++;
index_pwm2 = index_pwm1 + 42;
index_pwm3 = index_pwm2 + 42;
А у конце делаем проверку, если значение index больше максимального объема массива - начинаем отсчет с начала для каждой фазы.
Я это сделал так:

#define max_pwm 126

uint8_t index_pwm1 = 0;
uint8_t index_pwm2 = 42;
uint8_t index_pwm3 = 84;


В прерывании таймера:


void get_index_pwm(void){
if (index_pwm1 < max_pwm) index_pwm1++;
else index_pwm1 = 0;
if (index_pwm2 < max_pwm) index_pwm2++;
else index_pwm2 = 0;
if (index_pwm3 < max_pwm) index_pwm3++;
else index_pwm3 = 0;
}

далее просто подставляем каждому из регистров PWM соответствующее число из массива.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 07 авг 2018, 18:49 
Заглядывает иногда

Зарегистрирован: 02 май 2017, 18:54
Сообщения: 199
Да, т.к. нагрузка индуктивная, то не забыть про реактивную составляющую.
Готовый частотник не дешевле обойдется?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 07 авг 2018, 22:07 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 543
На f407 столько всего можно успеть сделать, что генерация синуса и 1% от этого не займет. Какая у вас частота? Может и не нужно ни таблицу ни dma.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 08 авг 2018, 11:13 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
Тема стартанула в 2016 году :))) топикстартер уже навряд ли ответит, он последний раз тут был в марте 18-го.
Для "совсем аппаратного синуса" не нужны никакие прерывания. Обращаемся к возможностям DMA-загрузки значений CCRx таймера. Для этого у таймера, там, в конце, есть регистры DMAR и DCR. vt340 уже всё объяснил еще два года назад!
Второй таймер нужен для периодического запуска DMA и загрузки новых значений CCRx. Таким образом формируется синусоида. Да и не только синусоида, но и любые другие периодические сигналы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 08 авг 2018, 13:03 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1444
И заметь, как тогда никто не понял, так и сейчас никто не читал
Стоило ли объяснять
Сейчас я уже понимаю, что не стоило, тогда не понимал

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 08 авг 2018, 13:10 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
vt340 писал(а):
И заметь, как тогда никто не понял, так и сейчас никто не читал
Стоило ли объяснять
Сейчас я уже понимаю, что не стоило, тогда не понимал

Это ты зря так, я ковырялся чисто из любопытства тогда, пытался сформировать синус, а тут как раз эта тема была, так что не пропал твой комент :)
Объяснять стоило )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 08 авг 2018, 13:40 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1444
Да ты бы и сам нашёл и разобрался )
Это раз
А во-вторых, от безмолвного просветления чьих-то мозгов лично мне ни жарко, ни холодно
Если б ты потестил, может нашёл какие-то грабли, или наоборот не нашёл и отписался бы об этом, был бы профит )

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 08 авг 2018, 13:46 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Нашел бы, конечно, но тогда так видимо быстрее получилось.
Но, лучше позже чем никогда, так что за наводку спасибо, а про грабли уже и не помню, вроде как разобрался что к чему, устройство никакое не делал, чисто из академических целей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 27 сен 2018, 01:25 
Здравствуйте!

Зарегистрирован: 12 дек 2016, 21:28
Сообщения: 3
Чтобы сместить на 120 градусов фазы, передавая указатель на адрес памяти, откуда DMA будет брать значения для регистра сравнения, для первого канала указываете адрес на первый элемент массива, для второго канала на элемент массива, порядковый номер которого будет треть от общего числа, для третьего, соответственно, две трети. Иными словами, DMA в первый канал загрузит первый элемент, во второй с 1/3 массива начнет класть, а в третий 2/3.

uint16_t pData[9] = {0, 100, 200, 300, 400, 500, 600, 700, 800}; //значения просто для примера
Адрес для первого канала DMA = (uint32_t * ) pData; // или (uint32_t *) &pData[0];
Для второго (uint32_t *) &pData[3];
Для третьего (uint32_t *) &pData[6];

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 27 сен 2018, 09:07 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Для этого нужен всего один таймер и всего один канал DMA...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 30 сен 2018, 01:07 
Здравствуйте!

Зарегистрирован: 12 дек 2016, 21:28
Сообщения: 3
Три канала, это чисто для более наглядного понимания. Вообще, эти красавчики реализовали пересылку через теневой регистр и с одновременным защелкиванием во все три канала при обнулении счётчика.
Но контроллер, пересылая в каналы через теневой регистр, будет брать из массива сразу три значения, получается и массив нужно организовывать соответствующим образом. Ну, или если это просто DDS генератор и ничего больше, то пойдет и через три канала.
А вообще я ни на одном из сайтов не видел ПОЛНОСТЬЮ готовый рабочий код трехфазного шим с использованием ДМА, не говоря уже о burst feature. Везде есть либо только вопросы, либо косяки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 30 сен 2018, 11:24 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Так уж и нигде http://mcu.goodboard.ru/viewtopic.php?id=31


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32 3phase dma Регулировка напряжения
СообщениеДобавлено: 16 сен 2019, 15:50 
Только пришел

Зарегистрирован: 25 мар 2016, 04:20
Сообщения: 20
Подниму тему, так как ответа так и не нашёл... Если использовать DMA burst для загрузки значения CCR регистров как при этом менять амплитуду сигнала? Пересчитывать весь массив? И частоту синусоиды как менять, прескалером?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ] 

Часовой пояс: UTC + 5 часов


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB