Compare commits

..

5 Commits

@ -12,6 +12,8 @@
int32_t kraftsensor_value; int32_t kraftsensor_value;
uint8_t kraftsensor_valid; uint8_t kraftsensor_valid;
int32_t kraftsensor_zero_offset = 0/*197700*/;
void timer2_init() void timer2_init()
{ {
TCCR2A = (1<<WGM21); //TIMER0 SET-UP: CTC MODE TCCR2A = (1<<WGM21); //TIMER0 SET-UP: CTC MODE
@ -45,7 +47,7 @@ void do_kraftsensor(){
//kraftsensor_value = tmp; //kraftsensor_value = tmp;
/* conversion magic to milliNewton */ /* conversion magic to milliNewton */
kraftsensor_value = ((tmp + 197700 /*539363*/)*9.81)/177.380; kraftsensor_value = (((tmp /* + 539363*/)*9.81)/177.380)+kraftsensor_zero_offset;
//if(abs(kraftsensor_read - old_value) > 10000){ //if(abs(kraftsensor_read - old_value) > 10000){
// if(abs(last_read - kraftsensor_read) > 10000){ // if(abs(last_read - kraftsensor_read) > 10000){

@ -8,6 +8,8 @@
extern int32_t kraftsensor_value; extern int32_t kraftsensor_value;
extern uint8_t kraftsensor_valid; extern uint8_t kraftsensor_valid;
extern int32_t kraftsensor_zero_offset;
void timer2_init(); void timer2_init();
void kraftsensor_init(); void kraftsensor_init();
void do_kraftsensor(void); void do_kraftsensor(void);

@ -25,8 +25,8 @@ typedef struct {
} PID_vars; } PID_vars;
#define PID_VARS_INIT(x) PID_vars x = {.Kp=1.5,.Ki=0.00,.Kd=0.0,.output_max=20000.0, \ #define PID_VARS_INIT(x) PID_vars x = {.Kp=1.7,.Ki=0.00,.Kd=0.00,.output_max=25000.0, \
.output_min=-20000.0,._integral_sum=0.0,._prev_err=0.0,._dt=1.0} .output_min=-25000.0,._integral_sum=0.0,._prev_err=0.0,._dt=1.0}
/* Function Prototypes */ /* Function Prototypes */
double pid(PID_vars *vars, double current_err); double pid(PID_vars *vars, double current_err);

