Compare commits
7 Commits
ec757f57f8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 3973ed17de | |||
| 7c9500f690 | |||
| 9c26592d38 | |||
| 9c6079bdee | |||
| 192913a95b | |||
| 029cb594cb | |||
| 0ba716fb3e |
85
README.md
Normal file
85
README.md
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
# Wägetransmitter Modbus
|
||||||
|
|
||||||
|
Ein Steuergerät zum Auslesen einer Wägezelle, angebunden über Modbus RTU.
|
||||||
|
Die Wandlung des analogen Wägezellen-Signals basiert auf dem HX711 IC;
|
||||||
|
auf einem Atmel AVR (ATmega328p) ist der Modbus-Slave implementiert.
|
||||||
|
|
||||||
|
|||
|
||||||
|
|:---:|:---:|
|
||||||
|
|
||||||
|
### Schnittstellenparameter RS485/Modbus RTU
|
||||||
|
|
||||||
|
| Parameter | Wert |
|
||||||
|
|----------------|--------|
|
||||||
|
| Baudrate | 115200 |
|
||||||
|
| Datenbits | 8 |
|
||||||
|
| Parität | none |
|
||||||
|
| Stopbits | 1 |
|
||||||
|
| Modbus Adresse | 1 |
|
||||||
|
|
||||||
|
Das Gerät stellt den 24-bit ADC Wert in 2er-Komplement Darstellung über zwei
|
||||||
|
Holding-Register bereit. Somit ergibt sich ein 32-bit signed Integer Datentyp.
|
||||||
|
|
||||||
|
| Register Adresse | Wert |
|
||||||
|
|------------------|-----------|
|
||||||
|
| 0 | ADC[0:15] |
|
||||||
|
| 1 | 8xADC[23],ADC[22:16]|
|
||||||
|
|
||||||
|
#### Beispiel:
|
||||||
|
Abfragen des Wertes mit dem Tool modpoll (https://www.modbusdriver.com/modpoll.html)
|
||||||
|
```
|
||||||
|
user@pc:~$ modpoll -b 115200 -p none -t4:int /dev/ttyUSB0
|
||||||
|
modpoll 3.10 - FieldTalk(tm) Modbus(R) Master Simulator
|
||||||
|
Copyright (c) 2002-2021 proconX Pty Ltd
|
||||||
|
Visit https://www.modbusdriver.com for Modbus libraries and tools.
|
||||||
|
|
||||||
|
Protocol configuration: Modbus RTU, FC3
|
||||||
|
Slave configuration...: address = 1, start reference = 1, count = 1
|
||||||
|
Communication.........: /dev/ttyUSB0, 115200, 8, 1, none, t/o 1.00 s, poll rate 100 ms
|
||||||
|
Data type.............: 32-bit integer, output (holding) register table
|
||||||
|
|
||||||
|
-- Polling slave... (Ctrl-C to stop)
|
||||||
|
[1]: -242457
|
||||||
|
-- Polling slave... (Ctrl-C to stop)
|
||||||
|
[1]: -242440
|
||||||
|
```
|
||||||
|
|
||||||
|
### HX711
|
||||||
|
|
||||||
|
Über den Jumper `JP1` kann eine Samplerate von 10Hz oder 80Hz gewählt werden.
|
||||||
|
|
||||||
|
### LEDs
|
||||||
|
|
||||||
|
| LED | Signal |
|
||||||
|
|-----|--------|
|
||||||
|
| D1 | Bus Error |
|
||||||
|
| D2 | Bus Transmission |
|
||||||
|
| D3 | 5V Rail |
|
||||||
|
|
||||||
|
### Klemmenbelegung
|
||||||
|

|
||||||
|
|
||||||
|
#### J1
|
||||||
|
| Klemme | Signal |
|
||||||
|
|--------|--------------------------------|
|
||||||
|
| 24V | Spannungsversorgung 9V bis 24V |
|
||||||
|
| GND | Masse (Bus und Versorgung) |
|
||||||
|
| A+ / B-| RS485 Bus Leitungen |
|
||||||
|
| LEDn+ | Externe LED Anode (selbes Signal, wie intern)|
|
||||||
|
| LEDn- | Externe LED Kathode |
|
||||||
|
|
||||||
|
#### J4
|
||||||
|
| Klemme | Signal |
|
||||||
|
|--------|--------------------------------|
|
||||||
|
| E+ | Spannungsversorgung Wägezelle |
|
||||||
|
| E- | Masse |
|
||||||
|
| INA- | Messsignal 1 |
|
||||||
|
| INA+ | Messsignal 2 |
|
||||||
|
|
||||||
|
### Schaltplan
|
||||||
|

|
||||||
|
|
||||||
|
### Mechanische Dimensionen
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
BIN
board/pics/3d-board.png
Normal file
BIN
board/pics/3d-board.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 208 KiB |
3222
board/pics/board-fab.svg
Normal file
3222
board/pics/board-fab.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 229 KiB |
4041
board/pics/board.svg
Normal file
4041
board/pics/board.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 327 KiB |
BIN
board/pics/picture.png
Normal file
BIN
board/pics/picture.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 784 KiB |
21832
board/pics/schematic.svg
Normal file
21832
board/pics/schematic.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 395 KiB |
63
code/main.c
63
code/main.c
@@ -1,5 +1,6 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
#include "modbus.h"
|
#include "modbus.h"
|
||||||
|
|
||||||
@@ -7,12 +8,9 @@
|
|||||||
|
|
||||||
uint16_t holdingRegisters[4];
|
uint16_t holdingRegisters[4];
|
||||||
|
|
||||||
void timer0100us_start(void) {
|
volatile uint32_t led_on_timer[3];
|
||||||
TCCR0B|=(1<<CS01); //prescaler 8
|
|
||||||
TIMSK0|=(1<<TOIE0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Return raw ADC data
|
// return raw ADC data
|
||||||
uint32_t HX711_get_data(uint8_t clk_PIN, uint8_t data_PIN, uint8_t gain_for_next_conv){
|
uint32_t HX711_get_data(uint8_t clk_PIN, uint8_t data_PIN, uint8_t gain_for_next_conv){
|
||||||
uint32_t data = 0;
|
uint32_t data = 0;
|
||||||
for(uint8_t i = 0; i < 24; i++){ //Start 24bit transmission
|
for(uint8_t i = 0; i < 24; i++){ //Start 24bit transmission
|
||||||
@@ -45,7 +43,7 @@ uint32_t HX711_get_data(uint8_t clk_PIN, uint8_t data_PIN, uint8_t gain_for_next
|
|||||||
extra_clk_pluses = 2;
|
extra_clk_pluses = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
extra_clk_pluses = 1;
|
extra_clk_pluses = 1;
|
||||||
}
|
}
|
||||||
for(uint8_t i = 0; i < extra_clk_pluses; i++){
|
for(uint8_t i = 0; i < extra_clk_pluses; i++){
|
||||||
PORTB |= (1 << clk_PIN); //set clock-PIN high
|
PORTB |= (1 << clk_PIN); //set clock-PIN high
|
||||||
@@ -57,35 +55,34 @@ uint32_t HX711_get_data(uint8_t clk_PIN, uint8_t data_PIN, uint8_t gain_for_next
|
|||||||
/* Convert 24bit Two's complement to 32bit Two's complement
|
/* Convert 24bit Two's complement to 32bit Two's complement
|
||||||
if MSB from 24Bit result is 1 aka negative*/
|
if MSB from 24Bit result is 1 aka negative*/
|
||||||
if(data & (1L<<23)){
|
if(data & (1L<<23)){
|
||||||
data |= 0xFFL << 24;
|
data |= 0xFFL << 24;
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void modbusGet(void) {
|
void modbusGet(void) {
|
||||||
if (modbusGetBusState() & (1<<ReceiveCompleted))
|
if (modbusGetBusState() & (1<<ReceiveCompleted))
|
||||||
{
|
{
|
||||||
switch(rxbuffer[1]) {
|
switch(rxbuffer[1]) {
|
||||||
case fcReadHoldingRegisters:
|
case fcReadHoldingRegisters:
|
||||||
PORTC ^= 1 << 1;
|
PORTC |= 1 << 0;
|
||||||
// _delay_ms(10);
|
led_on_timer[0]=1000;
|
||||||
// PORTC &= ~(1 << 1);
|
|
||||||
|
|
||||||
while(PINB & (1<<4)); // wait for data ready
|
while(PINB & (1<<4)); // wait for data ready
|
||||||
|
|
||||||
uint32_t tmp = HX711_get_data(3, 4, 128);
|
uint32_t tmp = HX711_get_data(3, 4, 128);
|
||||||
//int32_t tmp = -1000;
|
|
||||||
holdingRegisters[0] = tmp & 0xFFFF;
|
holdingRegisters[0] = tmp & 0xFFFF;
|
||||||
holdingRegisters[1] = (tmp>>16) & 0xFFFF;
|
holdingRegisters[1] = (tmp>>16) & 0xFFFF;
|
||||||
modbusExchangeRegisters(holdingRegisters,0,4);
|
holdingRegisters[2] = led_on_timer[1];
|
||||||
break;
|
modbusExchangeRegisters(holdingRegisters,0,4);
|
||||||
|
break;
|
||||||
default: {
|
default:
|
||||||
modbusSendException(ecIllegalFunction);
|
PORTC |= 1 << 1;
|
||||||
}
|
led_on_timer[1]=1000;
|
||||||
break;
|
modbusSendException(ecIllegalFunction);
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void){
|
int main(void){
|
||||||
@@ -93,19 +90,25 @@ int main(void){
|
|||||||
DDRB |= (1<<3);
|
DDRB |= (1<<3);
|
||||||
|
|
||||||
modbusSetAddress(1);
|
modbusSetAddress(1);
|
||||||
modbusInit();
|
modbusInit();
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
timer0100us_start();
|
/* modbus tick timer */
|
||||||
|
TCCR0B|=(1<<CS01);
|
||||||
|
TIMSK0|=(1<<TOIE0);
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
modbusGet();
|
modbusGet();
|
||||||
//PORTC ^= 1 << 0;
|
|
||||||
//_delay_ms(100);
|
|
||||||
//PORTC &= ~(1 << 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second
|
ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second
|
||||||
modbusTickTimer();
|
modbusTickTimer();
|
||||||
|
|
||||||
|
for(uint8_t i=0; i<2; i++){
|
||||||
|
if(led_on_timer[i]>0)
|
||||||
|
led_on_timer[i]--;
|
||||||
|
else
|
||||||
|
PORTC &= ~(1<<i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user