Forum: Mikrocontroller und Digitale Elektronik ADC - Dehnungsmesstreifen


von Hans B. (hans_b92)


Angehängte Dateien:

Lesenswert?

Liebe Alle,

ich betreibe einen Atmega32 (8 Mhz Quarz) um die Rückgabewerte eines 
Dehnungsmessstreifens (verstärkt um 1000 per INA333, Schaltplan ist 
angehängt - VO geht dann auf PA0) per ADC auszumessen. Die Software 
besteht im Großen und Ganzen aus den Forenelementen und ist angehängt.

Wenn ich mir die Werte ausgeben lasse, dann erhalte ich im unbelasteten 
Zustand (wie auch bei gleichmäßiger Belastung) stark schwankende 
Rückgabewerte, bspw:

794, 857, 836, 862, 841, 855, 849, 847, 842, 834, 822, 845

Dafür, dass der DMS keine Belastung hat, schwanken mir die Werte viel zu 
stark. Die grundsätzliche Funktionalität ist vorhanden, wird Druck 
aufgegebn steigt der Wert signifikant. Die Erhöhung oder Erniedrigung 
der Anzahl an Messungen pro Durchgang bringt weder Verbesserung noch 
Verschlechterung.

Erwarte ich zu viel oder liegt ein grundsätzlicher Fehler in Hard- oder 
Software vor?

Beste Grüße
1
#define F_CPU 8000000UL   
2
3
#include <stdlib.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <util/delay.h>
7
#include <string.h>
8
#include <stdio.h>
9
10
#define UART_BAUDRATE  9600
11
#define UART_SETTING  ((F_CPU/16L/UART_BAUDRATE)-1)
12
13
14
#define PRESCALER      64
15
#define PRESCALER_BITS (1<<CS22) 
16
 
17
#define MILLISEC_BASE  ( F_CPU / PRESCALER / 1000 )
18
#define CENTER         ( MILLISEC_BASE / 2 ) 
19
20
#define debounce( port, pin )            \
21
({                  \
22
  static uint8_t flag = 0;  \
23
  uint8_t i = 0;              \
24
                  \
25
  if( flag ){   \
26
    for(;;){       \
27
      if( !(port & 1<<pin) ){   \
28
  i = 0;      \
29
  break;                \
30
      }                  \
31
      _delay_us( 98 );     \
32
      if( --i == 0 ){    /* ... until key >25ms released */  \
33
  flag = 0;    /* clear press flag */      \
34
  i = 0;      /* 0 = key release debounced */    \
35
  break;                \
36
      }                  \
37
    }                  \
38
  }else{      /* else check for key press: */    \
39
    for(;;){      /* loop ... */        \
40
      if( (port & 1<<pin) ){  /* ... until key released or ... */  \
41
  i = 0;      /* 0 = bounce */      \
42
  break;                \
43
      }                  \
44
      _delay_us( 98 );    /* * 256 = 25ms */      \
45
      if( --i == 0 ){    /* ... until key >25ms pressed */  \
46
  flag = 1;    /* set press flag */      \
47
  i = 1;      /* 1 = key press debounced */    \
48
  break;                \
49
      }                  \
50
    }                  \
51
  }                  \
52
  i;        /* return value of Macro */    \
53
})
54
55
//
56
// Konfiguration der Servoleitungen
57
//
58
#define NR_SERVOS      3
59
#define SERVO_DDR      DDRD
60
#define SERVO_PORT     PORTD
61
uint8_t ServoPuls[NR_SERVOS] = { 1<<PD6, 1<<PD5, 1<<PD4, 0,
62
                 0,      0, 0, 0};
