Files @ 6cc8fa5ae0f6
Branch filter:

Location: therm-ng/src/pwmout.c

Ethan Zonca
Temp reading finally working!
//
// PWM Out: generate PWM waveform to control factory
//

#include "pwmout.h"
#include "gpio.h"
#include "flash.h"


static uint32_t last_ssr_on = 0;


void pwmout_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	// Configure LED GPIO pins
	GPIO_InitStruct.Pin = SSR_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(SSR_GPIO_Port, &GPIO_InitStruct);

}


// freaking integral term isn't compatible with both heating and cooling... due to the discard
// functionality. this is a problem.

// also duty cycling isn't working correctly...
void pwmout_process(float 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);
	}


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

	}
}