Forum: Mikrocontroller und Digitale Elektronik LTC2468 SPI ADC Hilfe zu Execution Timing


von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Hallo,

ich bin gerade am verifizieren eines Code-Schnipsels. Da ich mich beim 
Hardware-Aufbau darauf verlassen muss, dass die Ausführung korrekt ist 
(weil ich die Werte nicht anders überprüfen kann) und mit SPI noch nicht 
so erfahren hoffe ich auf eure Erfahrung gepaart mit scharfem Verstand 
;-)

Der Aufbau:
Ein Multichannel-ADC Wandler konvertiert und schickt die Daten eines in 
diesem Fall einzelnen Channels. Es wird (hier) nur ein EINZELNER Channel 
von den vier möglichen des ADC verwendet, auf dem liegen aber 
Zeitgemultiplext wiederum vier Signale einer Spektroskopiemessung. Bevor 
jemand fragt warum: Weil später 16 Signale gemessen werden sollen, dann 
werden natürlich auch die anderen Channel des ADC verwendet.
Das Programm läuft/soll so laufen, dass die "Mainboard-Einheit", von der 
der Code-Auszug gleich kommt, das nächsten zu aktivierenden (LED)-Signal 
einschaltet, daraufhin der ADC die Messung übernimmt, ausgelesen wird 
und erst nach der Aktivierung des nächsten (LED-)Signals wieder anfängt 
zu konvertieren - denn ich möchte selbstverständlich keine Integrierten 
Misch-Messungen verschiedener Spektroskopiesignale.

Nun zum Code. Bei mir steht das derzeit so (natürlich werden die Daten 
an einer anderen Stelle aus der Variable adc_receive auch ausgelesen):
1
uint16_t adc_config;
2
uint32_t adc_receive; 
3
while (1){
4
channel_administrator(&config, &info);            // Calculate next active Channel and buffer last configuration in "info"
5
        adc_config=generate_configuration(&config);            // Prepare next ADC-Configuration-Word
6
        module_set_channel(config.active_mod, config.active_ch);  // Set next active channel (NIRS Module)
7
        
8
        SPI_activate_slave();                    // Activate ADC (Read)
9
        while(!LTC2486_conversion_complete());            // Wait until ADC Value (last setup) is ready;
10
        module_activate(config.active_mod);          // Activate Module
11
        _delay_ms(5);                        // 5ms dwell time
12
        adc_receive = LTC2486_SPI_get_value(adc_config);      // Get ADC Value, Config for next Measurement
13
        SPI_deactivate_slave();                    // Deactivate ADC/ Start new AD-Conversion
14
}

Zu den Funktionen:
- channel_administrator() und generate_configuration() sowie 
module_set_channel() sind lediglich konfigurationsfunktionen, die den 
nächsten Channel bestimmen und anlegen. Was die machen ist hier also 
nicht so wichtig
- SPI_activate_slave() zieht den Slave-Select auf LOW,
- SPI_deactivate_slave() zieht den Slave-Select auf HIGH,
- module_activate() schaltet die LED (das Spektroskopiesignal) ein
- LTC2486_conversion_complete() überprüft den SDO Pin des ADC, der LOW 
geht, sobald eine Conversion fertig ist
- LTC2586_SPI_get_value() holt den letzten ADC wert und schreibt die 
neue Konfiguration.

Nun ist das Verhalten des LTC2586  auf S. 11-13 
http://cds.linear.com/docs/en/datasheet/2486fd.pdf eigentlich eindeutig 
beschrieben - ich habe den Code so ausgelegt, dass er passen SOLLTE. nur 
sicher bin ich mir nicht, weil der ADC so wie ich das verstanden habe 
sofort eine neue Conversion anfängt, wenn man ihn ausgelesen hat (d.h. 
hier muss auch das nächste LED-Signal anliegen) - oder wenn CS HIGH wird 
bevor die Übertragung beendet wurde.

Könnt ihr mir eine Rückmeldung geben, ob die Execution so Sinn macht 
oder nicht? Ich möchte wie gesagt nicht, dass der ADC noch konvertiert, 
während gerade ein LED-Channel (am selben Messeingang) umgestellt oder 
erst eingeschaltet wird.

Ich hoffe alles war klar genug, sonst beantworte ich natürlich gerne 
alle Fragen!!
Herzlichen Dank!
Alex

: Bearbeitet durch User
von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Ist es zu unverständlich oder nur zu doof?

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.