Hallo,
mein offtopic Kommentar mit dem "zeitkritisch" ist hier nicht relevant, hatte ich im Text aber geschrieben.
Die Ausgabe ist wie folgt.
Rohwert Meßwert,
Rohwert Statusbyte,
Dezimalwert vom Rohwert ohne jede Umrechnung,
Dezimalwert vom Statusbyte.
Wenn Gain high ist und wird als low ausgelesen/übertragen, dann wird wohl tatsächlich was nicht stimmen, vielleicht liest der Code auf dem falschen Pegel ein ... mal schauen.
Fragen.
Was liegt am Pin ...
AIN(+)
AIN(-)
REFIN(+)
REFIN(-)
für ein Spannungswert an ?
An welchen Pin liegt dein Meßsignal an?
Was machst du mit Pin 2 vom Arduino? Weil das ist keine exakte Gleichspannung. Da wird ein PWM Signal erzeugt. Das ist getaktet. Der Funktionsname analogWrite ist leider irreführend. Das muss mindestens mit einem RC Glied geglättet werden bevor du das an den AD weiterleitest. Bevor das nicht sicher läuft, sollte man besser immer feste bekannte Gleichspannungswerte anlegen. Zum Bsp. mit einem Spannungsteiler erzeugt. Wegen dem Timingdiagramm. Habe mir noch das Datenblatt vom HX711 rangezogen, da wird das besser dargestellt. Habe die Takterzeugung geändert.
Versuch mal dein Glück mit dem geänderten Code.
/*
Doc_Arduino - german Arduino Forum
IDE 1.8.5
Arduino Mega2560
30.06.2018
- Takterzeugung geändert
- filter settling time hinzugefügt
*/
const byte GAIN = 40;
const byte PDRST = 41;
const byte FILTER = 42;
const byte SCLK = 52; // Takteingang vom AD
const byte DIN = 50; // Datenausgang vom AD
struct t_data
{
bool ready_flag = false;
int32_t data_measurement = 0;
uint8_t data_status = 0;
} AD;
void setup() {
Serial.begin(9600);
pinMode(SCLK, OUTPUT);
pinMode(DIN, INPUT_PULLUP);
pinMode(GAIN, OUTPUT);
pinMode(PDRST, OUTPUT);
pinMode(FILTER, OUTPUT);
digitalWrite(GAIN, HIGH); // GAIN (0 = Gain 128; 1 = Gain 1
digitalWrite(PDRST, HIGH); // Power-Down / Reset -> PIN muss High sein damit ADC aktiv ist
digitalWrite(FILTER, HIGH); // 0 = 16,7 Hz || 1 = 10 Hz
delay(300); // filter settling time
}
void loop () {
AD.ready_flag = detect_ready();
if (AD.ready_flag) { // Ready erkannt, lese Daten ein ...
read_data();
}
show_daten(); // aller 500ms
} // loop ENDE
void read_data() // 32 Bits einlesen
{
for (uint8_t i=24;i>0;i--) { // 24 Durchläufe, MSB first
digitalWrite(SCLK, HIGH); // Clocktakt erzeugen
digitalWrite(SCLK, LOW);
if ( digitalRead(DIN) ) { // wenn Data HIGH ist, dann
AD.data_measurement |= (1UL << i); // Bits ver_ODERN
}
}
for (uint8_t i=8;i>0;i--) { // 8 Durchläufe
digitalWrite(SCLK, HIGH); // Clocktakt erzeugen
digitalWrite(SCLK, LOW);
if ( digitalRead(DIN) ) {
AD.data_status |= (1 << i);
}
}
}
bool detect_ready ()
{
AD.data_measurement = 0;
AD.data_status = 0;
bool valid = false;
if ( !digitalRead(DIN) ) { // DOUT/READY auf "LOW" ?
valid = true;
}
return valid;
}
void formatiere_daten (int32_t data)
{
for (char i=23;i>=16;i--) {
Serial.print(bitRead(data,i));
}
Serial.print('.');
for (char i=15;i>=8;i--) {
Serial.print(bitRead(data,i));
}
Serial.print('.');
for (char i=7;i>=0;i--) {
Serial.print(bitRead(data,i));
}
Serial.print('\t');
}
void show_daten ()
{
static uint32_t last_ms = 0;
if (millis() - last_ms < 500) return; // Abbruch
last_ms = millis();
formatiere_daten(AD.data_measurement); Serial.print('\t'); // Debug
formatiere_daten(AD.data_status); Serial.print('\t'); // Debug
Serial.print(AD.data_measurement); Serial.print('\t');
Serial.println(AD.data_status);
}