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);