PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [سوال] کمک در مورد lm35 (نمیدانم چرا دما رو ال سی دی نشون داده نمیشه )



reza kazemi
21-05-2012, 17:00
سلام خدمت دوستان عزیز
من با سنسور lm35 یک مدار بستم طوری که دما رو اندازه گیری کنه و روی ال سی دی نمایش بده اما نمیدانم چرا رو ال سی دی هیچی نشون نمیده خواهشا فایل زیر رو که هم سورس برنامه و هم فایل پروتئوس رو داره دانلود کنید و ببینید مشکل کارم کجاست.ممنونم

temp- lm35.rar - 4shared.com - online file sharing and storage - download (You can see links before reply)

sigma-mx
21-05-2012, 19:39
مشکل حل شد مهندس ..
یسری نکات تو رسم مدار تو پروتئوس یادت باشه .. برای میکرو نیازی به استفاده از کریستال یا خازن صافی یا نویز گیر نیست و همچنین برای السیدی . پتانسیومتر برای السیدی کار نمیکنه .چون برای قطعه السیدی در برنامش هیچ دستوری برای پایه VEE نوشته نشده . ولی پایه ریست میکرو و Vref و AVCC کار میکنه معمولا . همچنین سعی کن تو پروتئوس زیاد از label استفاده نکنی که قاط میزنه ! و نکته بسیار مهم : برای ولتاژ های میکرو هم (VDD) تعریف نشده چند ولت . فقط باید از نماد POWER استفاده کنی کافیه . که استفاده کردی . این نماد فقط به قطعه میگه که تغذیه وصل شده ولی اگه شما اسمشو عوض کنی بزاری 12 + ، اون ولتاژ 12 نمیده ! شما باید برای مواردی مثل رله یا ... که اندازه ولتاژ براشون مهمه از قطعه DC در بخش Generator ها استفاده کنی و داخلش بنویسی 12 .. یه نکته دیگه اینه که اگه میخوای از المانهایی استفاده کنی تو مدارت که باید حرکت کنند (متحرکند ) مثل رله یا موتور یا باید روشن بشن مثل LED یا لامپ ، حتما باید در موقع انتخاب از لیست قطعات نوع ACTIVE اونا رو برداری . نوع غیر از ACTIVE فقط نماد هستند . و همینطور که گفتم برای رله هم نیازی به المانهای محافظ مثل خازن یا دیود نیست . مطمئن باش حداقل تو نرم افزار نمیسوزه !! من تضمین میکنم ! :0013:

یا حق

reza kazemi
22-05-2012, 01:19
جناب مهندس ازت واقعا ممنونم کمک بزرگی کردی متشکرم.

mustafaa
07-07-2012, 00:41
سلام به همه
اقایون من یه پروژه با lm35 نوشتم که دما رو رو ال سی دی نشون بده که نشون میده ولی هر ثانیه یه دمای دیگه نشون میده مثلا یکبار 0 بعد 54 بعد 2 و ... سنسور رو هم سه بار عوض کردم ولی بازم درس نشد. اینم کدشه

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>

#asm
.equ __lcd_port=0x18 ;PORTB
#endasm

#include <lcd.h>
#define ADC_VREF_TYPE 0xE0

unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

char str[16];
int tmp_adc;
void main(void)
{


PORTA=0x00; DDRA=0x00;
PORTB=0x00; DDRB=0xFF;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0xFF;
// ADC initialization
// ADC Clock frequency: 7.813 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
lcd_init(16);

while (1)
{
tmp_adc = read_adc(0);
PORTD = tmp_adc;
itoa(tmp_adc,str);
lcd_clear();
lcd_putsf("temp:");
lcd_puts(str);
lcd_putsf("'C");
delay_ms(500);
};
}
ممنون میشم کمک کنید

Doloop
07-07-2012, 02:50
سلام :hi:
مهندس وقتی از ADC استفاده میکنی برای اینکه مقدار ثابتی بهت بده بهتره مثلا 50 تا نمونه از ADC بگیری بعد همشون رو با هم جمع کنی در آخر هم تقسیم بر 50 کنی یه میانگین بهت میده که اینطوری مقدارت ثابت میشه
از حلقه for هم میتونی استفاده کنی که راحت تره :wink:

mustafaa
07-07-2012, 15:58
ممنون ولی نشد میانگین 100 تا رو گرفتم فقط محدوده عوض شد حالا از 2 تا 54 متغیره هر ثانیه هم یه چیز نشون میده

