#include #include #include "taenzer.h" #include "avrIOhelper/io-helper.h" #include "kraftsensor.h" #include #define TAENZER_KRAFT_SETPOINT 12000 #define TAENZER_KRAFT_HYST 1000 taenzer_state_t taenzer_state; taenzer_state_t taenzer_state = { .homed = 0, .pos = 0, .force_setpoint = TAENZER_KRAFT_SETPOINT, }; void send_info(void); void do_taenzer(){ /* Homing */ if(read_Input(IN_TAENZER_HOME, LEVEL)){ TCCR4B &= ~_BV(CS41); //TURN OFF taenzer_state.homed = 1; taenzer_state.pos = 0; } if(!taenzer_state.homed && notaus_state == POWER_ON){ set_Output(MOTOR_TAENZER_DIR, 1); // direction: up TCCR4B |= _BV(CS41); //TURN ON } if (read_Input(BTN_KRAFT_PLUS, RISING)) { taenzer_state.force_setpoint += 1000; #if PLC_MQTT_ENABLED send_info(); #endif } if (read_Input(BTN_KRAFT_MINUS, RISING)) { taenzer_state.force_setpoint -= 1000; #if PLC_MQTT_ENABLED send_info(); #endif } /* Force regualtion */ if(kraftsensor_valid && taenzer_state.homed && taenzer_state.pos >= 0 && taenzer_state.pos < 500000){ int16_t err = (kraftsensor_value - taenzer_state.force_setpoint); if(err > 8000) err=8000; ICR4 = 400000/err; OCR4A = ICR4/2; if(kraftsensor_value < TAENZER_KRAFT_SETPOINT - (TAENZER_KRAFT_HYST/2)){ set_Output(MOTOR_TAENZER_DIR, 0); // direction: down TCCR4B |= _BV(CS41); //TURN ON } else if(kraftsensor_value > TAENZER_KRAFT_SETPOINT + (TAENZER_KRAFT_HYST/2)){ set_Output(MOTOR_TAENZER_DIR, 1); // direction: up TCCR4B |= _BV(CS41); //TURN ON } else TCCR4B &= ~_BV(CS41); //TURN OFF } } void timer4_init() { TCCR4A |= (1<