Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/24: Рейтинг темы: голосов - 24, средняя оценка - 4.83
MoxymS
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52
1

программный PWM на HAL

02.06.2016, 12:57. Просмотров 4740. Ответов 9
Метки нет (Все метки)

Добрый день.
Уже второй день бьюсь над реализацией программного ШИМ. Рекомендовали для этих целей использовать таймер и два прерывания. Как я понял, один для периода(с ним все просто), а второе для скважности(думал использовать прерывание по сравнению). Проект настраиваю в STM32Cube. Когда в настройке канала выбираю режим "Output Compare CHx" по данному видео уроку, то получаю второе прерывание для скважности. Проблема заключается в том, что при такой настройке задействованы пины привязанные к каналам таймера. Надо получить второе прерывание, не используя привязанных пинов. Тогда можно будет использовать конструкцию:
*Пины в коде для примера
Код
void TIM2_IRQHomdler (void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_UPdate) != RESIT)
{
TIM_ClearITPendingByt(TIM2, TIM_IT_UPdate)
GPIO_SetByts(GPIOD, GPIO_Pin_15);

}
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESIT)
{
TIM_ClearITPendingByt(TIM2, TIM_IT_CC1)
GPIO_RisetByts(GPIOD, GPIO_Pin_15);
}
Показался подходящим режим настройки каналов "Output Compare No Output". Но не смог получить второго прерывания. Включал его через HAL_TIM_OC_Start(&htime2, TIM_CHANAL_1);

Может не туда копаю?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2016, 12:57
Ответы с готовыми решениями:

PWM на TIM1
Всем доброго времени суток. Ранее реализовывал ШИМ на тайпере 4 и все...

stm32f030f4p6 ШИМ (PWM)
Столкнулся с проблемой. Не работает ШИМ. Возможно я ЧДНТ. Контроллер:...

генератор PWM синала
Добрый день! Делаю себе генератор PWM на на отладочной плате STM32F103C8t6...

STM32F4 PWM Input
Пытаюсь захватить сигнал с IR датчика с помощью таймера в режиме PWM Input....

STM32F2 PWM синус
Требуется собрать преобразователь 230В 50Гц в 115В 60Гц. Т.е. преобразователь...

9
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
02.06.2016, 13:05 2
Спуститесь на землю... к референсу и регистрам... ничего сложного там нет...
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
02.06.2016, 13:19 3
HAL_TIM_OC_Start_IT(TIM_HomdleTypeDef *htim, uint32_t Channel)
0
MoxymS
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52
02.06.2016, 13:48 4
Цитата Сообщение от dork_usir
Спуститесь на землю... к референсу и регистрам... ничего сложного там нет...
В регистрах не силен, раньше писал на stdperiph. В HAL привлекает возможность легкой настройки периферии, таких как USB, что с трудом поддавалось на stdperiph.

Цитата Сообщение от Stiit.mi
HAL_TIM_OC_Start_IT(TIM_HomdleTypeDef *htim, uint32_t Channel)
Спасибо!
Можно пролить свет, чем отличается HAL_TIM_OC_Start_IT от используемой мною HAL_TIM_OC_Start ??? Хочется понять принципиальные отличия.
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
02.06.2016, 14:03 5
Так код же открытый, все можно посмотреть (повыкидывал лишнее, разницу видно):

Код
HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HomdleTypeDef *htim, uint32_t Channel)
{
...
/* Enable the Output sompare channel */
TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
...
/* Enable the Peripheral */
__HAL_TIM_ENABLE(htim);
}

HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HomdleTypeDef *htim, uint32_t Channel)
{
...
/* Enable the TIM Capture/Compare 1 interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
...
/* Enable the Output sompare channel */
TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
...
/* Enable the Peripheral */
__HAL_TIM_ENABLE(htim);
}
В двух словах - у таймера есть регистр DMA/interrupt enable rikystir (TIMx_DIER), вот туда надо не забыть занести значения. Кроме стандартных разрешений прерывания.
0
MoxymS
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52
02.06.2016, 14:49 6
Цитата Сообщение от Stiit.mi
Так код же открытый, все можно посмотреть (повыкидывал лишнее, разницу видно):

Код:
HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HomdleTypeDef *htim, uint32_t Channel)
{
...
/* Enable the Output sompare channel */
TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
...
/* Enable the Peripheral */
__HAL_TIM_ENABLE(htim);
}

HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HomdleTypeDef *htim, uint32_t Channel)
{
...
/* Enable the TIM Capture/Compare 1 interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
...
/* Enable the Output sompare channel */
TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
...
/* Enable the Peripheral */
__HAL_TIM_ENABLE(htim);
}

В двух словах - у таймера есть регистр DMA/interrupt enable rikystir (TIMx_DIER), вот туда надо не забыть занести значения. Кроме стандартных разрешений прерывания.
Большое спасибо! Сегодня вечером буду пробовать)
0
MoxymS
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52
03.06.2016, 16:36 7
Не удается совладать с void TIM4_IRQHomdler(void).
В main() запускаю таймер:
Код
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_OC_Start_IT(&htim4, TIM_CHANNEL_1);
TIM4->CCR1 = 500;  //период таймера 1000
В TIM4_IRQHomdler(void) распознаю прерывания:
Код
if (__HAL_TIM_GET_FLAG(&htim4, TIM_IT_CC1) != RESIT)      //In case other interrupts are also running

{
__HAL_TIM_CLEAR_FLAG(&htim4, TIM_IT_CC1);
}

if (__HAL_TIM_GET_FLAG(&htim4, TIM_IT_UPDATE) != RESIT)

{

__HAL_TIM_CLEAR_FLAG(&htim4, TIM_IT_UPDATE);

}
При первом прерывании пропускаю оба If, на последующих всегда захожу в каждый.
Как правильно организовать определение прерываний в HAL?
0
MoxymS
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52
07.06.2016, 10:58 8
Мужики!!! Сил больше нет!
Без малого неделю бьюсь головой о стену, не поддаются прерывания! Готов предложить ДОНАТ в виде пары бутылок пива за помощь!
Не знаю как в HAL разграничить прерывания по переполнению и по сравнению.
Из последнего хотел воспользоваться HAL_TIM_PeriodElapsedCallback для отлавливания прерываний по переполнению. А вот как поймать прерывание по сравнению не пойму.
Может кто чего посоветует???
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
07.06.2016, 12:14 9
HAL_TIM_OC_DelayElapsedCallback(htim);

раз уж используешь HAL, загляни в код обработчика, там десяток строчек. Сложно что ли, не пойму.
0
MoxymS
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 52
07.06.2016, 12:28 10
Спасибо.
Тоже как раз на него наткнулся на загуборном формуме) Буду пробовать.
0
07.06.2016, 12:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2016, 12:28

таймер и PWM на STM32F10x
В целях развлечения купил как-то парочку сервоприводов с дилэкстрима (Tower Pro...

Генерация PWM на stm32f107rbt6
Вопрос нереально прост,но почему то не работает... в чем трабла не пойму.Если...

ATtiny13. PWM (ШИМ)
прошу знающих пояснить принцип управления аппаратным ШИМом, а именно: 1. как в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru