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