قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

ناريمان محمد
:: مهندس ::
تاريخ التسجيل: Apr 2016
المشاركات: 27
نشاط [ ناريمان محمد ]
قوة السمعة:0
قديم 20-09-2018, 08:43 PM المشاركة 1   
افتراضي مشكلة في حساس التراسونيك Twitter FaceBook Google+



تحية طيبة .

انا استخدم حساس التراسونيك ولكن البيك مع البيك pic16f628a ولكن تحدث معي مشكلتين

الاولى ان قياس المسافة هو نصف القياس الحقيقي

الثانية ان القراءة بعض الاحيان تتلخبط وتظهر بقيم سالبة

ما السبب ؟؟؟

الكود هو
كود:
#define relay           portb.f5
#define relay_did       trisb.f5

#define sw1             portb.f2
#define sw2             portb.f3

#define sw1_dir         trisb.f2
#define sw2_dir         trisb.f3

#define trig            portb.f0
#define echo            portb.f1

#define trig_dir        trisb.f0
#define echo_dir        trisb.f1



sbit LCD_RS at RA1_bit;
sbit LCD_EN at RA0_bit;
sbit LCD_D4 at RA7_bit;
sbit LCD_D5 at RA6_bit;
sbit LCD_D6 at RB7_bit;
sbit LCD_D7 at RB6_bit;

// Pin direction
sbit LCD_RS_Direction at TRISA1_bit;
sbit LCD_EN_Direction at TRISA0_bit;
sbit LCD_D4_Direction at TRISA7_bit;
sbit LCD_D5_Direction at TRISA6_bit;
sbit LCD_D6_Direction at TRISB7_bit;
sbit LCD_D7_Direction at TRISB6_bit;

int a;  char txt[7];  int dis;
char x=0;
void micro()
{
 lcd_init();
 lcd_cmd(12);
 lcd_cmd(1);
 
 relay_did=0;
 relay=0;
sw1_dir=1;
sw2_dir=1;
 
 trig_dir=0;
 trig=0;
 echo_dir=1;
 //OPTION_REG=0b00001111;
 
T1CON = 0x10;                                
 
 cmcon=7;
}



void set()
{

 
char select=0;
char i=0;

 asm clrwdt   ;
 
  lcd_cmd(1);
 while(sw1){ asm clrwdt   ; Lcd_Out(1,1,"lift your finger");}
 lcd_cmd(1);
 while(1 )
 {
  lcd_out(1,1,"distance=");
  if(sw2){ 
          Delay_ms(250);
           asm clrwdt   ;
          if(select==0){ Delay_ms(250); dis++;}
          if(select==1){ Delay_ms(250); dis--;}
          if(select==2){ Delay_ms(250); EEPROM_Write(0,dis); lcd_cmd(1); lcd_out(1,1,"Saved new Data"); Delay_ms(500); lcd_cmd(1); return;   }
 
          }
          
  if(sw1){ Delay_ms(250); select++; if(select==3) select=0;}
          
   IntToStr(dis,txt);
   
   for(i=0;i<7;i++)
   {
   if(txt[i]!=' '){ lcd_chr_cp(txt[i]);}
   }
 
 }



}
void main() 
{
  micro();
    if( EEPROM_Read(0)!=0xff){ dis=EEPROM_Read(0);}
   
   
   if(sw1==1){  asm clrwdt   ; Delay_ms(250); asm clrwdt   ; set();}
   

  while(1)
  {


    TMR1H = 0;
    TMR1L = 0;

    trig = 1;
    Delay_us(10);
    trig = 0;

    while(!echo);
    T1CON.F0 = 1;
    while(echo);
    T1CON.F0 = 0;

    a = (TMR1L | (TMR1H<<8));
    a  = a/58.82;
    a = a + 1;

   
   Delay_ms(50);
   
   lcd_out(1,1,"CM=");

if(a>dis){ relay=1; Delay_ms(250); asm clrwdt   ;}
    else if(a<dis){ relay=0;}


 IntToStr(a,txt);


for(x=0;x<7;x++)
 {
  if(txt[x]!=' '){  lcd_chr_cp(txt[x]);}

 }


   asm clrwdt   ;
  
  }
}

اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 22-09-2018, 06:13 AM المشاركة 2   
افتراضي


معذرة لست خبيرا فى لغة السى و كنت انتظر أحد الاخوة الخبراء أن يتكرم بالرد لكن على قدر ما وجدت أن المسافة تقيس النصف نتيجة خطأ فى معادلة حساب المسافة وهى فى
كود:
a = (TMR1L | (TMR1H<<8));
    a  = a/58.82;
    a = a + 1;
أما لماذا يعطى نتيجة سالبة فأظن أن انتظار echo فى دورة عادة لا يعطى نتائج صحيحة
الأفضل التعامل بالمقاطعة هكذا
بعد إرسال النبضة لمدة 10 ميكرو نفعل المقاطعة و نشغل العداد
عند وصول نبضة Echo تدخل من طرف المقاطعة الخارجية طرف 6 أو RB0 وهذه تفعل كود الحساب وتوقف العداد وتمنع المقاطعة أما لو اكتمل العداد وعمل Overflow فهو أيضا يسبب مقاطعة أخرى تمنع حساب قيم غير صحيحة و تضع رسالة Over Range مثلا أو ما شابه

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية Rwad_Abujazia
Rwad_Abujazia
:: مهندس متواجد ::
تاريخ التسجيل: Apr 2016
الدولة: Libya
المشاركات: 62
نشاط [ Rwad_Abujazia ]
قوة السمعة:0
قديم 21-11-2018, 10:23 AM المشاركة 3   
افتراضي


اعتقد ان القراءة السالبة تتنج من اعتراض اجسام امام الحساس ممتصة للصوت مثل الملابس الصوفية الاسفنج....انا شخصيا حدث معي هذا الشي حيث كنت استخدم الحساس و عند الوقوف امام الحساس يعطي قراءة سالبة و عند قدوم شخص اخر يعطي نتيجة صحيحة وكانت المشكلة اني ارتدي ملابس صوفية فيجب مراعاة ذلك في الحسبان عند استخدام هذه الحساسات لان مبدئ عمليها هو ارسال الموجات الصوتية وعندما تنعكس هذه الموجات يمكن معرفة المسافة بين الحساس و الجسم الذي امام بالمعادلة التالية
المسافة = السرعة x الزمن

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 01:37 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025