63
64
// uint8_t ServoPuls[NR_SERVOS] = { 1<<PD6, 1<<PD5 };
65
//
66
// Werte für die Servoposition
67
// Gültige Werte laufen von 0 bis 2 * CENTER
68
// 0           ... ganz links
69
// CENTER      ... Mittelstellung
70
// 2 * CENTER  ... ganz rechts
71
//
72
volatile uint8_t ServoValue[NR_SERVOS]; 
73
74
volatile uint16_t sekunden, msekunden;
75
76
ISR (TIMER2_COMP_vect) 
77
{
78
  static uint8_t ServoId = 0;
79
 
80
  //
81
  // den Puls des aktuellen Servos beenden
82
  //
83
  SERVO_PORT &= ~ServoPuls[ServoId];
84
 
85
  //
86
  // welches ist das nächste aktuelle Servo?
87
  //
88
  if( ++ServoId >= NR_SERVOS )
89
    ServoId = 0;
90
 
91
  //
92
  // die Ausgangsleitung fuer dieses Servo auf 1; den Puls beginnen
93
  //
94
  SERVO_PORT |= ServoPuls[ServoId];
95
 
96
  //
97
  // den Timer so einstellen, dass bei Pulsende, die ISR erneut aufgerufen wird
98
  //
99
  OCR2 = MILLISEC_BASE + ServoValue[ServoId];
100
}
101
102
ISR(TIMER0_COMP_vect)
103
{
104
  static int count, count_sek;
105
  
106
  count_sek++;
107
108
  if(count_sek == 10)
109
  {
110
    msekunden++;
111
    count_sek = 0;
112
113
    if(msekunden == 1000)
114
    {
115
      sekunden++;
116
      msekunden = 0;
117
    }
118
  }
119
}
120
121
void init_time()
122
{
123
  TIMSK|=(1<<OCIE0);
124
  TCCR0 |= (1<<WGM01) | (1<<CS01);  
125
  OCR0 = F_CPU/8/10000;      
126
}
127
128
129
130
/* ADC initialisieren */
131
void ADC_Init(void) {
132
 
133
  uint16_t result;
134
 
135
136
  ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung nutzen
137
138
  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
139
  // schon auf 0, also single conversion
140
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
141
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
142
 
143
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
144
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
145
 
146
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
147
 
148
  while (ADCSRA & (1<<ADSC) ) {}        // auf Abschluss der Konvertierung warten
149
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
150
     Wandlung nicht übernommen. */
151
  result = ADCW;
152
}
153
 
154
/* ADC Einzelmessung */
155
uint16_t ADC_Read( uint8_t channel )
156
{
157
  // Kanal waehlen, ohne andere Bits zu beeinflußen
158
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
159
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
160
  while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
161
  return ADCW;                    // ADC auslesen und zurückgeben
162
}
163
 
164
/* ADC Mehrfachmessung mit Mittelwertbbildung */
165
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t average )
166
{
167
  uint32_t ergebnis = 0;
168
 
169
  for (uint8_t i = 0; i < average; ++i )
170
    ergebnis += ADC_Read( channel );
171
 
172
  return (uint16_t)( ergebnis / average );
173
}
174
175
void setup_uart()
176
{
177
  UBRRH = (char) (UART_SETTING >> 8);
178
  UBRRL = (char) (UART_SETTING);
179
  UCSRB = (1<<RXEN) | (1<<TXEN);
180
181
  UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
182
}
183
184
void uart_putchar(char c)
185
{
186
  // Warten bis Buffer bereit ...
187
  while (!(UCSRA & (1 << UDRE)))
188
    ;
189
190
  // Senden...
191
  UDR = c;
192
}
193
194
void uart_putstring(char *str)
195
{
196
  unsigned char i;
197
198
  for (i=0;i<255;i++) 
199
  {
200
    if (str[i] != 0)
201
      uart_putchar(str[i]);
202
    else
203
      break; // Ende des Strings erreicht
204
  }
205
}
206
207
208
209
char uart_getchar()
210
{
211
  // Ist schon ein Zeichen im Buffer?
212
  if (bit_is_set(UCSRA, RXC))
213
    return UDR;
214
  else 
215
    return -1;
216
}
217
218
void uart_readline(char *str)
219
{
220
  char c;
221
  unsigned char index;
222
  
223
  index = 0;
224
225
  while (1)
226
  {
227
    c = uart_getchar();
228
    if (c != -1)
229
    {
230
    
231
232
233
      if (c == 13) 
234
      {
235
        str[index] = 0;
236
237
        return;
238
      }
239
      else 
240
      {
241
242
    
243
        str[index] = c;
244
        index++;
245
      }
246
    }
247
  }
248
}
249
250
void InitServo()
251
{
252
  uint8_t i;
253
 
254
  //
255
  // Die Servoleitungen auf Ausgang stellen
256
  //
257
  SERVO_DDR = ServoPuls[0] | ServoPuls[1];
258
 
259
  //
260
  // Alle Servos in Mittelstellung
261
  //
262
  for( i = 0; i < NR_SERVOS; ++i )
263
    ServoValue[i] = (CENTER + (CENTER/2));
264
 
265
  //
266
  // Timer auf CTC Modus konfigurieren
267
  //
268
  OCR2 = MILLISEC_BASE + ServoValue[0];
269
  TIMSK |= (1<<OCIE2);
270
  TCCR2 = (1<<WGM21) | PRESCALER_BITS;  // CTC mode
271
}
272
273
 
