ADC med PIC 16F873 HJÆLP !!!

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
hej

Er igang med at lave et lille projekt med en PIC16F873 som har 5 analoge
indgange.

Jeg har det problem at jeg ikke kan få den til at læse spændingen rigtigt.
Der sker det at spændingen er 1/3 af det den skulle være. Det vil sige at
den viser ca. 1.2 V når man med et multimeter måler 4.5V.
Hvis man så hæver spænding fra 4.5 til 5V så springer den vildt hurtigt på
det sidste stykke.

Her er mit C- program. Det eneste jeg kan skyde på må være galt er noget med
Right eller Left justifikation i PIC'en eller er der andre der har et
foreslag?

Der sidder et VFD display på til udlæsningen og jeg sender spænding ind på
CH2.
----------------------------------------------------------------------------
------
#include <pic.h>
#include <string.h>
#include <delay.h>
#include <stdio.h>
#include <\ht-pic\samples\delay.c>


bank1 unsigned char text [20];  // Array til tekst på diplay

int temp;
double temp1 ,temp2;

void lcd()
{
  int i;
  for (i=0; i<strlen(text); i++)
  {
    PORTB = text[i];
    PORTC = 192;
    PORTC = 0;
  }
  for (i=0; i<40-strlen(text); i++)
  {
    PORTB = 32;    // Fill rest with space
    PORTC = 192;
    PORTC = 0;
  }
}

void pulse(void)
{
    int i;

    RC3 = 1;    // Send puls afsted med en varighed på "temp" længde
    for (i=1; i<temp; i++)
      DelayUs(23);   // 100 uS ved 3.2678 MHz krystal
    RC3 = 0;
}


void main(void)
{
  int ch1, ch2, ch3, ch4, ch5, ch5;

  DelayMs(20);    // Vent så VFD er klar til at modtage data
  TRISA = 255;    // Port A til input
  TRISB = 0;    // Port B til output
  TRISC = 0;    // Port C til output

  RBIE = 0;    // interrupt on change disabled
  PEIE =0;    // Pereferial interrupt disabled
  GIE = 0;    // global interrupt disabled

  ADCON0 = 129;    // 00.000.0.0.1 - 2Tosc. Ch0. DONE, x, A/D-operating
  ADCON1 = 128;    // 1.000.0000  - MSB_of_adrh_0.xxx.All_to_analog

  T1CON = 1;    // Enable Timer 1

  PORTB = 56;    // 8 Bit interface
  PORTC = 128;
  DelayMs(3);
  PORTC = 0;

  PORTB = 12;    // Display on, Cursor off, Blink off
  PORTC = 128;
  DelayMs(3);
  PORTC = 0;

  PORTB = 1;    // Clear display
  PORTC = 128;
  DelayMs(3);
  PORTC = 0;

  TMR1H = 0; // Reset 16 bit counter 1
  TMR1L = 0;
  TMR0  = 0; // Reset 8 bit counter 0

  do {
    sprintf(text, "xxxx Universe");
    lcd();


    ADCON0 = 1;    // Start A/D konverter CH 1
    ADGO = 1;
    while(!ADIF);   // Vent til A/D konvertering er færdig
    ch1 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding

    ADCON0 = 9;    // Start A/D konverter CH 2
    ADGO = 1;
    while(!ADIF);
    ch2 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding
    ch1 = ADRESL;
    ch2 = ADRESH;

    ADCON0 = 21;   // Start A/D konverter CH 3
    ADGO = 1;
    while(!ADIF);
    ch3 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding

    ADCON0 = 29;   // Start A/D konverter CH 4
    ADGO = 1;
    while(!ADIF);
    ch4 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding

    ADCON0 = 37;   // Start A/D konverter CH 5
    ADGO = 1;
    while(!ADIF);
    ch5 = (ADRESH * 256) + ADRESL; // konverter til 16 bit og gem spænding


    temp1 = (5.0 / 1023.0) * ch1; // konverter de 16 bit til en spænding 0-5
Volt
    temp2 = (5.0 / 1023.0) * ch2;
    sprintf(text, "%d  %d", ch1, ch2);
    lcd();

    temp = 5.0;    // Startpuls på 0.5 mS
    pulse();
    temp = 10.0 + (10.0 / 1023.0 * ch1);
    pulse();
    temp = 10.0 + (10.0 / 1023.0 * ch2);
    pulse();
    temp = 10.0 + (10.0 / 1023.0 * ch3);
    pulse();
    temp = 10.0 + (10.0 / 1023.0 * ch4);
    pulse();
    temp = 10.0 + (10.0 / 1023.0 * ch5);
    pulse();


  } while(1);
}





Re: ADC med PIC 16F873 HJÆLP !!!


Quoted text here. Click to load it



Hvad gør du med ch1 og ch2 herover? Det ser ikke rigtigt ud.

/Bo.

Re: ADC med PIC 16F873 HJÆLP !!!


Quoted text here. Click to load it
spænding
Quoted text here. Click to load it

Det er kun for at se af low og high byte fra AD konverteren på mit display
(midlertidig).

--
Tom




Re: ADC med PIC 16F873 HJÆLP !!!


Quoted text here. Click to load it

Jamen, senere udlæser du med:

temp1 = (5.0 / 1023.0) * ch1; // konverter de 16 bit til en spænding 0-5
Volt
    temp2 = (5.0 / 1023.0) * ch2;
    sprintf(text, "%d  %d", ch1, ch2);
    lcd();

og i kanal2 rutinen øverst har du erstattet (ADRESH * 256) + ADRESL
med ADRESL.

Har du så ikke over skrevet dine variabler for kanal1 og kanal2?

Jeg er IKKE en haj til C, som det sikkert kan ses af ovenstående :o)

/Bo.

Site Timeline