Hallo,
ich habe den ADuCM362 so programmiert, dass der interne DAC 1,2V ausgibt und diese Spannung am ADC-pin AIN0 wieder eingelesen wird (anliegende Spannung mit Messgerät kontrolliert).
Im Datenblatt https://www.analog.com/media/en/technical-documentation/user-guides/aducm362-363-hardware-reference-manual-ug-1048.pdf auf Seite 33 ist die Formel zum Umrechnen der ADC-Werte in eine Spannung angegeben: V = Vref / 2^28 * ADCxDAT.
Die interne Vref ist auf 1,2V eingestellt, der Gain ist auf 1 eingestellt, die Ausgabewerte sollen "unsigned" sein.
Die Spannung 1,2V an AIN0 ergibt laut Debugger den ADC-Wert ~5577120, was sich mit der o.g. Formel zu 0,0249V errechnet.
Meine Erwartung ist, dass der ADC-Wert viel größer sein müsste, um mit der Formel wieder auf 1,2V zu kommen. Was könnte das Problem sein?
Detaillierte ADC-Einstellungen im Code:
1
// Mask in dividual ADC interupt flags
2
AdcMski(
3
pADI_ADC1,// Port
4
ADCMSKI_RDY,// mask ready interrupt
5
1);// write masks then read ADCnMSKI
6
7
// Set filter details
8
AdcFlt(
9
pADI_ADC1,// Port
10
125,// sinc decimation factor
11
0,// averaging factor
12
FLT_NORMAL);// no extra filter
13
14
// Set ADC measurement range
15
AdcRng(
16
pADI_ADC1,// Port
17
ADCCON_ADCREF_INTREF,// use internal reference (1.2V)
18
ADCMDE_PGA_G1,// gain of 1
19
ADCCON_ADCCODE_UINT);// truncate negative values to 0
20
21
// Configure ADC buffers
22
AdcBuf(
23
pADI_ADC1,// Port
24
ADCCFG_EXTBUF_OFF,// both external reference buffers powered down
25
ADCCON_BUFBYPN|ADCCON_BUFBYPP|ADCCON_BUFPOWP|ADCCON_BUFPOWN);// bypass negative/positive reference buffer, power down positive/negative reference buffer
ich habe den ADuCM362 so programmiert, dass der interne DAC 1,2V ausgibt
und diese Spannung am ADC-pin AIN0 wieder eingelesen wird (anliegende
Spannung mit Messgerät kontrolliert).
auf Seite 33 ist die Formel zum Umrechnen der ADC-Werte in eine Spannung
angegeben: V = Vref / 2^28 * ADCxDAT.
Die interne Vref ist auf 1,2V eingestellt, der Gain ist auf 1
eingestellt, die Ausgabewerte sollen "unsigned" sein.
Die Spannung 1,2V an AIN0 ergibt laut Debugger den ADC-Wert ~5577120,
was sich mit der o.g. Formel zu 0,0249V errechnet.
Im PDF steht in der drittletzten Zeile dies:
Although the ADC is nominally 24 bits, [...], resulting in a useful
signal range of ±1.2 V to 1.05 μV, which equates to approximately 2,285,000:1,
or 21 bits. The result is placed in Bits[27:7] of ADCxDAT.
Auf S. 34 steht ganz oben, was die anderen Bits im 32-Bit Register bedeuten.
Bit[0:3] = 0 (Bit 0...6 würde ich es aus der Grafik so interpretieren.)
Bit[4:6] = noise
Bit[7:27] = Data
Bit[28:31] = Sign
Vermutlich ist der 24-Bit ADC-Wert in Bit[4:27], wobei die untersten 3 Bit nur Rauschen ist und nichts aussagen.
Je nach Verstärkungsfaktor verschiebt sich auch der Speicherbereich und auch die Bitlänge des ADC-Wertes.
ich habe den ADuCM362 so programmiert, dass der interne DAC 1,2V ausgibt
und diese Spannung am ADC-pin AIN0 wieder eingelesen wird (anliegende
Spannung mit Messgerät kontrolliert).
auf Seite 33 ist die Formel zum Umrechnen der ADC-Werte in eine Spannung
angegeben: V = Vref / 2^28 * ADCxDAT.
Die interne Vref ist auf 1,2V eingestellt, der Gain ist auf 1
eingestellt, die Ausgabewerte sollen "unsigned" sein.
Die Spannung 1,2V an AIN0 ergibt laut Debugger den ADC-Wert ~5577120,
was sich mit der o.g. Formel zu 0,0249V errechnet.
Im PDF steht in der drittletzten Zeile dies:
Although the ADC is nominally 24 bits, [...], resulting in a useful
signal range of ±1.2 V to 1.05 μV, which equates to approximately 2,285,000:1,
or 21 bits. The result is placed in Bits[27:7] of ADCxDAT.
Auf S. 34 steht ganz oben, was die anderen Bits im 32-Bit Register
bedeuten.
Bit[0:3] = 0 (Bit 0...6 würde ich es aus der Grafik so interpretieren.)
Bit[4:6] = noise
Bit[7:27] = Data
Bit[28:31] = Sign
Vermutlich ist der 24-Bit ADC-Wert in Bit[4:27], wobei die untersten 3
Bit nur Rauschen ist und nichts aussagen.
Je nach Verstärkungsfaktor verschiebt sich auch der Speicherbereich und
auch die Bitlänge des ADC-Wertes.
Hallo,
vielen Dank für Dein Feedback.
Die anderen Seiten im Datenblatt habe ich mit Kopfzerbrechen auch durchgeschaut. Es steht aber trotzdem klar drin: "The ADCxDAT register output format allows the user to easily calculate the voltage measured by the ADC". Die Formel dazu habe ich oben erwähnt, warum also sollte man trotzdem anfangen müssen, an dem ADC-Wert rumzuwerkeln? Ich verstehe Deinen Gedanken, vor allem mit Sicht auf Seite 34. Aber was kann ich jetzt ändern? Wenn ich an der Formel einige Bits runtergehe (2^24, 2^21) passt das Ergebnis nicht. Wenn ich am ADC-Wert Bits wegnehme, wird der Wert ja noch kleiner...
Die ADC-Read-Funktion sieht übrigens so aus:
1
/**
2
@brief int32_t AdcRd(ADI_ADC_TypeDef *pPort)
3
==========Reads the ADC status.
4
@param pPort :{pADI_ADC0, pADI_ADC1}
5
- pADI_ADC0 for ADC0.
6
- pADI_ADC1 for ADC1.
7
@return ADC data (ADCxDAT). MSb of data is bit 27. Bits 28 to 31
8
give extended sign. \n
9
Value of 0x0fffffff => VRef. \n
10
Value of 0x00000000 => 0V. \n
11
Value of 0xF0000000 => -Vref. \n
12
@warning Returns ADCxDAT even if it does not contain new data.
13
**/
14
15
16
int32_tAdcRd(ADI_ADC_TypeDef*pPort)
17
{
18
returnpPort->DAT;
19
}
Das bedeutet, mit meinen 1,2V (=Vref) an AIN0, müsste ich vom ADC einen Wert in der Nähe von 0x0fffffff bekommen?
Wenn ich an der Formel einige Bits runtergehe (2^24, 2^21)
passt das Ergebnis nicht.
Du sollst nicht mit den Bits runtergehen, sondern ausblenden bzw. nur die ADC-Werte Bits nehmen und dann entsprechend shiften, also von [27:4] nach [23:0] schieben und dann die untersten 3 Bits vernachlässigen (noise) =>
[23:0] &= 0x7FFFF8 (wenn ich mich nicht verzählt habe). Das wird wohl die AdcRd()-Funktion machen. Vllt. mal mim Debugger reinspringen und ankucken.
ich habe den ADuCM362 so programmiert, dass der interne DAC 1,2V ausgibt
und diese Spannung am ADC-pin AIN0 wieder eingelesen wird (anliegende
Spannung mit Messgerät kontrolliert).
I.d.R. ist es so, dass wenn der ADC sampled, der Eingangswiderstand des ADC klein wird (ein paar hundert Ohm bis ein paar kOhm) und dann die Spannung am ADC-Eingang zusammenbricht. Das sieht man mit einem Scope aber nicht mit einem Messgerät. Von daher ist es immer sinnvoll, einen Buffer vor dem ADC-Eingang zu schalten bzw. den eingebauten zu aktivieren.
Vllt. mal mim Debugger bis kurz vor AdcRD()-Fkt. durchlaufen und dann Step by Step über die AdcRD() laufen und mim Scope mal kucken, wie dann die Spannung am Eingang AIN0 sich verhält. Möglicherweise siehst du dann einen kurzen Einbruch.