Compare commits

...

5 Commits

Author SHA1 Message Date
c9b79e7339 fix overflow 2022-04-02 16:27:50 +02:00
a103131163 add reset target 2022-04-02 16:26:10 +02:00
db6f03ef97 fix modbus timeout 2022-04-02 16:25:32 +02:00
54572ac7f2 introduce (crude) false-reading detection 2022-04-02 16:23:48 +02:00
f8f515dc59 reverse endianess for modbus read 2022-04-02 16:22:19 +02:00
3 changed files with 33 additions and 6 deletions

View File

@@ -38,6 +38,9 @@ load: $(BUILDDIR)/$(TARGET).hex
program: clean load program: clean load
reset:
avrdude -p $(PROGC) -c $(TOOL)
size: $(BUILDDIR)/$(TARGET).elf size: $(BUILDDIR)/$(TARGET).elf
avr-size -C --mcu=$(MCU) $(BUILDDIR)/$(TARGET).elf avr-size -C --mcu=$(MCU) $(BUILDDIR)/$(TARGET).elf

View File

@@ -1,4 +1,6 @@
#include <avr/io.h> #include <avr/io.h>
#include <stdint.h>
#include <stdlib.h>
#include <util/delay.h> #include <util/delay.h>
#include <stdio.h> #include <stdio.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
@@ -25,21 +27,42 @@ void kraftsensor_init(){
} }
void do_kraftsensor(){ void do_kraftsensor(){
static int32_t last_read;
static int32_t old_value;
uint16_t m_data[4]; uint16_t m_data[4];
int32_t kraftsensor_read;
/* 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, 10)){ if(wait_receive(2, m_data, 100)){
kraftsensor_valid = 0; kraftsensor_valid = 0;
printf("modbus error\n\r"); printf("modbus error\n\r");
} }
else{ else{
kraftsensor_valid = 1; kraftsensor_valid = 1;
int32_t tmp = (uint32_t)m_data[0]<<16; int32_t tmp = (uint32_t)m_data[1]<<16;
tmp |= m_data[1]; tmp |= m_data[0];
//kraftsensor_value = tmp;
/* conversion magic to milliNewton */ /* conversion magic to milliNewton */
kraftsensor_value = ((tmp + 539363)*9.81)/177.380; kraftsensor_read = ((tmp + 197700 /*539363*/)*9.81)/177.380;
if(abs(kraftsensor_read - old_value) > 10000){
if(abs(last_read - kraftsensor_read) > 10000){
kraftsensor_value = old_value;
printf("delta: %d\tvalue:%ld\n", kraftsensor_read - old_value, kraftsensor_read);
printf("spike\n");
}
else{
kraftsensor_value = kraftsensor_read;
printf("jump\n");
}
}
else{
kraftsensor_value = kraftsensor_read;
}
last_read = kraftsensor_read;
old_value = kraftsensor_value;
} }
} }
@@ -50,8 +73,9 @@ uint8_t wait_receive(uint8_t len, uint16_t dest[], uint8_t timeout){
while(!receiveOkay && breaker) { //wait for client response, time out after 1s while(!receiveOkay && breaker) { //wait for client response, time out after 1s
breaker--; breaker--;
_delay_ms(1); _delay_ms(1);
if(breaker==0)
return -1;
} }
printf("breaker: %d\n\r", breaker);
if(receiveOkay) { //if this fails, there was either no response or a crc error if(receiveOkay) { //if this fails, there was either no response or a crc error
if(rxbuffer[1]&0x80) { //client responded with an error code if(rxbuffer[1]&0x80) { //client responded with an error code

2
main.c
View File

@@ -72,7 +72,7 @@ static void avr_init()
} }
void send_info(void){ void send_info(void){
char msg[4]; char msg[6];
sprintf(msg, "%d", abzug_speed); sprintf(msg, "%d", abzug_speed);
mqtt_pub(&mqtt_client, "/Filamentanlage/05_Abzug/state/abzug/speed", msg, strlen(msg)); mqtt_pub(&mqtt_client, "/Filamentanlage/05_Abzug/state/abzug/speed", msg, strlen(msg));