Compare commits

...

8 Commits

@ -1,5 +1,7 @@
#include <avr/io.h> #include <avr/io.h>
#include <stdint.h>
#include "avrIOhelper/io-helper.h" #include "avrIOhelper/io-helper.h"
#include "common.h"
uint16_t abzug_speed = 100; uint16_t abzug_speed = 100;
@ -14,8 +16,11 @@ void timer3_init()
DDRE |= 1 << 4; DDRE |= 1 << 4;
} }
uint8_t get_abzug_state(){
return TCCR3B & _BV(CS31);
}
void send_settings(void); extern void send_settings(void);
void do_abzug(){ void do_abzug(){
if (read_Input(BTN_ABZUG_EIN, RISING)) { if (read_Input(BTN_ABZUG_EIN, RISING)) {

@ -7,5 +7,6 @@ extern uint16_t abzug_speed;
void do_abzug(void); void do_abzug(void);
void timer3_init(void); void timer3_init(void);
uint8_t get_abzug_state(void);
#endif #endif

@ -34,9 +34,9 @@ void do_kraftsensor(){
/* read 2 16bit values and merge to 32bit signed integer */ /* read 2 16bit values and merge to 32bit signed integer */
readReg(1,0,2); readReg(1,0,2);
if(wait_receive(2, m_data, 100)){ if(wait_receive(2, m_data, 10)){
kraftsensor_valid = 0; kraftsensor_valid = 0;
//printf("modbus error\n\r"); printf("modbus error\n\r");
} }
else{ else{
kraftsensor_valid = 1; kraftsensor_valid = 1;
@ -45,24 +45,24 @@ void do_kraftsensor(){
//kraftsensor_value = tmp; //kraftsensor_value = tmp;
/* conversion magic to milliNewton */ /* conversion magic to milliNewton */
kraftsensor_read = ((tmp + 197700 /*539363*/)*9.81)/177.380; kraftsensor_value = ((tmp + 197700 /*539363*/)*9.81)/177.380;
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){
kraftsensor_value = old_value; // kraftsensor_value = old_value;
//printf("delta: %ld\tvalue:%ld\n", kraftsensor_read - old_value, kraftsensor_read); // //printf("delta: %ld\tvalue:%ld\n", kraftsensor_read - old_value, kraftsensor_read);
//printf("spike\n"); // //printf("spike\n");
} // }
else{ // else{
kraftsensor_value = kraftsensor_read; // kraftsensor_value = kraftsensor_read;
//printf("jump\n"); // //printf("jump\n");
} // }
} //}
else{ //else{
kraftsensor_value = kraftsensor_read; // kraftsensor_value = kraftsensor_read;
} //}
last_read = kraftsensor_read; //last_read = kraftsensor_read;
old_value = kraftsensor_value; //old_value = kraftsensor_value;
} }
} }

@ -198,16 +198,13 @@ int main()
set_Output(BitPH5, ON); set_Output(BitPH5, ON);
while(1)
{
wdt_reset(); // WDT reset at least every sec
#if PLC_MQTT_ENABLED #if PLC_MQTT_ENABLED
if(millis() < 10)
send_settings(); send_settings();
#endif #endif
while(1){
wdt_reset(); // WDT reset at least every sec
ioHelperReadPins(); ioHelperReadPins();
ioHelperDebounce(); ioHelperDebounce();
ioHelperEdgeDetector(); ioHelperEdgeDetector();

@ -50,6 +50,14 @@ static void spule_onoff(uint8_t state){
} }
} }
void set_spooling_speed(uint16_t speed){
ICR5=speed;
OCR5C = ICR5/2;
ICR1 = ICR5/TRANS_ROT_FACTOR;
OCR1A = ICR1/2;
}
void do_spule(){ void do_spule(){
//PORTH &= ~(1<<5); //PORTH &= ~(1<<5);
if(read_Input(IN_SPULE_HOME, LEVEL) && spule_trans_homed == 0){ if(read_Input(IN_SPULE_HOME, LEVEL) && spule_trans_homed == 0){
@ -69,22 +77,38 @@ void do_spule(){
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
} }
else if(taenzer_state.pos <= 10){ else if(!get_abzug_state()){
if(read_Input(BTN_WICKELN_EIN, LEVEL)){
set_spooling_speed(300);
spule_onoff(1);
}
else
spule_onoff(0); spule_onoff(0);
} }
else{ else{
/* speed regulation - keep taenzer at 10% */ /* speed regulation - keep taenzer at 10% */
int32_t tmp = 0;//(100 - (int32_t)taenzer_state.pos/1000); float p = 100.0/(int32_t)(taenzer_state.pos/1000);
p-=1;
p/=2;
p+=1;
//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(tmp < -35) if(p < 0.75)
tmp = -35; p = 0.75;
if(p > 1.5)
p = 1.5;
uint16_t base_speed = (7500/abzug_speed);
uint16_t ctrl_speed = base_speed * p;
if(ctrl_speed <= 70)
ctrl_speed = 70;
ICR5=7500/abzug_speed + tmp; ICR5 = ctrl_speed;
OCR5C = ICR5/2; OCR5C = ICR5/2;
ICR1 = ICR5/TRANS_ROT_FACTOR; ICR1 = ICR5/TRANS_ROT_FACTOR;
@ -96,7 +120,7 @@ void do_spule(){
if (read_Input(BTN_WICKELN_AUS, RISING)) { if (read_Input(BTN_WICKELN_AUS, RISING)) {
spule_onoff(0); spule_onoff(0);
} }
}
if (read_Input(BTN_INIT, RISING)) { if (read_Input(BTN_INIT, RISING)) {
spule_trans_homed = 0; spule_trans_homed = 0;
taenzer_state.homed = 0; taenzer_state.homed = 0;
@ -104,7 +128,6 @@ void do_spule(){
windings = 0; windings = 0;
windings_wakeup = 0; windings_wakeup = 0;
} }
}
//PORTH |= (1<<5); //PORTH |= (1<<5);
} }

@ -5,6 +5,7 @@
#include "kraftsensor.h" #include "kraftsensor.h"
#include "notaus.h" #include "notaus.h"
#include "pid_controller.h" #include "pid_controller.h"
#include "common.h"
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
@ -46,7 +47,7 @@ double pid(PID_vars *vars, double current_err) {
return output; return output;
} }
void send_info(void); extern void send_settings(void);
void do_taenzer(){ void do_taenzer(){
/* Homing */ /* Homing */
@ -65,13 +66,13 @@ void do_taenzer(){
if (read_Input(BTN_KRAFT_PLUS, RISING)) { if (read_Input(BTN_KRAFT_PLUS, RISING)) {
taenzer_state.force_setpoint += 1000; taenzer_state.force_setpoint += 1000;
#if PLC_MQTT_ENABLED #if PLC_MQTT_ENABLED
send_info(); send_settings();
#endif #endif
} }
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_info(); send_settings();
#endif #endif
} }
if (read_Input(BTN_TAENZER_START, RISING)) { if (read_Input(BTN_TAENZER_START, RISING)) {