274
int main()
275
{
276
277
  uint16_t adcval;
278
  uint16_t remember;
279
280
  int last_sek;
281
 
282
  char Buffer[25];
283
 
284
  ADC_Init();
285
286
  DDRC=0x00;
287
  PORTC=0xff;
288
289
  DDRB=0xff;
290
  PORTB=0x00;
291
292
  InitServo();
293
  sei();                                // Interrupts global an
294
 
295
  last_sek = 0;
296
  sekunden = 0;
297
  msekunden = 0;
298
  remember = 0;
299
300
  init_time();
301
  setup_uart();
302
303
  uart_putstring("Setup UART: check\r\n");
304
305
  ServoValue[0] = (CENTER + (CENTER/2));
306
  uart_putstring("Setup Servo \r\n");  
307
  uart_putstring("check\r\n");
308
309
  while( 1 ) 
310
  {
311
312
  if(debounce(PINC, PC0))
313
  {
314
      
315
  if(ServoValue[0] == 0)
316
    ServoValue[0] = 2*CENTER;
317
  else
318
    ServoValue[0] = 0;          
319
320
  }
321
  
322
323
    if(sekunden>last_sek)
324
        {
325
  last_sek = sekunden;
326
 
327
  adcval = ADC_Read_Avg(0,200);
328
        sprintf( Buffer, "Wert: %d", adcval );
329
  uart_putstring(Buffer);
330
  }
331
  }
332
}

von W.S. (Gast)


Lesenswert?

Anstatt das Forum mit deinem Quellcode zu füllen, hättest du vielleicht 
auch mal nachdenken können.

Das, was Dehnungsmeßstreifen so an Signal abgeben, ist ziemlich klein 
und da mußt du dir eben gedanken machen um Rauschen und Einstreuungen 
aller Art. Schmeiß den OpV raus, benutze den eingebauten SAR-ADC für 
irgendwas anderes, aber nicht zum Messen !! und nimm einen ordentlichen 
Sigma-Delta-ADC, der von sich aus ne integrierende Funktionsweise hat. 
Obendrein solltest du die ADC-Eingänge ordentlich gegen HF und NF (50 
Hz) abblocken, damit der ADC es leischter hat und du solltest dir 
Gedanken um die Temperaturstabilität deiner Widerstände machen.

W.S.

von digitaler fritz (Gast)


Lesenswert?

Alles rausschmeissen ?
Er will doch zuerst etwas dazulernen.

Klarstellen was am Aufbau verbessert werden kann.

von Purzel H. (hacky)


Lesenswert?

Und eine Bruecke wird immer radiometrisch betrieben. Nicht mit einer 9V 
Batterie, die macht was sie will...

von Hans B. (hans_b92)


Lesenswert?

Erstmal vielen Dank für die Antworten - ich taste mich derzeit an das 
Thema heran und versuche dementsprechend die Schwächen auszuloten.

Betrieben wird das System über ein Netzteil (9V).

Ist der Ansatz umfassend unbrauchbar oder kann ich mit Maßnahmen die 
Werte im derzeitigen Aufbau verbessern?

von Anja (Gast)


Lesenswert?

Hans B. schrieb:
> ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler

und natürlich wieder mal den ADC gepimpt mit 1MHz ADC-Takt.
(sonst dauert die Mittelwertbildung so lange und das Servo fängt an zu 
zappeln)


Gruß Anja

von Andreas G. (beastyk)


Lesenswert?

Moin,

an V+, V- mal Kondensatoren gegen Masse hängen (0,1 µF) und den Ref-Pin 
nicht frei rumliegen lassen...LINK: 
http://e2e.ti.com/support/amplifiers/precision_amplifiers/f/14/t/120585.aspx

von Hans B. (hans_b92)


Lesenswert?

Hi Anja,

das war keine Absicht, danke für den Hinweis. Habe den Vorteiler auf 64 
erhöht und sollte damit innerhalb der geforderten 50 - 200 kHz Breite 
liegen.

Grüße

von MaWin (Gast)


Lesenswert?

> Ist der Ansatz umfassend unbrauchbar

Du misst im wesentlichen die Schwankungen der 9V des Netzteils im 
Verhältnis zu den geregelten aber wechselnd belasteten 5V.

Versorge wenigstens den DMS mit AREF, also der Referenzspannung des 
A/D-Wandlers.

