From f85971e49baac7973932df706bf2befffa056c0f Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Tue, 25 May 2021 18:09:13 +0200 Subject: [PATCH] integrate pid 2nd and 3rd channel can be coupled via percentage --- main.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++----------- makefile | 2 +- menu.c | 41 ++++++++++++++++--- menu.h | 2 + 4 files changed, 151 insertions(+), 31 deletions(-) diff --git a/main.c b/main.c index a8900ec..0d53a27 100644 --- a/main.c +++ b/main.c @@ -14,18 +14,34 @@ #include "modbus.h" #include "menu.h" #include "adc.h" +#include "pid.h" + +#define COIL1 1<<1 +#define COIL2 1<<0 +#define COIL3 1<<2 +#define COIL4 1<<3 volatile uint16_t holdingRegisters[10]; volatile uint16_t temp_values[4]; volatile uint16_t temp_setpoints[4]; +volatile uint16_t output; +volatile struct pid controller; + +volatile uint32_t duty[3]; + void modbusGet(void) { if (modbusGetBusState() & (1<= 1) && (menu_state <= 3)){ - if(PIND & (1<<6)) - temp_setpoints[menu_state-1]--; - else - temp_setpoints[menu_state-1]++; +ISR(TIMER1_COMPA_vect) { + /* turn off outputs */ + + if(OCR1A >= duty[0]){ + PORTB &= ~(COIL1); + PORTD &= ~(1 << 4); } + if(OCR1A >= duty[1]) + PORTB &= ~(COIL2); + if(OCR1A >= duty[2]) + PORTB &= ~(COIL3); + + uint16_t new_ocr = 0xFFFE; + for(uint8_t i = 0; i < 3; i++){ + if((duty[i] > OCR1A) && (duty[i] < new_ocr)) + new_ocr = duty[i]; + } + OCR1A = new_ocr; + + //uint16_t tmp1 = duty[0]; + //uint16_t tmp2; + //for(uint8_t i = 0; i < 3; i++){ + // if(duty[i] < tmp1 && duty[i] > OCR1A) + // tmp2 = duty[i]; + //} + //OCR1A = tmp2; +} + +ISR(TIMER1_OVF_vect) { + int16_t tmp_pid = pid_step(&controller, 1, temp_setpoints[0] - temp_values[0]); + + if(tmp_pid>=0) + output = tmp_pid; + else + output = 0; + + + if(output >= 128){ + output = 128; + duty[0]=0xFFFE; + } + else if(output >= 1){ + uint32_t tmp = output * 512; + duty[0] = tmp; + } + else + duty[0]=0; + + + duty[1] = duty[0] / 100 * temp_setpoints[1]; + duty[2] = duty[0] / 100 * temp_setpoints[2]; + + for(uint8_t i = 0; i < 3; i++){ + if(duty[i] >= 0xFFFE) + duty[i] = 0xFFFE; + } + + OCR1A = 0xFFFE; + for(uint8_t i = 0; i < 3; i++){ + if(duty[i] < OCR1A && duty[i] >= (uint16_t)1000) + OCR1A = duty[i]; + } + + if(duty[0] >= 1000){ + PORTB |= COIL1; + PORTD |= 1<<4; + } + if(duty[1] >= 1000) + PORTB |= COIL2; + + if(duty[2] >= 1000) + PORTB |= COIL3; + - //if(PIND & (1<<7)) - // if(PIND & (1<<6)){ - // if(temp_setpoints[menu_state] > 0) - // } - // else{ - // if(temp_setpoints[menu_state] < 300) - // } } + diff --git a/makefile b/makefile index 6f963ed..38d7eca 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,5 @@ TARGET = main -FILES = main i2c lcd modbus menu adc +FILES = main i2c lcd modbus menu adc pid MCU = atmega328p PROGC = m328p CC = avr-gcc diff --git a/menu.c b/menu.c index 70a93c7..285fdb4 100644 --- a/menu.c +++ b/menu.c @@ -19,15 +19,15 @@ void write_heater_set_temp(uint8_t n, uint16_t temp){ void update_cursor(){ switch(menu_state){ case 1: - lcd_set_position(2,6); + lcd_set_position(2,8); lcd_cursor(1); break; case 2: - lcd_set_position(2,11); + lcd_set_position(2,13); lcd_cursor(1); break; case 3: - lcd_set_position(2,16); + lcd_set_position(2,18); lcd_cursor(1); break; default: @@ -53,14 +53,17 @@ void write_temps(){ lcd_set_position(3, 6); sprintf(str, "%3i", temp_values[0]); + str[3] = 0xDF; lcd_print_str(str); lcd_set_position(3, 11); sprintf(str, "%3i", temp_values[1]); + str[3] = 0xDF; lcd_print_str(str); lcd_set_position(3, 16); sprintf(str, "%3d", temp_values[2]); + str[3] = 0xDF; lcd_print_str(str); } @@ -69,14 +72,15 @@ void write_setpoints(){ lcd_set_position(2, 6); sprintf(str, "%3i", temp_setpoints[0]); + str[3] = 0xDF; lcd_print_str(str); lcd_set_position(2, 11); - sprintf(str, "%3i", temp_setpoints[1]); + sprintf(str, "%3i%%", temp_setpoints[1]); lcd_print_str(str); lcd_set_position(2, 16); - sprintf(str, "%3i", temp_setpoints[2]); + sprintf(str, "%3i%%", temp_setpoints[2]); lcd_print_str(str); } @@ -84,6 +88,31 @@ void set_item(uint8_t page_num){ //if(menu_state=page_num) // menu_state=0; //else - menu_state = page_num; + menu_state = page_num; } +void enc_init(){ + PORTD |= (1<<6) | (1 << 7); + PCICR |= (1<= 1) && (menu_state <= 3)){ + if(PIND & (1<<6)) + temp_setpoints[menu_state-1]--; + else + temp_setpoints[menu_state-1]++; + } + + //if(PIND & (1<<7)) + // if(PIND & (1<<6)){ + // if(temp_setpoints[menu_state] > 0) + // } + // else{ + // if(temp_setpoints[menu_state] < 300) + // } +} diff --git a/menu.h b/menu.h index 3ca17d0..bcd5ff6 100644 --- a/menu.h +++ b/menu.h @@ -11,5 +11,7 @@ void write_setpoints(void); void update_cursor(void); void set_item(uint8_t page_num); void draw_menu(void); +void enc_init(void); +void encoder_isr(void); #endif