mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analogauswertung


Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich wollte mit meinem PIC über A2 einen Analogwert einlesen und ihn dann
über ein Terminalprogramm anzeigen lassen. Allerdings wird mir dann der
doppelte Wert angezeigt.
Kann mir einer sagen ob der Fehler in der Analogverarbeitung oder an der
Kommunikation mit dem PC liegt?

Hier ein Auszug:

void adInit()
{
adcs0 = 1;
adcs1 = 1;
pcfg0 = 0;
pcfg1 = 0;
pcfg2 = 0;
pcfg3 = 0;

adfm = 1;
adon = 1;
}

float ReadAnalog()
{
int16 i=0;
chs0 = 0;
chs1 = 1;
chs2 = 0;
delay_us(10);
godone =1;
adwert=0;

     while(i<255)
      {
      adwert = adwert + read_adc();
      i++;
      }
godone =0;
return (adwert/i)/100;
}

void GetWert(float wert)
{
char ascii[50];
  int8 i;
sprintf(ascii,"Analogwert %3.1f V",wert);
  For (i=0;i<LENGTH_ASCII;++i)
  {
    putc(ascii[i]);
  }
putc(CR);
}

#INT_RDA
void isr_rda()
{
 LED1=1;
   rx_buffer[rx_count]= getc();
   ++rx_count;
  flag=1;
}

void main()
{
set_tris_a(0b11111111);
set_tris_b(0b11111111);
set_tris_c(0b11111100);
port_b_pullups(FALSE);
serialInit();  // Initialisierung der RS232-Schnittstelle
adInit();
ENABLE_INTERRUPTS(INT_RDA);
ENABLE_INTERRUPTS(GLOBAL);
   while (1)
   {
   wert=ReadAnalog();
   checkusart();
   if(rx_buffer[rx_p]==0x30)   GetWert(wert);
   }
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann mir einer sagen ob der Fehler in der Analogverarbeitung oder an der
>Kommunikation mit dem PC liegt?

Mach doch hier mal

float ReadAnalog()
{

 //return (adwert/i)/100;
 return 123.45;
}

Wird der richtige Wert gesendet liegt es nicht an
der Kommunikation ;)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und hier

  For (i=0;i<LENGTH_ASCII;++i)

mach mal

  For (i=0;i<strlen(ascii);i++)

Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich,
float ReadAnalog()
{

 //return (adwert/i)/100;
 return 123.45;
}
angebe werden mir auch die 123.45 angezeigt. Auch wenn ich ein const 
char abfrage erhalte ich ein korrektes Ergebnis, nur bei Ausgabe des 
Analogwertes bekomme ich ein falsches Ergebnis zurück.
Auch die Änderung von For (i=0;i<LENGTH_ASCII;++i) nach 
For(i=0;<strlen(ascii);i++) hat leider nichts gebracht.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann liegt dein Fehler in ReadAnalog() und vermutlich in read_adc();

Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber was kann man bei read_adc falsch machen es ist doch eine Funktion 
des ccs Compilers und ReadAnalog() sollte ja auch richtig sein. Hab 
ReadAnalog auch anderst geschrieben wo ich keinen Mittelwert bilde und 
bekomme trotzdem einen falschen Wert zurück.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber was kann man bei read_adc falsch machen es ist doch eine Funktion
>des ccs Compilers und ReadAnalog() sollte ja auch richtig sein. Hab
>ReadAnalog auch anderst geschrieben wo ich keinen Mittelwert bilde und
>bekomme trotzdem einen falschen Wert zurück.

Ich hab keine Ahnung was du misst, wie die Schaltung
aussieht oder welchen PIC du benutzt. Möglicherweise
irgendeine falsche Einstellung der Referenzspannung
oder sonst irgendein Unsinn. Fehler in der Compiler LIB
nicht ausgeschlossen.

Vieleicht liegt der Fehler dann ja hier?

void adInit()
{
adcs0 = 1;
adcs1 = 1;
pcfg0 = 0;
pcfg1 = 0;
pcfg2 = 0;
pcfg3 = 0;

adfm = 1;
adon = 1;
}

Welchen Wert bekommst du denn wenn du nur mal so
1.0V an den AD Eingang legst?

Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab die interne Referenzspannung eingestellt. Bei einer Spannung von 
2,5V messe ich 4,9V und wenn ich Masse anlege messe ich eine Spannung 
von 0,9V.

Autor: Martin S. (mast4)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich hab jetzt meinen Code nur auf die Analogauswertung reduziert aber 
der Fehler tritt weiterhin auf. Kann mir bitte jemand helfen ich komm da 
einfach nichtmehr weiter.

Zum Code: Internal_ADC_Clock, All_Analog, Referenzspannung Intern,
Kanal 2, es wird eine Spannung von 2,5V an Eingang A2 angelegt, dann 
wird der Mittelwert gebildet und wenn die Spannung größer als 4V ist 
gehen zwei LEDs an.

#include <16F876.h>

#DEVICE *=16
#DEVICE ADC=10
#DEVICE ICD = TRUE
#FUSES HS, NOWDT, PROTECT, PUT, NOBROWNOUT, NOLVP, DEBUG
#ZERO_RAM
#USE delay (clock=20000000)
#USE fast_io(A)
#USE fast_io(B)
#USE fast_io(C)
#bit  LED1    = 0x07.0       //Pin C0
#bit  LED2    = 0x07.1       //Pin C1

void main()
{

  int16 v = 0;
  int8 i;
  set_tris_a(0b11111111);
  set_tris_b(0b11111111);
  set_tris_c(0b11111000);
  port_b_pullups(FALSE);

  LED1=1;
  LED2=1;
  delay_ms(500);
  LED1=0;
  LED2=0;
  delay_ms(500);

  SETUP_ADC(ADC_CLOCK_INTERNAL);
  SETUP_ADC_PORTS(0);
  set_adc_channel(2);

  delay_us(10);

  For(i=0;i<10;++i)
  {
    v += read_adc();
  }
  v /= i;

While(1)
  {
    delay_ms(500);
  if(v>4)
   {
  LED1=1;
  LED2=1;
   }
   else{
   LED1=1;
   }
     delay_ms(500);
  }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.