Lm35 till PIC
Lm35 till PIC
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
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
Re: Lm35 till PIC
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.
Lycka till!
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;
}
Re: Lm35 till PIC
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?
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?
Re: Lm35 till PIC
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
Då startar den konvertering oavsett vilken AN port du valt.
Lycka till!
Ä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 //
Lycka till!
Re: Lm35 till PIC
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?
Re: Lm35 till PIC
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!
Re: Lm35 till PIC
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) ;
}
}
Re: Lm35 till PIC
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 ?
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 ?
Re: Lm35 till PIC
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.
Re: Lm35 till PIC
En liten kommentar, du frågar varför den inte konverterar som den ska men du visar inte konverteringskoden?
Säger inte oss ett smack, vad gör ADC_Read(2)?
Kod: Markera allt
temp_res = ADC_Read(2); // Läseer värdet från sensor
Re: Lm35 till PIC
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?
Har ni nått förslag på hur jag ska gå vidare för att få min kod att fungera?
Re: Lm35 till PIC
> ...vad gör ADC_Read(2)?
Se: http://www.mikroe.com/eng/downloads/get ... l_v101.pdf
Och "ADC LIBRARY" här : http://www.mikroe.com/mikroc/pic/libraries/
Se: http://www.mikroe.com/eng/downloads/get ... l_v101.pdf
Och "ADC LIBRARY" här : http://www.mikroe.com/mikroc/pic/libraries/
Re: Lm35 till PIC
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.
temp_res = ADC_Read(2); // Get 10-bit results of AD conversion
Vet inte vad det är jag missar.
Re: Lm35 till PIC
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!
Du har förmodligen kopplat fel i hårdvaran gör som sodjan föreslog och byt till en pot.
Lycka till!