@ -13,7 +13,7 @@ volatile uint16_t windings_wakeup = 0;
int32_t spule_trans_pos = 0; int32_t spule_trans_pos = 0;
uint8_t spule_trans_homed = 0; uint8_t spule_trans_homed = 0;
#define TRANS_ROT_FACTOR 0.07 #define TRANS_ROT_FACTOR 0.14
void timer1_init() void timer1_init()
{ {
@ -59,7 +59,7 @@ void set_spooling_speed(uint16_t speed){
} }
void do_spule(){ void do_spule(){
//PORTH &= ~(1<<5); // Translatoric axis homeing code
if(read_Input(IN_SPULE_HOME, LEVEL) && spule_trans_homed == 0){ if(read_Input(IN_SPULE_HOME, LEVEL) && spule_trans_homed == 0){
spule_trans_homed = 1; spule_trans_homed = 1;
spule_trans_pos = 0; spule_trans_pos = 0;
@ -71,12 +71,15 @@ void do_spule(){
OCR1A = ICR1/2; OCR1A = ICR1/2;
} }
// if not homed goto home
if(!spule_trans_homed){ if(!spule_trans_homed){
ICR1 = 100; ICR1 = 100;
OCR1A = 50; OCR1A = 50;
set_Output(MOTOR_TRANS_DIR, 1); // direction: front set_Output(MOTOR_TRANS_DIR, 1); // direction: front
TCCR1B |= _BV(CS11); //TURN ON TCCR1B |= _BV(CS11); //TURN ON
} }
// manual forwarding if button is held
else if(!get_abzug_state()){ else if(!get_abzug_state()){
if(read_Input(BTN_WICKELN_EIN, LEVEL)){ if(read_Input(BTN_WICKELN_EIN, LEVEL)){
set_spooling_speed(300); set_spooling_speed(300);
@ -85,24 +88,28 @@ void do_spule(){
else else
spule_onoff(0); spule_onoff(0);
} }
// normal operation
else{ else{
/* speed regulation - keep taenzer at 10% */ /* speed regulation - keep taenzer at 10% */
float p = 100.0/(int32_t)(taenzer_state.pos/1000); float p = 100.0/(int32_t)(taenzer_state.pos/1000);
p-=1; p-=1;
p/=2; p/=2;
p+=1; p+=1;
//tmp = (int32_t)(taenzer_state.pos/10000);
//printf("%ld\n", tmp);
//printf("temp1: %d\n", tmp); //printf("temp1: %d\n", tmp);
//TODO fix bounds //TODO fix bounds
//if(tmp < -7500/abzug_speed/2) //if(tmp < -7500/abzug_speed/2)
// tmp = -7500/abzug_speed/2; // tmp = -7500/abzug_speed/2;
//printf("temp2: %d\n", tmp); //printf("temp2: %d\n", tmp);
if(p < 0.75) if(p < 0.5)
p = 0.75; p = 0.5;
if(p > 1.5) if(p > 2)
p = 1.5; p = 2;
uint16_t base_speed = (7500/abzug_speed); uint16_t base_speed = (14000/abzug_speed);
uint16_t ctrl_speed = base_speed * p; uint16_t ctrl_speed = base_speed * p;
if(ctrl_speed <= 70) if(ctrl_speed <= 70)
@ -111,6 +118,7 @@ void do_spule(){
ICR5 = ctrl_speed; ICR5 = ctrl_speed;
OCR5C = ICR5/2; OCR5C = ICR5/2;
ICR1 = ICR5/TRANS_ROT_FACTOR; ICR1 = ICR5/TRANS_ROT_FACTOR;
OCR1A = ICR1/2; OCR1A = ICR1/2;
@ -148,10 +156,11 @@ ISR(TIMER5_OVF_vect) {
//PORTH &= ~(1<<5); //PORTH &= ~(1<<5);
static uint16_t steps = 0; static uint16_t steps = 0;
steps++; steps++;
if(steps == 50000){ if(steps == 25000){
windings++; windings++;
steps=0; steps=0;
printf("windungen: %d\n", windings); printf("windungen: %d\t", windings);
printf("trans pos: %ld\n", taenzer_state.pos);
} }
if(windings == windings_wakeup){ if(windings == windings_wakeup){
@ -179,5 +188,5 @@ ISR(TIMER5_OVF_vect) {
OCR1A = ICR1/2; OCR1A = ICR1/2;
printf("nachlauf abbauen\n"); printf("nachlauf abbauen\n");
} }
//PORTH |= (1<<5); //;PORTH |= (1<<5);
} }

@ -12,7 +12,7 @@
#include <stdlib.h> #include <stdlib.h>
#define TAENZER_KRAFT_SETPOINT 12000 #define TAENZER_KRAFT_SETPOINT 12000
#define TAENZER_KRAFT_HYST 1000 #define TAENZER_KRAFT_HYST 500
taenzer_state_t taenzer_state; taenzer_state_t taenzer_state;
@ -68,12 +68,20 @@ void do_taenzer(){
#if PLC_MQTT_ENABLED #if PLC_MQTT_ENABLED
send_settings(); send_settings();
#endif #endif
if(taenzer_state.homed == 1 && read_Input(BTN_KRAFT_MINUS, LEVEL))
{
kraftsensor_zero_offset = -(kraftsensor_value-kraftsensor_zero_offset);
}
} }
if (read_Input(BTN_KRAFT_MINUS, RISING)) { if (read_Input(BTN_KRAFT_MINUS, RISING)) {
taenzer_state.force_setpoint -= 1000; taenzer_state.force_setpoint -= 1000;
#if PLC_MQTT_ENABLED #if PLC_MQTT_ENABLED
send_settings(); send_settings();
#endif #endif
if(taenzer_state.homed == 1 && read_Input(BTN_KRAFT_PLUS, LEVEL))
{
kraftsensor_zero_offset = -(kraftsensor_value-kraftsensor_zero_offset);
}
} }
if (read_Input(BTN_TAENZER_START, RISING)) { if (read_Input(BTN_TAENZER_START, RISING)) {
taenzer_state.active = 1; taenzer_state.active = 1;
@ -84,7 +92,7 @@ void do_taenzer(){
int32_t err = (kraftsensor_value - taenzer_state.force_setpoint); int32_t err = (kraftsensor_value - taenzer_state.force_setpoint);
double pid_out = pid(&regler, err); double pid_out = pid(&regler, err);
int16_t out = (int16_t)pid_out; int32_t out = (int32_t)pid_out;
ICR4 = 400000/abs(out); ICR4 = 400000/abs(out);
OCR4A = ICR4/2; OCR4A = ICR4/2;
@ -98,12 +106,15 @@ void do_taenzer(){
set_Output(MOTOR_TAENZER_DIR, 1); // direction: up set_Output(MOTOR_TAENZER_DIR, 1); // direction: up
TCCR4B |= _BV(CS41); //TURN ON TCCR4B |= _BV(CS41); //TURN ON
} }
else else{
TCCR4B &= ~_BV(CS41); //TURN OFF TCCR4B &= ~_BV(CS41); //TURN OFF
} }
}
else else
TCCR4B &= ~_BV(CS41); //TURN OFF TCCR4B &= ~_BV(CS41); //TURN OFF
} }
//else
// TCCR4B &= ~_BV(CS41); //TURN OFF
} }
void timer4_init() void timer4_init()