Compare commits
5 Commits
e938862cde
...
c62792a864
| Author | SHA1 | Date | |
|---|---|---|---|
| c62792a864 | |||
| 0b5dc619a6 | |||
| 21099092c0 | |||
| 93debb7dd6 | |||
| 393da679e0 |
@@ -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);
|
||||||
|
|||||||
29
spule.c
29
spule.c
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
17
taenzer.c
17
taenzer.c
@@ -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(®ler, err);
|
double pid_out = pid(®ler, 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()
|
||||||
|
|||||||
Reference in New Issue
Block a user