# HG changeset patch # User Ethan Zonca # Date 2017-07-26 13:12:52 # Node ID a2c96432427bf7ed4d59fd1320404cbdd1805a19 # Parent 6cc8fa5ae0f646b31c104e81bef5dfce6184b6fb Use tim17 to gen pwmout; oc doesn't work so using isr diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/inc/pwmout.h b/inc/pwmout.h --- a/inc/pwmout.h +++ b/inc/pwmout.h @@ -9,7 +9,7 @@ void pwmout_init(void); -void pwmout_process(float duty); - +void pwmout_process(uint16_t duty); +TIM_HandleTypeDef* pwmout_get_tim(void); #endif diff --git a/src/display.c b/src/display.c --- a/src/display.c +++ b/src/display.c @@ -84,7 +84,7 @@ void display_process(void) if(temp_changed || state_changed) { char tempstr[16]; - snprintf(tempstr, 16, "Temp: %6.1f", status->temp); + snprintf(tempstr, 16, "Temp: %4.1f", status->temp); // ssd1306_drawstring(" ", 3, 40); ssd1306_drawstring(tempstr, 3, 40); @@ -721,7 +721,7 @@ static void draw_setpoint(therm_status_t // FIXME: need to do this when switching modes too if(status->temp != temp_last || trigger_drawsetpoint) { char tempstr[8]; - snprintf(tempstr, 8, "%g ", status->temp); + snprintf(tempstr, 8, "%4.1f", status->temp); ssd1306_drawstringbig(tempstr, 3, 0); } diff --git a/src/pwmout.c b/src/pwmout.c --- a/src/pwmout.c +++ b/src/pwmout.c @@ -2,10 +2,13 @@ // PWM Out: generate PWM waveform to control factory // +#include "stm32f3xx_hal.h" #include "pwmout.h" #include "gpio.h" #include "flash.h" +#include "error.h" +TIM_HandleTypeDef htim17; static uint32_t last_ssr_on = 0; @@ -13,14 +16,69 @@ static uint32_t last_ssr_on = 0; void pwmout_init(void) { GPIO_InitTypeDef GPIO_InitStruct; + __HAL_RCC_TIM17_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); // Configure LED GPIO pins GPIO_InitStruct.Pin = SSR_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; +// GPIO_InitStruct.Alternate = GPIO_AF1_TIM17; HAL_GPIO_Init(SSR_GPIO_Port, &GPIO_InitStruct); + + TIM_OC_InitTypeDef sConfigOC; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; + + htim17.Instance = TIM17; + htim17.Init.Prescaler = 6000; + htim17.Init.CounterMode = TIM_COUNTERMODE_UP; + htim17.Init.Period = 1000; + htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim17.Init.RepetitionCounter = 0; + if (HAL_TIM_Base_Init(&htim17) != HAL_OK) + { + error_assert(ERR_PERIPHINIT); + } + + if (HAL_TIM_OC_Init(&htim17) != HAL_OK) + { + error_assert(ERR_PERIPHINIT); + } + + sConfigOC.OCMode = TIM_OCMODE_TOGGLE; //TIM_OCMODE_PWM1; + sConfigOC.Pulse = 200; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCIDLESTATE_SET; + if (HAL_TIM_OC_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + error_assert(ERR_PERIPHINIT); + } + + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.BreakFilter = 0; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK) + { + error_assert(ERR_PERIPHINIT); + } + + HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn); + + + HAL_TIM_OC_Start_IT(&htim17, TIM_CHANNEL_1); + __HAL_TIM_ENABLE_IT(&htim17, TIM_IT_UPDATE); + } @@ -28,36 +86,42 @@ void pwmout_init(void) // functionality. this is a problem. // also duty cycling isn't working correctly... -void pwmout_process(float duty) +void pwmout_process(uint16_t duty) { - uint32_t ssr_output = duty; // meh - - // Kill SSR once the desired on-time has elapsed - if(flash_getsettings()->val.control_mode == MODE_PID && ((HAL_GetTick() - last_ssr_on > ssr_output) || ssr_output <= 0)) - { - HAL_GPIO_WritePin(SSR, 0); - HAL_GPIO_WritePin(LED, 0); - } - + htim17.Instance->CCR1 = duty; +// HAL_GPIO_TogglePin(SSR_GPIO_Port, SSR_PIN); - // Every 200ms, set the SSR on unless output is 0 - if(flash_getsettings()->val.control_mode == MODE_PID && HAL_GetTick() - last_ssr_on > SSR_PERIOD) - { - // Heat or cool, if we need to - if(ssr_output > 0) - { - HAL_GPIO_WritePin(SSR, 1); - HAL_GPIO_WritePin(LED, 1); - last_ssr_on = HAL_GetTick(); - } - else { - // Make sure everything is off - HAL_GPIO_WritePin(SSR, 0); - HAL_GPIO_WritePin(LED, 0); - } - - } +// uint32_t ssr_output = duty; // meh +// +// // Kill SSR once the desired on-time has elapsed +// if(flash_getsettings()->val.control_mode == MODE_PID && ((HAL_GetTick() - last_ssr_on > ssr_output) || ssr_output <= 0)) +// { +// HAL_GPIO_WritePin(SSR, 0); +// HAL_GPIO_WritePin(LED, 0); +// } +// +// +// // Every 200ms, set the SSR on unless output is 0 +// if(flash_getsettings()->val.control_mode == MODE_PID && HAL_GetTick() - last_ssr_on > SSR_PERIOD) +// { +// // Heat or cool, if we need to +// if(ssr_output > 0) +// { +// HAL_GPIO_WritePin(SSR, 1); +// HAL_GPIO_WritePin(LED, 1); +// last_ssr_on = HAL_GetTick(); +// } +// else { +// // Make sure everything is off +// HAL_GPIO_WritePin(SSR, 0); +// HAL_GPIO_WritePin(LED, 0); +// } +// +// } } - +TIM_HandleTypeDef* pwmout_get_tim(void) +{ + return &htim17; +} diff --git a/src/system/interrupts.c b/src/system/interrupts.c --- a/src/system/interrupts.c +++ b/src/system/interrupts.c @@ -7,6 +7,7 @@ #include "interrupts.h" #include "gpio.h" +#include "pwmout.h" // Systick interrupt @@ -46,7 +47,34 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPI } } +void TIM1_TRG_COM_TIM17_IRQHandler(void) +{ + /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */ + + /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */ + + HAL_TIM_IRQHandler(pwmout_get_tim()); + /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */ + + /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */ +} +void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + if(htim == pwmout_get_tim()) + { + HAL_GPIO_WritePin(SSR, 0); + HAL_GPIO_WritePin(LED, 0); + } +} +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + if(htim == pwmout_get_tim()) + { + HAL_GPIO_WritePin(LED, 1); + HAL_GPIO_WritePin(SSR, 1); + } +} diff --git a/src/system/system.c b/src/system/system.c --- a/src/system/system.c +++ b/src/system/system.c @@ -29,16 +29,17 @@ void sysclock_init(void) HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1; + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB|RCC_PERIPHCLK_ADC1; + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB|RCC_PERIPHCLK_ADC1|RCC_PERIPHCLK_TIM17; PeriphClkInit.USBClockSelection = RCC_USBPLLCLK_DIV1; PeriphClkInit.Adc1ClockSelection = RCC_ADC1PLLCLK_DIV1; + PeriphClkInit.Tim17ClockSelection = RCC_TIM17CLK_HCLK; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);