Changeset - a2c96432427b
[Not reviewed]
default
0 6 0
Ethan Zonca - 8 years ago 2017-07-26 13:12:52
ezonca@sealandaire.com
Use tim17 to gen pwmout; oc doesn't work so using isr
6 files changed with 132 insertions and 39 deletions:
0 comments (0 inline, 0 general)
.settings/language.settings.xml
Show inline comments
 
@@ -5,7 +5,7 @@
 
			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 
			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 
			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
 
			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1073395970633912068" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 
			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="228329417953433416" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 
				<language-scope id="org.eclipse.cdt.core.gcc"/>
 
				<language-scope id="org.eclipse.cdt.core.g++"/>
 
			</provider>
 
@@ -16,7 +16,7 @@
 
			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 
			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 
			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
 
			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1105339482864355034" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 
			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="266793431193090206" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 
				<language-scope id="org.eclipse.cdt.core.gcc"/>
 
				<language-scope id="org.eclipse.cdt.core.g++"/>
 
			</provider>
inc/pwmout.h
Show inline comments
 
@@ -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
src/display.c
Show inline comments
 
@@ -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);
 
    }
 

	
src/pwmout.c
Show inline comments
 
@@ -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;
 
}
src/system/interrupts.c
Show inline comments
 
@@ -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);
 
	}
 
}
 
src/system/system.c
Show inline comments
 
@@ -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);
0 comments (0 inline, 0 general)