Doloop
07-07-2012, 16:23
یه تاخیر بین هر بار نمونه گیری قرار بده ببین جوابش چی میشه
تاخیرت در حد 10 یا 20 میلی ثانیه باشه
اگه جواب داد کمترش کن ببین تا کجا پاسخش خوبه:0013:
دقیق نمیدونم مشکل از کجاست چون من خودم هم همین چند روز پیش باهاش کار کردم (بیسیک) با همین روش مشکلش حل شد

sadmonew
07-07-2012, 16:29
سلام به همه
اقایون من یه پروژه با lm35 نوشتم که دما رو رو ال سی دی نشون بده که نشون میده ولی هر ثانیه یه دمای دیگه نشون میده مثلا یکبار 0 بعد 54 بعد 2 و ... سنسور رو هم سه بار عوض کردم ولی بازم درس نشد. اینم کدشه

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>

#asm
.equ __lcd_port=0x18 ;PORTB
#endasm

#include <lcd.h>
#define ADC_VREF_TYPE 0xE0

unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

char str[16];
int tmp_adc;
void main(void)
{


PORTA=0x00; DDRA=0x00;
PORTB=0x00; DDRB=0xFF;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0xFF;
// ADC initialization
// ADC Clock frequency: 7.813 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
lcd_init(16);

while (1)
{
tmp_adc = read_adc(0);
PORTD = tmp_adc;
itoa(tmp_adc,str);
lcd_clear();
lcd_putsf("temp:");
lcd_puts(str);
lcd_putsf("'C");
delay_ms(500);
};
}
ممنون میشم کمک کنید
سلام :hi:
مهندس يه جاي برنامه يه چيزي رو كم گذاشتي.
شما اومدي مستقيم مقداري كه از ADC خوندي روي LCD نشون ميدي. اما بايد قبل از نشون دادن تو السيدي، مقدار خونده شده رو تو رابطه قرار بدي و به دما تبديلش كني و بعدش رو السيدي نشون بدي.

mustafaa
07-07-2012, 16:39
الان کدم از قبلیه به این تغییر کرده

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>

#asm
.equ __lcd_port=0x18 ;PORTB
#endasm

#include <lcd.h>
#define ADC_VREF_TYPE 0xE0

unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

char str[16];
float tmp_adc;
void main(void)
{
int i=0;
float t=0;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
lcd_init(16);

lcd_puts(" seid mostafa mosavi imani");
delay_ms(400);
lcd_clear();

while (1)
{
for(i=0;i<1000;i++)
{
tmp_adc = read_adc(0);
PORTD = tmp_adc;
t=t+tmp_adc;
}
t=t/1000;

itoa(t,str);
lcd_clear();
lcd_putsf("temp:");
lcd_puts(str);
lcd_putsf("'C");

};
}

آقای محمدی یعنی چیکار کنم؟

sadmonew
07-07-2012, 17:52
سلام مهندس
شما ولتاژ مرجع(vref) روي ولتاژ 2.56 ولت داخلي تنظيم كردي و مقدار تقسيم كننده فركانس رو براي نمونه گيري از ولتاژ ورودي رو عدد 2 تنظيم كردين، درسته؟
پس مهندس از اين رابطه براي تبديل ولتاژ ورودي به دما استفاده كن:


Temperature(°C)=(tmp_adc/1024)*2.56*(100)

mustafaa
07-07-2012, 18:13
سلام
ببخشید ولتاژ رو فهمیدم چیه، درسته رو ولتاژ داخلی تنظیم کردم بعد از 8 بیت هم استفاده کردم اما فرکانس اندازه گیری رو نگرفتم چیه اخه تازه دارم یاد میگیرم .
خودم به این شکل نوشتم
tmp_adc=((2.56*ADCH)*100)/256;
که اشتباه نشون میده حتی تو شبیه ساز
رابطه ای که فرمودین هم زدم باز درست نشد

abrisham
03-05-2014, 02:11
درود.
هنگام استفاده از این سنسورها بهتره خروجی سنسور رو با یه خازن حدود 100 تا 220 میکرو به گروند متصل کنید.
معمولا با این کار پرش های ولتاژی خروجی سنسور و نویزهای محیط کاملا حذف میشن.
این روش اونقدر موثر هست که کافیه فقط یک بار adc رو بخونید.
:hi: