في هذا مشروع الغرض منه كيفيه التعامل مع مقاومه حراريه من نوع NTC
http://arabsh.com/files/0d3e414c62f2...g-ntc-rar.html
طبعا مهم كيفيه حساب حراره من هذه المقاومه
كود:
#define segment portc
#define segment_dir trisc
#define seg_en1 portb.f1
#define seg_en1_dir trisb.f1
#define seg_en2 portb.f2
#define seg_en2_dir trisb.f2
#define led_load porta.f0
#define led_load_dir trisa.f0
#define led_alarm porta.f1
#define led_alarm_dir trisa.f1
#define led_Tmax porta.f2
#define led_Tmax_dir trisa.f2
#define led_Tmin porta.f3
#define led_Tmin_dir trisa.f3
#define sw_Tinc portb.f4
#define sw_Tinc_dir trisb.f4
#define sw_Tdec portb.f5
#define sw_Tdec_dir trisb.f5
#define sw_setting portb.f6
#define sw_setting_dir trisb.f6
#define senser portb.f3
#define senser_dir trisb.f3
#define is ==
#define input 1
#define output 0
#define enable 1
#define disenable 0
#define off 0
#define on 1
#define pressed 0
#define R1 2.2 // 2.2 k ohm
#define R2 1 // 1 k ohm
#define To 298.15// 25+273
#define B 3650
#define R25 1 // 1 k ohm
///////////////////////// veriable //////////////////////////////////
const char segment1[]={192,249,164,176,153,146,130,248,128,144};
char x=0, tmax=33, tmin=27, k=0 , select=0 ;
float temp=0;
float zz=0;
char temp2=0;
//////////////////////////////////////////////////////////////////////////////
void init(); // function //
void show_7seg(char number);
void caculated_temperature();
void load();
void setting();
/////////////////////////////////////////////////////////////////////////////
void init()
{
anselh=2;// RB0_bit is anloge
trisa.f4=1;
ansel=0;// porta is digital
/// output////
segment_dir=output;
seg_en1_dir=seg_en2_dir=output;
led_Tmax_dir=led_Tmin_dir=output;
led_load_dir=led_alarm_dir=output;
// input //
sw_Tinc_dir=sw_Tdec_dir=sw_setting_dir=input;
senser_dir=input;
// off all output//
segment=0xff;// off 7seg
led_Tmax=led_Tmin=off;
led_load=led_alarm=off;
seg_en1=seg_en2=disenable ;
adc_Init();
}
///////////////////////////////////////////////////////////////////////////////
void main()
{
init();
while(1)
{
if(sw_setting is pressed)
{
delay_ms(1000);
select=1;
setting();
}
load();
}
}
////////////////////////////////////////////////////////////////////////////////
void load()
{
caculated_temperature();
if(temp2>=Tmax)// run
{
led_load=on;
led_alarm=off;
k=1;
}
if(temp2>=(Tmax-5)&& k is 0) // alarm
{
led_load=off;
led_alarm=on;
}
if(temp2<=tmin && k is 1) { k=0;led_load=off;}
}
///////////////////////////////////////////////////////////////////////////////
void setting()
{
while(1)
{
if( sw_setting is pressed)
{
select++;
if(select is 3)
{
select=0;
led_Tmin=off;
led_Tmax=off;
return;
}
delay_ms(50);
}
if( select is 1) // setting Tmin
{
led_Tmin=on;
led_Tmax=off;
show_7seg(tmin);
if(sw_Tinc is pressed)
{
tmin++ ;
if(tmin is 99) tmin =99;
}
if(sw_Tdec is pressed)
{
tmin-- ;
if(tmin is 255) tmin =0;
}
}
if( select is 2) // setting Tmax
{
led_Tmin=off;
led_Tmax=on;
show_7seg(tmax);
if(sw_Tinc is pressed)
{
tmax++ ;
if(tmax is 99) tmin =98;
}
if(sw_Tdec is pressed)
{
tmax-- ;
if(tmax is 255) tmin =0;
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
void caculated_temperature()
{
temp=ADC_Read(9);
temp=temp*5000/1023;
zz=(1/ (log( ( temp*(R1+R2)-(5000*R2) )/((5000-temp)*R25))/B +3.354e-3) )-273.15; // equation fot NTC
temp2=zz;
if(zz>=100)temp2=99; // max value beacuse using 7seg two segment only
if(zz<=1)temp2=0;
show_7seg(temp2);
}
///////////////////////////////////////////////////////////////////////////////
void show_7seg(char number)
{
for(x=0;x<20;x++)
{
seg_en2=disenable;seg_en1=enable;
segment=segment1[number/10];
delay_ms(5);
segment=0xff;
seg_en1=disenable;seg_en2=enable;
segment=segment1[number%10];
delay_ms(5);
segment=0xff;
}
}
///////////////////////////////////////////////////////////////////////////////
فكره مشروع
انه يتم عمل ضبط للدرجات الحراره MAX و MIN اذا ارتفعت الحراره الى MAX-5 يشتغل ليد واذا تجاوزت MAX يشتغل ليد اخضر ( طبعا ممكن ربط اي حمل )
وهنا يبقى ليد شغال الى ان تهبط حراره الى MIN
المهم في مشروع هو كود حساب الحراره
كود:
void caculated_temperature()
{
temp=ADC_Read(9);
temp=temp*5000/1023;
zz=(1/ (log( ( temp*(R1+R2)-(5000*R2) )/((5000-temp)*R25))/B +3.354e-3) )-273.15; // equation fot NTC
temp2=zz;
if(zz>=100)temp2=99; // max value beacuse using 7seg two segment only
if(zz<=1)temp2=0;
show_7seg(temp2);
}
من اين حصلت على معادله انظرو الرابط
http://www.giangrandi.ch/electronics/ntc/ntc.shtml
مشكله هنا معادله تعتمد على مقاومه كيف اجعل مايكرو يحسب مقاومه
بكل بساطه هنا نستخدم مقسم جهد طيب اشلون احسب مقاومه
كود:
V=(R2+RT)*5/(R1+R2+RT)
بترتيب معادله نحصل على RT
كود:
RT={V*R1+R2(5-V)}/(5-V)
هنا يتم حساب V من خلال قراءه الفولتيه من انلوك
ومن ثم يتم حساب مقاومه ومنها درجات الحراره
ملاحظه/ V سميتها temp
والفولتيه التي يتم قراتها من انلوك هي بملي فولت وعليه تصبح معادله
كود:
RT={V*R1+R2(5000-V)}/(5000-V)
وهذه هي معادله اصليه
http://www.giangrandi.ch/electronics/ntc/T(R).gif
تم تعويض بدلا من مقاومه حراريه بمعادله التي تم اشتقاقها اعلاه
لاحظو معادله في كود
كود:
zz=(1/ (log( ( temp*(R1+R2)-(5000*R2) )/((5000-temp)*R25))/B +3.354e-3) )-273.15; // equation fot NTC
وايضا تم وضع مقاومه متغيره 1k ohmبدلا من ntc لغرض محاكاه في بروتيس ولكن توجد مشكله وهي لما تنخفض درجات حراره مقاومه تزداد كثيرا عن 1k ohm ولكن في بروتيس كيف ازيدها
وعليه درجات حراره تصل الى اقل قيمه لها 25 لاني مستخدم مقاومه متغيره ولكن لو استخدمت NTC فانها حراره تصل الى 0
==============================================
كيف تتأكد من معادله صحيحه اليك جدول
http://img01.arabsh.com/uploads/imag...444367f600.png