Inwieweit man dann mit kleinen Kondensatoren noch kurze Schwankungen 
glätten kann, sei dahingestellt, letztlich kann man auch in Software den 
Mittelwert bilden.

Da auch die 5V Versorgung eines uC schwankt, sollte man ARef aus einer 
Referenzspannung gewinnen.

von Hans B. (hans_b92)


Angehängte Dateien:

Lesenswert?

Hi Alle,

da ich bei der obigen Schaltung sehr viele Störungen hatte habe ich mir 
eine verbesserte Variante überlegt (Schaltung im Anhang). Aber leider 
funktioniert die nicht so wie sie soll. Ich messe zwar beim Eingang zum 
INA333 sehr schön die Belastung der DMS-Streifen und kann auch gut mit 
den Potis ein Nullabgleich machen, doch leider kommt am Ausgang des 
INA333 keine Belastungsveränderung  mehr raus sondern immer nur ein 
konstanter Wert von 3,2V.

Sieht jemand was ich falsche mache? Bin für Tipps und Anregungen wie 
immer sehr dankbar.

von Clair Grube (Gast)


Lesenswert?

Bist du sicher, dass die Versorgung des INA333 (V-) stimmt?

von Hans B. (hans_b92)


Lesenswert?

Ja laut Datenblatt sollen da im singel betrieb 1,8V-5,5V als 
Versorgungspannung anliegen.Ach ja und die Spannungsversorgung von 5V 
und 9V ist mit der Schaltung aus dem AVR-Tut realiesiert.

von Quirk (Gast)


Lesenswert?

nach Schaltplan ist die Masse des INA333 nicht mit Masse verbunden....

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

In der neuen Schaltung sind so viele Fehler enthalten, dass es schon 
schmerzt.

Der eklatanteste Fehler besteht darin, dass sich die Eingangsspannungen 
des INA oberhalb der Versorgungsspannung befinden. Das mögen eigentlich 
nur weniger spezielle Hochvolt-Instrumentenverstärker. Was soll das bloß 
R9?

Die Versorgung der DMS-Brücke erfolgt auch nicht mit einer Spannung, die 
aus derselben Referenz abgeleitet wird wie die Referenzspannung des 
A/D-Wandlers und des REF-Anschlusses des INA, sondern weiterhin direkt 
aus dem Netzteil. Ein größerer Murks ist kaum vorstellbar.

V- des INA ist zwar sauber abgeblockt, aber überhaupt nicht 
angeschlossen.

Und die Wirkung der Abgleichpotentiometer ist auch sehr zweifelhaft, da 
sie nicht nur den Nullpunkt verschieben, sondern erheblichen Einfluss 
auf die Steilheit der Brücke haben.

Der hohe Querstrom durch die Spannungsreferenz führt auch nur zu 
unnötiger Erwärmung und damit Instabilität. Stattdessen sollte sie mit 
wesentlich geringerem Strom betrieben und dafür für die zu erzeugenden 
Spannungen entsprechenden Wandler (OP) eingesetzt werden.

von Hans B. (hans_b92)


Lesenswert?

Hi

hatte viel zu tun, so das ich mich jetzt erst wieder darum kümmern 
konnte. Danke erst mal an Alle für die Hilfe.

Ich muss Herrn Schweigstill recht gebe,n die Schaltung ist wirklich 
murks. Ich bekomme sie zwar zum laufen, aber die Störungen sind noch 
schlimmer als bei der ersten Schaltung.

Ich habe langsam keine Ahnung mehr wie ich die Schaltung aufbauen soll 
kann mir da jemand helfen?

Ich schildere mal kurz meine Ziele.

Ich habe aus eine Küchenwaage Wäagezelle mit zwei DMS Streifen, der eine 
ist quer und der andere längs, auf einen kleinen Stahlbalken aufgeklebt. 
Mit diesen will ich das Gewicht von Gläsern und dessen Inhalt bestimmen. 
Der Messbereich soll zwischen 0 bis 1000g liegen und möglichst eine 
grammgenaue Auflösung haben.

Meine Herangehensweise war bis jetzt so, das ich die DMS Streifen mit 
zwei Widerständen zu einer Vollbrücke aufbaue und die beiden 
Ausgangsspannungen mit dem Instrumentenverstärker INA333 verstärke und 
dann über den ADC des ATmega32 auswerte.

Bis jetzt sind jedoch alle meine versuche an den Störungen gescheiter.

