Add oven PWM controller
This commit is contained in:
parent
4f05c084d9
commit
8d6c81441d
@ -27,4 +27,6 @@ void oven_driver_init(void);
|
||||
|
||||
void oven_driver_set_power(uint8_t power);
|
||||
|
||||
void oven_driver_disable(void);
|
||||
|
||||
#endif /* __OVEN_DRIVER_H__ */
|
||||
|
@ -0,0 +1,33 @@
|
||||
/* Reflow Oven Controller
|
||||
*
|
||||
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
|
||||
*
|
||||
* This file is part of the Reflow Oven Controller Project.
|
||||
*
|
||||
* The reflow oven controller is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* The Reflow Oven Control Firmware is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with the reflow oven controller project.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __OVEN_DRIVER_HWCFG_H__
|
||||
#define __OVEN_DRIVER_HWCFG_H__
|
||||
|
||||
#include <stm32/stm32f4xx.h>
|
||||
|
||||
#define OVEN_CONTROLLER_PWM_TIMER TIM3
|
||||
#define OVEN_CONTROLLER_PORT GPIOB
|
||||
#define OVEN_CONTROLLER_PIN (0)
|
||||
#define OVEN_CONTROLLER_PORT_RCC_MASK RCC_AHB1ENR_GPIOBEN
|
||||
#define OVEN_CONTROLLER_TIM_RCC_MASK RCC_APB1ENR_TIM3EN
|
||||
#define OVEN_CONTROLLER_PIN_ALTFUNC (2)
|
||||
|
||||
#endif /* __OVEN_DRIVER_HWCFG_H__ */
|
@ -27,7 +27,7 @@
|
||||
#define PULLUP(pin) (0x1U << ((pin)* 2))
|
||||
#define ALTFUNC(pin) ((0x2) << ((pin) * 2))
|
||||
#define PINMASK(pin) ((0x3) << ((pin) * 2))
|
||||
#define SETAF(PORT,PIN,AF) PORT->AFR[((PIN) < 8 ? 0 : 1)] |= AF << (((PIN) < 8 ? (PIN) : ((PIN) - 8)) * 4)
|
||||
#define SETAF(PORT,PIN,AF) PORT->AFR[((PIN) < 8 ? 0 : 1)] |= (AF) << (((PIN) < 8 ? (PIN) : ((PIN) - 8)) * 4)
|
||||
#define ANALOG(pin) (0x03 << ((pin) * 2))
|
||||
#define OTYP_OPENDRAIN(pin) (0x1U << (pin))
|
||||
|
||||
|
@ -236,6 +236,9 @@ int main()
|
||||
button = button_read_event();
|
||||
rot = rotary_encoder_get_abs_val();
|
||||
|
||||
oven_driver_set_power(rot > 100U ? 100U : rot);
|
||||
|
||||
|
||||
/* TODO: handle gui */
|
||||
snprintf(&disp[1][0], 17, "Rotary: %u", (unsigned int)rot);
|
||||
snprintf(&disp[2][0], 17, "Button: %s", (button == BUTTON_SHORT ? "SHORT" : (button == BUTTON_LONG ? "LONG" : "")));
|
||||
|
@ -19,13 +19,41 @@
|
||||
*/
|
||||
|
||||
#include <reflow-controller/oven-driver.h>
|
||||
#include <reflow-controller/periph-config/oven-driver-hwcfg.h>
|
||||
#include <stm-periph/clock-enable-manager.h>
|
||||
|
||||
void oven_driver_init()
|
||||
{
|
||||
rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_PORT_RCC_MASK));
|
||||
rcc_manager_enable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
|
||||
|
||||
OVEN_CONTROLLER_PORT->MODER &= MODER_DELETE(OVEN_CONTROLLER_PIN);
|
||||
OVEN_CONTROLLER_PORT->MODER |= ALTFUNC(OVEN_CONTROLLER_PIN);
|
||||
SETAF(OVEN_CONTROLLER_PORT, OVEN_CONTROLLER_PIN, OVEN_CONTROLLER_PIN_ALTFUNC);
|
||||
|
||||
OVEN_CONTROLLER_PWM_TIMER->CR2 = 0UL;
|
||||
|
||||
OVEN_CONTROLLER_PWM_TIMER->CCMR2 = TIM_CCMR2_OC3M;
|
||||
OVEN_CONTROLLER_PWM_TIMER->CCER = TIM_CCER_CC3E | TIM_CCER_CC3P;
|
||||
|
||||
OVEN_CONTROLLER_PWM_TIMER->ARR = 1000U;
|
||||
OVEN_CONTROLLER_PWM_TIMER->PSC = 42000U - 1U;
|
||||
|
||||
OVEN_CONTROLLER_PWM_TIMER->CR1 = TIM_CR1_CMS | TIM_CR1_CEN;
|
||||
}
|
||||
|
||||
void oven_driver_set_power(uint8_t power)
|
||||
{
|
||||
if (power > 100U)
|
||||
power = 100U;
|
||||
|
||||
OVEN_CONTROLLER_PWM_TIMER->CCR3 = power * 10;
|
||||
}
|
||||
|
||||
void oven_driver_disable()
|
||||
{
|
||||
OVEN_CONTROLLER_PWM_TIMER->CR1 = 0UL;
|
||||
OVEN_CONTROLLER_PWM_TIMER->CR2 = 0UL;
|
||||
rcc_manager_disable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_PORT_RCC_MASK));
|
||||
rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user