From 1c2cc9731f3f2b899f2fbbce4ec31dfdc665ad07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 6 Aug 2022 12:51:54 +0200 Subject: [PATCH] remostat --- Makefile | 5 ++++- README.md | 14 ++++++++++++++ User/bootstrap.c | 3 ++- User/bootstrap.h | 2 +- User/main.c | 27 ++++++++++++++++++++++----- 5 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 README.md diff --git a/Makefile b/Makefile index 5c6bca3..543c4ec 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ INCLUDE = -I$(PRJ_SRC_DIR) -I$(LIB_INC_DIR) -I$(SPL_INC_DIR) # collect all source directories VPATH=$(PRJ_SRC_DIR):$(SPL_SRC_DIR) -.PHONY: clean +.PHONY: clean unlock flash all all: $(TARGET) @@ -70,5 +70,8 @@ $(TARGET): $(PRJ_OBJECTS) flash: $(TARGET) stm8flash -c stlinkv2 -p $(DEVICE_FLASH) -s flash -w $(TARGET) +unlock: + stm8flash -c stlinkv2 -p stm8s103f3 -u + clean: rm $(OUTPUT_DIR)/* diff --git a/README.md b/README.md new file mode 100644 index 0000000..214f606 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Regulátor pro remosku + +Umožňuje omezení výkonu remosky pomocí SSR relé. Napájení je přes čínský zdroj Hi-Link. + +Používám čínský modul STM8S103F, protože to bylo to nejlevnější co jsem ho našel v šuplíku. Na tohle je Bluepill STM32F103 škoda. Tohle je můj první reálný projekt s STM8, na takhle jednoduché věci úplně stačí. + +Nemá to teplotní čidlo, řízení je přímovazební. Pro remosku to stačí. Perioda PWM je cca 1s, jde nastavit v kódu. + +Zapojení: + +- D2 = AIN, jezdec potenciometru +- C7 = bypass přepínač, výstup bude na 100%, pokud je spojen se zemí +- C4 = výstup pro SSR + diff --git a/User/bootstrap.c b/User/bootstrap.c index fd630e3..fba2361 100644 --- a/User/bootstrap.c +++ b/User/bootstrap.c @@ -12,10 +12,11 @@ volatile uint16_t time_ms; * Putchar for printf * @param c - char to print */ -void putchar(char c) +int putchar(int c) { while ((UART1->SR & UART1_SR_TXE) == 0); UART1->DR = (u8)c; + return 1; } /** diff --git a/User/bootstrap.h b/User/bootstrap.h index 2475abd..7a32c8d 100644 --- a/User/bootstrap.h +++ b/User/bootstrap.h @@ -15,7 +15,7 @@ void UART1_RX_IRQHandler(void) INTERRUPT(18); void TIM4_UPD_OVF_IRQHandler(void) INTERRUPT(23); /** putchar, used by the SDCC stdlib */ -void putchar(char c); +int putchar(int c); /** * Simple init (UART, LED, timebase) diff --git a/User/main.c b/User/main.c index c9231fb..c869b06 100644 --- a/User/main.c +++ b/User/main.c @@ -2,10 +2,12 @@ #include #include "bootstrap.h" -#define LEVEL_TOP 400 -#define LEVEL_MAX 370 +#define LEVEL_TOP 1024 +#define LEVEL_MAX 1000 -volatile uint16_t level = 200; +volatile uint16_t level = 0; + +#define BYPASSBTN_PIN (1 << 7) /** * Set PWM level @@ -13,7 +15,8 @@ volatile uint16_t level = 200; void PWM_Write(void) { uint16_t tmp = level; - if (tmp > LEVEL_MAX) tmp = LEVEL_MAX; + //if (tmp > LEVEL_MAX) tmp = LEVEL_MAX; + if (tmp >= LEVEL_MAX) tmp = LEVEL_TOP; TIM1_SetCompare4(tmp); } @@ -22,6 +25,13 @@ void PWM_Cmd(FunctionalState fs) TIM1_CtrlPWMOutputs(fs); } +void BYPASSBTN_Setup() +{ + GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_IN_PU_NO_IT); + //GPIOC->DDR &= ~BYPASSBTN_PIN; + //GPIOC->CR1 |= BYPASSBTN_PIN; +} + /** * Set up the PWM generation */ @@ -32,7 +42,7 @@ void PWM_Setup() //GPIOC->CR1 &= ~GPIO_PIN_4; // open drain GPIOC->CR2 |= GPIO_PIN_4; // fast - TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, LEVEL_TOP, 0); + TIM1_TimeBaseInit(1 << 14, TIM1_COUNTERMODE_UP, LEVEL_TOP, 0); TIM1_OC4Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, @@ -63,6 +73,7 @@ void main(void) SimpleInit(); PWM_Setup(); AIN_Setup(); + BYPASSBTN_Setup(); // Go PWM_Cmd(ENABLE); @@ -76,7 +87,13 @@ void main(void) // adjust level if (ADC1_GetFlagStatus(ADC1_FLAG_EOC)) { conv = ADC1_GetConversionValue(); + + if (0 == (GPIOC->IDR & BYPASSBTN_PIN)) { + conv = LEVEL_TOP; + } + level = conv; + PWM_Write(); } }