Die Versorgungspannung der Brücke und des Atemgas erfolgt mittels 
Spannungsregler und Kondensatoren wie im AVR-Tut. Für den ADC des ATmega 
habe ich bis jetzt immer die interne Refspannung genutzt.

Bei der letzten Schaltung wollte ich die Brückenspannung erhöhen, da ich 
so bei Belastung der Wäagezelle eine größere Spannungsänderung am 
Brückenausgang habe, aber das scheint ja nicht so gut zu sein.


Ich bin für jeden Schaltungsvorschlag Dankbar da ich an dem Ding langsam 
verzweifle.

MfG

von gk (Gast)


Lesenswert?

Das Thema Waage und DMS kommt hier alle paar Wochen. Klapper doch 
erstmal die Forenbeiträge ab. Das erste Schaltbild war schon mal gar 
nicht so schlecht.
Bis auf die DMS Versorgung und der offene Ref-Anschluss, der gehört an 
Masse, da die Brücke nur einseitig belastet wird.
Möglicherweise kommen Deine Störungen aber auch von Seiten der Software.
gk

von Hans B. (hans_b92)


Lesenswert?

Liebe Alle,

danke erneut für die Befassung im Rahmen der vorherigen Beiträge. Mit 
ist bislang schlichtweg unklar, welche Aufgabe der Vref Pin am INA333 
hat. Kann mir das jemand erklären?

Im Endeffekt möchte ich das Messdelta der unbelasteten Wäagezelle zur 1 
kg-Belastung möglichst groß im 10-Bit bereich des Atmega32ADC abbilden; 
bin mir aber der nötigen Mathematik nicht ganz schlüssig.

Viele Grüße
Hans

von Purzel H. (hacky)


Lesenswert?

>danke erneut für die Befassung im Rahmen der vorherigen Beiträge. Mit
ist bislang schlichtweg unklar, welche Aufgabe der Vref Pin am INA333
hat. Kann mir das jemand erklären?


Ist es denn so schwierig das Datenblatt zu diesem INA333 zu lesen? Das 
Originaldatenblatt vom Hersteller, nicht eine abgespeckte Kopie eines 
Trittbrettfahrers.

Ohne das Datenblatt gesehen zu haben ... Der Refpin bezieht sich auf den 
Ausgang. Der eingang ist differentiell, dh hat keinen Bezug zu 
irgendwas, ausser, dass beide Eingangspins innerhalb der Speisespannung 
liegen muessen. Die Ausgangsspannung ist nun diese Eingangsdifferenz 
verstaerkt und bezueglich dem Refpin. Diese Referenzspannung muss man 
vorgeben. zB auf GND oder auf Vcc(ADC)/2

von gk (Gast)


Lesenswert?

Die Spannung am VRef-Pin bewirkt eine Offsetverschiebung des 
Ausgangssignals. Ist die Eingangsdifferenzspannung des Ina's null, steht 
am Ausgang VRef an.

Im Falle einer Waage z.B. würde man VRef an Masse anschliessen, damit 
ohne Belastung am Ausgang 0 Volt ansteht und bei maximaler Belastung 
Umax.

Bei einem DMS-Aufnehmer, der Zug und Druckbelastungen erfassen soll, 
würde man  an VRef die Hälfte der maximalen Eingangsspannung(Umax) des 
AD-Wandlers anschliessen.

Ein Poti an VRef anzuschliessen ist übrigens keine gute Idee, denn der 
VRef-Pin muss niederohmig angeschlossen werden.

gk

von PittyJ (Gast)


Lesenswert?

Ich habe vor ein paar Jahren auch DMS angesteuert. Mein Elektroniker 
hatte allerdings eine wesentliche komplexere Schaltung entworfen, um die 
Stabilität zu erhöhen.
Benutzt hatten wir dann einen 24-Bit AD-Wandler. Der wurde mehrfach 
overgesampelt und einige Bits hinten wurden gleich weggelassen.

Nach meinen Erfahrungen muss man bei DMS einiges noch an Software 
dazupacken. Und mit nur 10 Bit Auflösung eines AD-Wandlers sollte man 
gar nicht herangehen, da man die letzten 3 Bits getrost ignorieren kann.

von Erich (Gast)


Lesenswert?

Wie PittyJ schon andeutet:
Es ist fraglich, ob sowas mit dem eingebauten A/D eines uC sauber 
umsetzbar ist.
Auf jeden Fall muss auf saubere Spannungsversorgung geachtet werden, 
möglichst NICHT aus einem Schaltnetzteil, sonder im Linearregler.
Sind separate Gnd/Vcc des A/D Teils vorhanden, sowie ordentliche 
Referenzspannungen?
Auch spielt die Leitungsführung (Layout) sicher eine grosse Rolle, und 
mit Stütz-C nicht geizen.

