Forum: Mikrocontroller und Digitale Elektronik Brückenschaltung Werte ausgeben


von Hans-Peter (Gast)


Lesenswert?

Hallo zusammen,


Ich habe eine Brückenschaltung die mir bei nicht betätigten Sensor eine 
Spannung von 0,6mv liefert.
beim betätigen des Sensor erhalte ich 0,9mv

wenn ich das ganze an meinen Mikrocontroller anschließe, dann erhalte 
ich
Werte zwischen 13 und 19

wenn ich dann meine Brückenschaltung belaste, erhalte ich werte von 
17-26

Ich denke, dass es ein Problem mit einem Datentyp ist. sodass dieser 
falsch rundet etc.

Ich benutze die interne Referenzspannung von 2,56V
die Brückenschaltung wird mit 5V betrieben

kann mir jemand sagen was ich falsch mache?

vielen Dank im voraus
1
#ifdef F_CPU
2
#undef F_CPU
3
#define F_CPU 16000000UL
4
#endif
5
6
#include <avr/io.h>
7
#include <inttypes.h>
8
#include <util/delay.h>
9
#include <stdint.h>
10
#include <stdio.h>
11
12
13
14
15
// Diese Beispiel zeigt die Anwendung des ADC eines ATmega169
16
// unter Verwendung der internen Referenzspannung von nominell 1,1V.
17
// Zur Anpassung an andere AVR und/oder andere Referenzspannungen
18
// siehe Erläuterungen in diesem Tutorial und im Datenblatt
19
20
/* ADC initialisieren */
21
void ADC_Init(void)
22
{
23
  // die Versorgungsspannung AVcc als Referenz wählen:
24
  //ADMUX = (1<<REFS0);
25
  // oder interne Referenzspannung als Referenz für den ADC wählen:
26
  ADMUX = (1<<REFS1) | (1<<REFS0);
27
28
  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
29
  // schon auf 0, also single conversion
30
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
31
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
32
33
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
34
liest
35
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
36
lassen" */
37
38
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
39
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der  Konvertierung warten
40
  }
41
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
42
     Wandlung nicht übernommen. */
43
  (void) ADCW;
44
}
45
46
/* ADC Einzelmessung */
47
uint16_t ADC_Read( uint8_t channel )
48
{
49
  // Kanal waehlen, ohne andere Bits zu beeinflußen
50
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
51
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
52
  while (ADCSRA & (1<<ADSC) ) {   // auf Abschluss der Konvertierung warten
53
  }
54
  return ADCW;                    // ADC auslesen und zurückgeben
55
}
56
57
58
void USART_Init( unsigned int baud )
59
  {
60
    /*Set baud rate*/
61
    UBRR0H = (unsigned char)(baud>>8);
62
    UBRR0L = (unsigned char)baud;
63
    /* Enable receiver and transmitter*/
64
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
65
    /* Set frame format: 8data, 2stop bit*/
66
    UCSR0C = (1<<USBS0)|(3<<UCSZ00);
67
  }
68
69
70
  void USART_Transmit( unsigned char data )
71
  {
72
    /* Wait for empty transmit buffer*/
73
    while
74
     ( !( UCSR0A & (1<<UDRE0)) );
75
    /* Put data into buffer, sends the data*/
76
    UDR0 = data;
77
  }
78
79
  void uart_puts( char *s )
80
  {
81
    /* while *s != '\0' so unequally "string-end characters (terminator)
82
*/
83
    while (*s)
84
    {
85
      USART_Transmit(*s);
86
87
      s++;
88
    }
89
  }
90
91
92
void main(void)
93
{
94
  USART_Init(0x6);
95
  char String[32] = {"Test "};
96
  long ADCWert;
97
  ADC_Init();
98
  //ADCWert = 123;
99
  while(1)
100
  {
101
    ADCWert = ADC_Read(0b01111);//Seite 249 Datenblatt Kanal 2,3
102
    //ADCWert = (ADCWert - ADCWert) + (ADCWert - 0.65) / 0.5825;
103
    //ADCWert = ((ADCWert * 582) / 1000);
104
    sprintf(String,"Waage2: %i g \n", ADCWert);
105
    uart_puts(String);
106
    //USART_Transmit(S);
107
        _delay_ms(100);
108
  }
109
110
}

von sib4 (Gast)


Lesenswert?

Möchtest du einmal aufzeichnen, wie die Brücke mit dem A/D-Eingang 
verbunden ist und wie sie belastet wird?

von MaWin (Gast)


Lesenswert?

Hans-Peter schrieb:
> Ich denke, dass es ein Problem mit einem Datentyp ist. sodass dieser
> falsch rundet etc.

Da du eine Differenzmessung mit rechts-alignten 10 bits machst, 
bekommmst du Werte von +512..-512, die von ADC_Read als 512..0,1023..511 
geliefert werden. Aber deine Spannungswerte und Ergebnisse sind sowieso 
beide immer leicht positiv, also spielt das keine Rolle.

Richtig wäre:

ADCWert = ADC_Read(..); if(ADCWert>512) ADCWert=-1024+ADCWert;


> Ich benutze die interne Referenzspannung von 2,56V
> die Brückenschaltung wird mit 5V betrieben

Die 5V schwanken doch völlig unabhängig von den 2.56V. Du musst die 
Brückenspeisespannung schon aus der Referenzspannung ableiten, oder AREF 
auf VCC schalten, sonst misst du doch eher die Störungen auf den 5V als 
den Messwert der Brücke.

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.