Forum: Mikrocontroller und Digitale Elektronik Kommunikation MCU mit AD7794


von DominikH (Gast)


Lesenswert?

Hallo!

Ich programmiere gerade einen MCU, der mit dem AD7794 ADU kommunizieren 
soll. Dazu verwende ich SPI und die HAL - Bibliothek.
Die Werte des ADU lese ich im Pseudocode wie folgt aus:
ADUreset();
configureModeRegister(Unipolar, Gain_64, 50Hz, , Continuous Mode, CH1)
configureIORegister(einstellen von output current)
readDataRegister()

Das ganze funktioniert halbwegs gut, wenn auch sehr langsam. Ich arbeite 
mit HAL_Delays und diese müssen sehr viel größer als die Abtastzeit sein 
um sinnvolle Werte zu bekommen. Im Datasheet steht, dass im continous 
mode die rdy flag zu berücksichtigen ist - ich weiß nur leider nicht wie 
ich diese auslese. Hat da jemand Erfahrung mit?

LG
Dominik

von nixwiss (Gast)


Lesenswert?

Was ist ein ADU und wo ist er?
Wo ist der Code zum Ansteuern des AD7794?

von Kevin M. (arduinolover)


Lesenswert?

Du könntest den RDY Pin entweder Pollen oder als Interrupt auswerten, 
ich vermute dann musst du den Pin immer umkonfigurieren (ohne Gewähr)

Du könntest das RDY Bit im Status Register kontinuierlich lesen, statt 
den Pin auszuwerten.

Du könntest im Config Register das CREAD Bit setzen und die Daten 
einfach kontinuierlich auslesen, irgendwann ändern sie sich dann halt.

Du könntest allgemein mal das ganze Datenblatt lesen, statt nur den 
Teil, von dem du denkst das du ihn brauchst.

: Bearbeitet durch User
von DominikH (Gast)


Lesenswert?

Hi,
sorry, mir ist bewusst dass der ADU normal ADC genannt wird^^
Er befindet sich mit dem MCU auf einer Leiterplatte

Der Code für das Auslesen des Wertes lautet wie folgt:

void read_channel_1 (void)
{
   buf[0] = 0x00 | 0x10; //write to config reg
   buf [1] = 0x10 | 0x06; //unipolar, 64 gain
   buf [2] = 0x00 | 0x00; //ref 1, channel 1
   transmit (buf, 3);
   HAL_Delay(60); //if much lower, wrong output?

   buf[0] = 0x00 | 0x08; //write to mode reg
   buf[1] = 0x00; //continuous mode
   buf[2] = 0x05; //rate 50 Hz
   transmit (buf, 3);

   buf[0] = 0x00 | 0x28; //write to IO reg
   buf[1] = 0x08 | 0x01; //both currents to out 1 and 10ua
   transmit (buf, 2);
   HAL_Delay(60);

   uint32_t count;

   transmit (0x40 | 0x18); //read data reg
   HAL_Delay(60);
   receive (rbuf, 3);
   count = shift(rbuf); //shift operation

   return count;


}

von nixwiss (Gast)


Lesenswert?

DominikH schrieb:
> ich weiß nur leider nicht wie ich diese auslese.

Das RDY Flag ist ein Bit im Status Register
Zitat aus dem Datenblatt:
---------------------------------
STATUS REGISTER
RS2, RS1, RS0 = 0, 0, 0; Power-On/Reset = 0x80
(AD7795)/0x88 (AD7794)
The status register is an 8-bit read-only register. To access the
ADC status register, the user must write to the communications
register, select the next operation to be read, and load Bit RS2,
Bit RS1, and Bit RS0 with 0.
---------------------------------

von DominikH (Gast)


Lesenswert?

Danke an dich und Kevin, ist erledigt!
Mit dem auslesen des Statusregisters hat es geklappt. Tut mir leid, dass 
ich das übersehen habe, kommt nicht wieder vor.

von Kevin M. (arduinolover)


Lesenswert?

nixwiss schrieb:
> Das RDY Flag ist ein Bit im Status Register

oder ein Pin.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.