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