Форум РадиоКот • Просмотр темы - фазоимпульсное управление на таймерах STM32
Сообщения без ответов | Активные темы
Страница 4 из 4
[ Сообщений: 65 ]
, , ,
Автор
Сообщение
dosikus
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Сб авг 12, 2017 21:59:49
Друг Кота
Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01Сообщений: 3604
Рейтинг сообщения: 0
Вы нашли что захотелось а суть пропустили. Вы всегда так документацию по диагонали читаете?
Вернуться наверх
Реклама
AVI-crak
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Сб авг 12, 2017 22:30:40
Прорезались зубы
Карма: 2
Рейтинг сообщений: 14
Зарегистрирован: Сб янв 09, 2016 15:51:17Сообщений: 202
Рейтинг сообщения: 0
Суть в том что простым таймером получается очень простой аппаратный алгоритм. Даже если их собирать каскадом и использовать дма с заранее просчитанными таблицами.
_________________sRtoS
Вернуться наверх
Реклама
scorpi_0n
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Сб авг 12, 2017 23:33:08
Вымогатель припоя
Карма: -2
Рейтинг сообщений: -32
Зарегистрирован: Вс ноя 01, 2015 13:13:49Сообщений: 616
Рейтинг сообщения: 0
Суть в том что простым таймером получается очень простой аппаратный алгоритм.
А что ещё нужно? Читайте название темы, читайте первый пост.
Вернуться наверх
AVPD
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Вс авг 13, 2017 18:05:52
Зарегистрирован: Вт авг 08, 2017 15:15:11Сообщений: 5
Рейтинг сообщения: 0
Таймер может получить пинок для старта не только от программы, но и от других некоторых событий. Например для таймера можно выбрать источник события и реакцию его на это событие.
Вот настройка таймера для моего "диммера", я ее неполную выкладываю, только то что должно Вас заинтересовать по данном вопросу.
Код:
//затактируем Таймер2 (36 МГц*2) RCC->APB1ENR|=RCC_APB1ENR_TIM2EN; ... ... //---------- //слайв мод регистр запуск от ETR TIM2->SMCR= //TIM_SMCR_ETP| //ETR полярность, спад в данном случае TIM_SMCR_TS| //ETR включен TIM_SMCR_SMS_2|TIM_SMCR_SMS_1| //110: Trigger Mode - The counter starts at a rising edge of the trigger 0; .... ....
При событии фронт на лапе TIM2_CH1_ETR , таймер получает пинок старта аппаратно.
Благодарю! Жаль пока не могу плюсануть, видимо пока новичек на форуме... буду разбираться.
Если мне надо временно выключить/ включить генерацию от внешней лапы (в д.случае TIM2_CH1_ETR) мне достаточно управлять далее по тексту битом TIM_SMCR_TS ?
Вернуться наверх
Реклама
temniy170683
Заголовок сообщения: Re: фазоимпульсное управление на таймерах STM32
Добавлено: Ср сен 05, 2018 10:20:52
Зарегистрирован: Ср сен 05, 2018 10:09:25Сообщений: 1
Рейтинг сообщения: 0
Вот берите с zerocross detector на HAL STM32F103c8t6Спойлер #include "main.h" #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim1; uint16_t i=1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); i=29999; while (1) { i=i-1; if (i<=1) i=29999; TIM1->CCR4=i; HAL_Delay(1); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV2; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } static void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; htim1.Instance = TIM1; htim1.Init.Prescaler = 9; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 29999; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; sSlaveConfig.InputTrigger = TIM_TS_ETRF; sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_INVERTED; sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1; sSlaveConfig.TriggerFilter = 0; if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 500; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_TIM_MspPostInit(&htim1); } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); } void _Error_Handler(char *file, int line) { while(1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { } #endif
Вернуться наверх
Реклама
Страница 4 из 4
[ Сообщений: 65 ]
, , ,
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения