Lm35 till PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Lm35 till PIC

Inlägg av jacobse »

Jag försöker lära mig pic kodning och elektronik. Jag försöker nu koppla in en LM35 TO-220 tempsensor till min PIC16F690 och visa resultatet på en LCD display.

Jag får det inte att fungera. På displayen visas nått värde. Hoppar mellan några olika. Men händer inte mycket när jag värmer eller kyler den.

Jag har kopplat V+ till 5v, gnd till gnd och Vout till Ra2. Är det rätt så långt?

Jag misstänker att det är ADC funktionen som strular. Jag kodar i MikroC.

Någon som har lust att hjälpa mig att förklara hur jag ska koda den? Är som sagt ny på detta. All hjälp jag får uppskattas väldigt mycket!

/Johan
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: Lm35 till PIC

Inlägg av RoPa »

Hej,

En LM35 lämnar 10mv per grad och en 16F60 har 10 bitar A/D så det blir ca 1/2 grader ber LSB så du bör lätt få utslag om du petar på LM35'an.

Kolla att du har satt alla inställningar till den pinne du ska ha som analog in och att du har konfigurerat controll registret rätt. Jag har kört på nedan för 8 bitar A/D.

Kod: Markera allt

//Configure for internal osc at 8Mhz//
OSCCON = 0b01110001;
//Configure ADC on AN9, data in ADRESH, b7=MSB//
ADCON0 = 0b00100101; //AN9 selected//
ADCON1 = 0b00100000; //Use Fosc/32 = 4uS conversion time//
ANSEL = 0b00000000; //Turn Analog input off for AN0 - AN7//
ANSELH = 0b00000010;//and off for AN8 and AN10 - AN12 and on for AN9 only//

Kod: Markera allt

TRISC = 0b10000000; //Set port C b0-b6 as output and b7 as input
PORTC = 0b00000000; //Set RC0 - RC7 to 0 (off/low) ////

Kod: Markera allt

////////////////////////////////////////////////////////////
//AD convert AN9 at 8 bit resolution and return the result//
////////////////////////////////////////////////////////////
unsigned char adc_an9(void) {

		while (ADCON0 & 0b00000010) ; //Whait until ADC ready //
		ADCON0 = 0b00100111; //Start conversion of AN9//
		while (ADCON0 & 0b00000010) ; //Wait during conversion//

		//PORTC |= 0b00001000;	//for debug

		return ADRESH;
}
Lycka till!
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Tack så mycket för hjälpen. Är inte tillräckligt kunnig än för att förstå allt. Men lite klockare blev jag.

Tror att det är min inställning av portar som strular.
Jag vill ha analoga ingången från sensorn på RA2 eller någon annan A port. De utgående portarna är C där jag har displayen. Har du tipps på hur jag ska ställa in portarna?
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: Lm35 till PIC

Inlägg av RoPa »

Tja, RA2 går bra, det blir då AN2.

Ändra till ADCON0 = 0b00001001 i initialiseringen.
Ändra till ADCON0 = 0b00001011 i A/D rutinen //Start conversion of...

Lägg till TRISA = 0b00000100 //RA2 input (tristate) and rest output
Lägg till PORTA = 0b00000000 //All bits set to low

Att sätta porten som man använder låg är inte nödvändigt.

I ovan väljs Vref till Vdd vilket torde vara 5V i ditt fall.
Vill du ha bättre upplösning mot din LM35 som ger 10 mV per grad kan du välja extern Vref och tex koppla en spänningsdelende pot mellan +5V och GND med mitten kopplad till pin 18 (Vref) och ratta in lämplig spänning, t.ex. 2,56V vilket ger en grad per bit i 8 bitar

Ändra då ADCON0 till = 0b01001001 och 0b01001011 ovan så väljs den externa ref pinnen.

Jag vet att det är dåligt gjort att inte bara sätta b1 i A/D rutinen vilket är det enda som ska göras.
Vill du ha "snyggare" kod så byt raden till

Kod: Markera allt

ADCON0 = ADCON0 | 0b00000010; //Start conversion //
Då startar den konvertering oavsett vilken AN port du valt.

Lycka till!
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Tack så mycket för all hjälp! Har inte fått det att funka än. Ger samma resultat som tidigare. Men börjar nog närma sig. Hur ska koden för ANSEL och ANSELH se ut för mitt exempel?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lm35 till PIC

Inlägg av sodjan »

Det är mycket bättre att vi gör precis tvärtom!
*Du* visar *din* kod...
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Ska se om jag kan ordna det på nått sätt. Sitter på landet. Svårt med uppkoppling till datan. Men ska försöka fixa det. Återkommer om en stund. Tack för all hjälp!
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Här kommer min kod. Innehåller säkert massor av felaktigheter. Hoppas det går att hitta en lösning.

Kod: Markera allt

// LCD module connections
sbit LCD_RS at RC6_bit;
sbit LCD_EN at RC7_bit;
sbit LCD_D4 at RC0_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D7 at RC3_bit;

sbit LCD_RS_Direction at TRISC6_bit;

sbit LCD_EN_Direction at TRISC7_bit;
sbit LCD_D4_Direction at TRISC0_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D7_Direction at TRISC3_bit;
// End LCD module connections
unsigned int temp_res;           //variabel som lagrar värdet från sensor.
void main() {


char abc[7];

OSCCON=0b01110001;
ADCON0=0b00001001;
ADCON1=0b00100000;





TRISA  = 0b00000100;
PORTA=0b00000000;
//TRISC=0;

  ANSEL  = 0x04;                        // Configure RA2 analog input
  ANSELH = 0;
  temp_res=0;                        // sätter temp variabeln till noll från start.

Lcd_Init();
  Lcd_Out(1, 1, "Temp inne:");
  Lcd_Out(2, 1, "Temp panel:");
for(;;){

ADCON0=ADCON0 | 0b0000010;
temp_res = ADC_Read(2);   // Läseer värdet från sensor





IntToStr(temp_res, abc);      //ör om värdet från sensor till sträng

Lcd_Cmd(_LCD_CURSOR_OFF);           // Cursor off


Lcd_Out(1, 11, abc);

Delay_ms(500)        ;




  }




}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lm35 till PIC

Inlägg av sodjan »

Om du ersätter temp.givaren med något annat, t.ex ett
par motstånd som en spänningdelarna eller en enkel pot,
kan du alls få några vettiga värden från ADC'n ?

Om du provar att mata IntToString/LCD_Out med fasta/hårdkodade
värden, får du då ut dessa som det ska på displayen ?
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Satte temp_res till ett värde och det kom fint upp på displayen. Så det borde vara min config av portarna som är felaktig.
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: Lm35 till PIC

Inlägg av RoPa »

En liten kommentar, du frågar varför den inte konverterar som den ska men du visar inte konverteringskoden?

Kod: Markera allt

temp_res = ADC_Read(2);   // Läseer värdet från sensor
Säger inte oss ett smack, vad gör ADC_Read(2)?
jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Måste ha missuppfattat något grundläggande. Gjorde som i mikroc exempelprogram. Trodde den raden hämtade värdet från adc omvandlingen. Men jag har som sagt inte riktigt koll på det här än. Men hoppas att jag ska lära mig.

Har ni nått förslag på hur jag ska gå vidare för att få min kod att fungera?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lm35 till PIC

Inlägg av sodjan »

jacobse
Inlägg: 194
Blev medlem: 25 januari 2013, 23:57:40

Re: Lm35 till PIC

Inlägg av jacobse »

Så här säger ADC biblioteket från mikroe om den raden.

temp_res = ADC_Read(2); // Get 10-bit results of AD conversion

Vet inte vad det är jag missar.
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: Lm35 till PIC

Inlägg av RoPa »

Ok, om du använder lib funktioner så kan vi sluta felsöka koden.
Du har förmodligen kopplat fel i hårdvaran gör som sodjan föreslog och byt till en pot.

Lycka till!
Skriv svar