Easyelectronics.ru

Электроника для всех
Текущее время: 22 авг 2019, 08:11

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



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

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: STM32 phase-shift PWM
СообщениеДобавлено: 27 июн 2019, 17:36 
Только пришел

Зарегистрирован: 26 фев 2014, 13:41
Сообщения: 17
Добрый день.

Необходимо реализовать фазовую ШИМ для мостового инвертора.
В литературе вижу, что на STM32F103ZET6 реализовывают (в прикреплённых риснок).

Есть несколько примеров на которые я опирался:
1: https://community.st.com/s/question/0D50X00009XkhLaSAJ/stm32l4-pwm-phase-delay
и
2: http://we.easyelectronics.ru/_YS_/complementary-pwm-i-push-pull-rezhimy-na-taymere-1-kontrollerov-stm32.html

Помимо самой ШИМ в процессе роботы необходимо менять ее параметры: период, фазу и длительность импульса.
Также - в начале и посередине периода производить ряд дейтвий. (это пока на втором плане)

Опирался на первый пример, так как реализовать на втором примере 4и канала не понимаю.
Играюсь на отладочной плате STM32F103C8T6, могу реализовать 3 канала из четырех: использую один таймер как мастер для управления 3мя другими с заданными сдвижками и длительностями, период определяется мастером.
Для обновления параметров пытаюсь использовать прерывания по одному из таймеров: на одном канале все хорошо, на других нет.

В STM32 я не силен, использую CubeIDE, настраиваю периферию через CubeMX.

Если кто-то что-то может подсказать с реализацией буду признателен. А если с примером настройки в CubeMX - мой низкий поклон.

Часть кода:
Код:
  HAL_TIM_Base_Start_IT(&htim4);

  __HAL_TIM_SET_AUTORELOAD(&htim1, 10+4-1); //set slave pulse width
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 4 /*10+1=11*/); //set slave pulse offset
  __HAL_TIM_SET_AUTORELOAD(&htim3, 10+1-1); //set slave pulse width
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1 /*10+1=11*/); //set slave pulse offset
  __HAL_TIM_SET_AUTORELOAD(&htim4, 10+12-1); //set slave pulse width
  __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 12 /*10+1=11*/); //set slave pulse offset

  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);

  __HAL_TIM_SET_AUTORELOAD(&htim2, 21); //set master period
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1); //set slave pulse offset
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);


//     TIM1->CR1 |= TIM_CR1_ARPE;
//     TIM3->CR1 |= TIM_CR1_ARPE;
//     TIM4->CR1 |= TIM_CR1_ARPE;
   TIM2->CR1 |= TIM_CR1_ARPE;


в прерывание:

Код:
   HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
      if(step==0)
      {
      __HAL_TIM_SET_AUTORELOAD(&htim1, 10+4-1+5); //set slave pulse width
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 4+5 ); //set slave pulse offset
      __HAL_TIM_SET_AUTORELOAD(&htim3, 10+1-1+5); //set slave pulse width
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1+5 ); //set slave pulse offset
      __HAL_TIM_SET_AUTORELOAD(&htim4, 10+12+5-1); //set slave pulse width
      __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 12+5 ); //set slave pulse offset
      __HAL_TIM_SET_AUTORELOAD(&htim2, 21 ); //set master period
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1 ); //set slave pulse offset
      step=1;
      }
      else
      {
      __HAL_TIM_SET_AUTORELOAD(&htim1, 10+4-1+5); //set slave pulse width
      __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 4 ); //set slave pulse offset
      __HAL_TIM_SET_AUTORELOAD(&htim3, 10+1-1+5); //set slave pulse width
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1 ); //set slave pulse offset
      __HAL_TIM_SET_AUTORELOAD(&htim4, 10+12-1+5); //set slave pulse width
      __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 12+5 ); //set slave pulse offset
      __HAL_TIM_SET_AUTORELOAD(&htim2, 31 ); //set master period
      __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1 ); //set slave pulse offset
      step=0;
      }



С уважением.


Вложения:
2.png
2.png [ 47.47 Кб | Просмотров: 388 ]
1.png
1.png [ 62.36 Кб | Просмотров: 388 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 phase-shift PWM
СообщениеДобавлено: 11 июл 2019, 19:45 
Только пришел

Зарегистрирован: 26 фев 2014, 13:41
Сообщения: 17
Подниму тему, может будет кому-то интересно или полезно, а может кто-то еще подскажет полезное.

Данную задачу смог реализовать следующим образом:
1. Использовал один таймер (TIM1) и четыре его канала (PWM Generation).
2. Режим работы таймера - Center Aligned mode.
3. Режимы работы каналов: Assymetrical PWM, CH1 и CH2 PWM2 (первая "синфазная" пара без сдвижки), CH3 и CH4 PWM1 (вторая "синфазная" пара без сдвижки).
4. Изменение Частота-Фаза-Импульс-DeadTime происходят во время генерации прерывания от таймера TIM1. Изменение одного из параметров влечет за собой пересчет практически всех других.

Проверял работу на STM32H7.

Единственный минус такого подхода (не знаю как этого избежать) - при изменении частоты возникает несимметрия импульсов, что обусловлено работай таймер (счет вверх-вниз): изменение частоты удлиняет или укорачивает одну пару импульсов. (Необходимо использовать блокирующий конденсатор).

Если кто-то может подсказать как настроить DMA для обновления ARR и CCRx так чтобы обновление было пакетом, буду признателен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 phase-shift PWM
СообщениеДобавлено: 11 июл 2019, 20:15 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5616
DMA burst...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 phase-shift PWM
СообщениеДобавлено: 14 июл 2019, 18:36 
Только пришел

Зарегистрирован: 26 фев 2014, 13:41
Сообщения: 17
Спасибо! Походе самое оно, после отпуска попробую и отпишусь.


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

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


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

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


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

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

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