von Hans B. (hans_b92)


Lesenswert?

Hallo,

vorab: Datenblatt und verwandte Threads hier im Forum habe ich gelesen. 
Mangels entsprechender Kenntnisse, bleibt das Meiste jedoch unklar -> 
deshalb meine Fragen hier.

Zu der Beschaltung des VREF wird für eine Waage Masse und für einen 
DMS-Aufnehmer 1/2 Umax vorgeschlagen. Während sich mir das erste noch 
erschließt, ist mir der Wert 1/2 Umax nicht klar. Woher kommt dieser?

Ziel ist wie gesagt die Spiegelung auf die Gesamtbandbreite des ADC. 
Vorliegend bringt die Brückenspannung unbelastet bereits 40 mV. Wie 
erzeuge ich denn hier einen Nullabgleich?

Mittlerweile ist mir wohl auch klar, dass ich einen entsprechenden 
externen ADC verwenden sollte (24 Bit). Da ich 3 Wäagezellen ausmessen 
möchte, müsste deren Kommunikationsmöglichkeiten für den mc 
unterscheidbar sein. Gibts da Bauteile mit entsprechender Logik oder 
brauche ich für jeden externen ADC einen mc? Ich habe hier ein paar von 
TI rumfliegen, kann aber mangels Zugriff erst heute Abend die genaue 
Bezeichnung bzw. Datenblötter einsehen. Alternativ: Gibt es für solche 
Anwendungen besonders geeignete ADC?

Grüße

von gk (Gast)


Lesenswert?

Hans B. schrieb:
> Zu der Beschaltung des VREF wird für eine Waage Masse und für einen
> DMS-Aufnehmer 1/2 Umax vorgeschlagen. Während sich mir das erste noch
> erschließt, ist mir der Wert 1/2 Umax nicht klar. Woher kommt dieser?


Nehmen wir mal an Dein A-/D-Wandler hat einen Eingangsbereich von 0..5 
Volt.

1.) Bei einer Waage würdest Du Dein Messsignal so verstärken, dass bei 
null Belastung das Eingangssignal des Wandlers 0 Volt beträgt. Bei 
maximaler Belastung eben 5 Volt.

2.) Bei einem Zug-Druck Kraftaufnehmer würde man den Verstärker z.B. so 
dimensionieren, dass man bei maximaler Zugbeanspruchung des Aufnehmers 
am A-/D-Wandler 5V anstehen hat, ohne Belastung 2,5V und bei maximaler 
Druckbeanspruchung 0 V. Und das geht sehr elegant, indem man stabile 
2,5V an den VRef Eingang anlegt. Das kann man mit einer Referenz machen, 
oder mit einem temperaturstabilen Spannungsteiler mit nachschalteten 
OP-Amp Buffer, z.B. dem TLE 2426.

Hans B. schrieb:
> Vorliegend bringt die Brückenspannung unbelastet bereits 40 mV.

Das ist schon relativ viel. Die Frage ist ob die 40mV durch die 
unterschiedlichen Widerstände der DMS enstehen oder ob diese sich aus 
der zur Vollbrücke ergänzten Beschaltung ergeben. Wenn die beiden 
Ergänzungswiderstände eine Toleranz von 1% haben, ergeben sich im 
üngünstigsten Fall schon 5mV/V.

Hans B. schrieb:
> Wie > erzeuge ich denn hier einen Nullabgleich?

Indem Du die Ergänzungswiderstände entsprechend anpasst. Zum Test kannst 
Du ein Trimmer in den Mittelpunkt zwischen den beiden Widerständen 
schalten, an dem etwa 80mV abfällt.

Hans B. schrieb:
> einen entsprechenden externen ADC verwenden sollte (24 Bit).

Ein hochauflösender ADC stellt auch entsprechend höhere Ansprüche an die 
analoge Signalverarbeitung. 2mV/V mit 24 bit aufgelöst ergeben ca. 120 
pV/V.

Hans B. schrieb:
> Gibts da Bauteile mit entsprechender Logik oder brauche ich für jeden einen 
externen ADC.

Es gibt auch mehrkanalige ADCs oder man verwendet sogenannte 
Multiplexer. Ich würde aber estmal die obige Schaltung mit dem im µC 
eingebauten Wandler zum Laufen bringen.

gk

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.