NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3719 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 11 از 11

موضوع: مشکل کوچک با قطب نما gy271

  1. #1
    عضو جدید
    تاریخ عضویت
    Jan 2014
    نوشته ها
    6
    تشکر
    3
    تشکر شده 0 بار در 0 پست

    پیش فرض مشکل کوچک با قطب نما gy271

    سلام خدمت تمامی اساتید
    من از برد arm کویر استفاده میکنم
    یه ماژول قطب نما gy271 خریدم و راه اندازیش کردم
    الان مشکلی که من دارم اینه که هر سه دیتا رو از سه محور میتونم بخونم ولی نمیدونم چجور باید اونها رو به زاویه تبدیل کرد
    مثلا من از روی tft اعداد زیر رو میخونم
    65531
    158
    32568
    که اوی برای x ها دومی برای y ها و سومی برای z هاست
    حالا با این اعداد چجور باید زاویه ها رو بدست آورد؟
    لطفا اگه کسی کار کرده کمک کنه
    اسم ان قطب نما هم هست hmc8553l از شرکت honeywell
    ممنون
    این هم کد
    کد:
    #include <at91sam7x256.h>
    #include <delay.h>
    #include <TFTLCD.h>
    #include <twi.c>
    #include <PIO.h>
    #include <stdio.h>
    #include <math.h>
    
    char PORTRAIT = 0;
    char data;
    char LCD_Show_X[20],LCD_Show_Y[20],LCD_Show_Z[20];
    
    char A=0x70;
    char B=0xA0;
    char C=0x00;
    char Rx;
    char Raw_Xout_Val_LSB=0, Raw_Yout_Val_LSB=0, Raw_Zout_Val_LSB=0;
    char Raw_Xout_Val_MSB=0, Raw_Yout_Val_MSB=0, Raw_Zout_Val_MSB=0;
    unsigned int X_Angle;
    unsigned int Y_Angle;
    unsigned int Z_Angle;
    
    int Angle;
    
    int main(){
    	
    	tftlcd_init();
    		
     *AT91C_PMC_PCER = (1<<9);
    	
    PIO_Periph(PORT_A,1<<10 | 1<<11,0);					//(6)
    PIO_Opendrain(PORT_A,1<<10 | 1<<11);				//(7)
    Pullup(PORT_A,1<<10 | 1<<11);
    	
    	TWI_Configure(100000);//100k
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x00,1,&A);
    	delay_ms (10);
    //	tftlcd_putchar('0',BLUE,GREEN,1);
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x01,1,&B);
    	delay_ms (10);
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x02,1,&C);
    	delay_ms (10);
    	
    	while(1){
    		
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x03,1,&Raw_Xout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x04,1,&Raw_Xout_Val_LSB);
    		
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x05,1,&Raw_Yout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x06,1,&Raw_Yout_Val_LSB);
    			
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x07,1,&Raw_Zout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,0x08,1,&Raw_Zout_Val_LSB);
    		
    	  	X_Angle = (Raw_Xout_Val_MSB<<8|Raw_Xout_Val_LSB);
    		  Y_Angle = (Raw_Yout_Val_MSB<<8|Raw_Yout_Val_LSB);		
    	    Z_Angle = (Raw_Zout_Val_MSB<<8|Raw_Zout_Val_LSB);	
    		
    //Angle= atan2((double)X_Angle,(double)Y_Angle ) * (180 / 3.14159265) + 180;
    		
    		
     tftlcd_gotoxy(0,0);	
     sprintf(LCD_Show_X,"%d",X_Angle);
     tftlcd_puts(LCD_Show_X,BLUE,GREEN,1);
    
     tftlcd_gotoxy(0,1);		
     sprintf(LCD_Show_Y,"%d",Y_Angle);
     tftlcd_puts(LCD_Show_Y,BLUE,GREEN,1);
     
     tftlcd_gotoxy(0,2);			
     sprintf(LCD_Show_Z,"%d",Z_Angle);
     tftlcd_puts(LCD_Show_Z,BLUE,GREEN,1);
     
    //TWI_WriteByteIadr(BASE_TWI,0x1E,0x03,1,&Raw_Xout_Val_MSB); 
    delay_ms (500);
    tftlcd_clear();
    	}	
    }

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیر بخش STM32 sigma-mx آواتار ها
    تاریخ عضویت
    Nov 2009
    نام
    سعید شریفیان
    نوشته ها
    1,421
    تشکر
    804
    تشکر شده 2,520 بار در 978 پست

    پیش فرض

    اول از همه متغیرهای شما برای هر محور باید signed باشه نه unsigned ! چون در اینصورت همونطور که خودت هم گفتی 32568 و 65531 گرفتی که اینا در واقع عدد منفی هستند . اگه اینو رعایت کنی 3 تا عدد منفی یا مثبت حداکثر سه رقمی داری که تا اینجا درسته . بعد طبق همون فرمول Angle که ریمارکش کردی ( از y/x یه arctan میگیری و تبدیل به درجه میکنی با افست 180 درجه ) زاویه 0 تا 359 بهت میده که 0 شمال مغناطیسی هست .

  4. کاربران : 3 تشکر کرده اند از شما sigma-mx برای ارسال این پست سودمند:


  5. #3
    عضو جدید
    تاریخ عضویت
    Jan 2014
    نوشته ها
    6
    تشکر
    3
    تشکر شده 0 بار در 0 پست

    پیش فرض

    اول ممنون از جوابتون
    الان امکان ازمایش ندارم این رو فردا امتحان میکنم.
    راستیاین عددی که برای z میخونیم چیه؟اصلا چه کاربردی داره؟
    یه چیز دیگه انی که چرا اعداد سه رقمی میشن؟
    بالاخره اعدادی که میرن توی X_Angle و... 16 بیتی هستند.
    بازم ممنون از جوابتون
    انتظار نداشتم انقدر سریع کسی بهم جواب بده.

  6. #4
    عضو جدید
    تاریخ عضویت
    Jan 2014
    نوشته ها
    6
    تشکر
    3
    تشکر شده 0 بار در 0 پست

    پیش فرض

    راستی اگه زاویه ی انحراف از z رو بخوایم به دست بیاریم از y وz یا z و استفاده می کنیم ؟
    کاربرد z کدوم هست ؟
    مگه عدد ها 16 بیتی نیستن ؟ چرا حداکثر عدد سه رقمی میشه ؟ با منفی مگه بازه بین 32767 و -32767 نیست ؟
    بازم ممنون

  7. #5
    مدیر بخش STM32 sigma-mx آواتار ها
    تاریخ عضویت
    Nov 2009
    نام
    سعید شریفیان
    نوشته ها
    1,421
    تشکر
    804
    تشکر شده 2,520 بار در 978 پست

    پیش فرض

    این روش برای قطب نمای دو بعدی هست . محور سوم یعنی z جهت جبرانسازی tilt هست که بدون اون هم جواب میگیرید ولی خودتون باید ماژول رو در راستای افق نگه دارید یعنی موازی زمین .. با معادلات مشابه میشه زاویه های دیگه مثل z/x و z/y رو هم بدست آورد ولی من عملی ندیدم جایی استفاده کنند .
    در مورد محدوده عددهای هر محور هم تا جایی که یادم هست بستگی به حساسیتی داره که شما تو کانفیگ تنظیم میکنی . حالا شما عملی تست کن ببین نتیجه چی میشه . اگه مشکلی بود من هم مدار رو میبندم ...

  8. کاربران : 3 تشکر کرده اند از شما sigma-mx برای ارسال این پست سودمند:


  9. #6
    عضو جدید
    تاریخ عضویت
    Jan 2014
    نوشته ها
    6
    تشکر
    3
    تشکر شده 0 بار در 0 پست

    پیش فرض

    واقعا ممنون از کمک ها
    درست شد
    این هم کدش اگه مشکلی داشت ممنون میشم بهم یاداوری کنید
    بازم ممنون !
    کد:
    #include <at91sam7x256.h>
    #include <delay.h>
    #include <TFTLCD.h>
    #include <twi.c>
    #include <PIO.h>
    #include <stdio.h>
    #include <math.h>
    
    char PORTRAIT = 0;
    char data;
    char LCD_Show_X[20],LCD_Show_Y[20],LCD_Show_Z[20];
    
    char A=0x70;
    char B=0xA0;
    char C=0x00;
    char Rx;
    char Xout_Val_LSB=0, Yout_Val_LSB=0, Zout_Val_LSB=0;
    char Xout_Val_MSB=0, Yout_Val_MSB=0, Zout_Val_MSB=0;
    signed char X_Angle;
    signed char Y_Angle;
    signed char Z_Angle;
    int Angle;
    
    signed char HMC5883L_Read(char Reg_Add_Lsb,char Reg_Add_Msb);
    int HMC5883L_Calculate(void);
    void HMC5883L_Display(int data);
    
    int main(){
    	
      tftlcd_init();
    		
      *AT91C_PMC_PCER = (1<<9);
    	
      PIO_Periph(PORT_A,1<<10 | 1<<11,0);					
      PIO_Opendrain(PORT_A,1<<10 | 1<<11);				
      Pullup(PORT_A,1<<10 | 1<<11);
    	
    	TWI_Configure(100000);//100k
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x00,1,&A);
    	delay_ms (10);
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x01,1,&B);
    	delay_ms (10);
    	
    	TWI_WriteByteIadr(BASE_TWI,0x1E,0x02,1,&C);
    	delay_ms (10);
    	
    	
    	while(1){
    		
               X_Angle = HMC5883L_Read(0x04,0X03);
    	   Y_Angle = HMC5883L_Read(0x06,0X05);
    	   Z_Angle = HMC5883L_Read(0x08,0X07);
               Angle = HMC5883L_Calculate();
               HMC5883L_Display(Angle);		
    		
    	}
    	
    }
    
    signed char HMC5883L_Read(char Reg_Add_Lsb,char Reg_Add_Msb){
    
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,Reg_Add_Msb,1,&Xout_Val_MSB);
    		 TWI_ReadByteIadr(BASE_TWI,0x1E,Reg_Add_Lsb,1,&Xout_Val_LSB);	
    	
    	return (Xout_Val_MSB<<8|Xout_Val_LSB);
    	
    }
    
    int HMC5883L_Calculate(){
    	  	int Degree = 0;	
          Degree = atan2(Y_Angle,X_Angle ) * (180 / 3.14159265) + 180;
      return Degree; 	
    }
    
    void HMC5883L_Display(int data){
    	
     tftlcd_gotoxy(1,0);	
     sprintf(LCD_Show_X,"%d",data);
     tftlcd_puts(LCD_Show_X,BLUE,GREEN,1);
     
     delay_ms (500);
     tftlcd_clear();	
    	
    }
    ویرایش توسط پویا خواجوی : 13-01-2014 در ساعت 20:20

  10. #7
    مدیر بخش STM32 sigma-mx آواتار ها
    تاریخ عضویت
    Nov 2009
    نام
    سعید شریفیان
    نوشته ها
    1,421
    تشکر
    804
    تشکر شده 2,520 بار در 978 پست

    پیش فرض

    خوبه
    الان تو محدوده 0 و 359 عدد میگیدید ؟ مقادیر x,y,z چطورند ؟

  11. تشکرها از این نوشته :


  12. #8
    عضو جدید
    تاریخ عضویت
    Jan 2014
    نوشته ها
    6
    تشکر
    3
    تشکر شده 0 بار در 0 پست

    پیش فرض

    آره محدوده زاویه 0 تا 359 هستx و yو z هم منفی میدن هم مثبت
    توی محدوده ی 0 تا 255
    بازم ممنون

  13. #9
    کاربر علاقه مند
    تاریخ عضویت
    Jul 2013
    نوشته ها
    61
    تشکر
    14
    تشکر شده 4 بار در 4 پست

    پیش فرض

    ممنون از توضیحات همگیمن از همین ماژول استفاده میکنم و از برد arm atmelکویرمن یه مشکلی دارم اینه که اعداد رو که میخونم از مثلا 10 تا 135 همه چی خوبه بعد یه دفه پرش میکنه به 250به نظر شما مشکل کجاست؟ممنون میشم اگه کمکم کنید

  14. #10
    مدیر بخش STM32 sigma-mx آواتار ها
    تاریخ عضویت
    Nov 2009
    نام
    سعید شریفیان
    نوشته ها
    1,421
    تشکر
    804
    تشکر شده 2,520 بار در 978 پست

    پیش فرض

    سلام
    شما ممکنه ولتاژ تغذیتون نویز داشته باشه . همچنین حتما توجه کنید تمامی سنسور های قطب نما (compass) بدلیل استفاده از میدان مغناطیسی زمین بسیار در برابر وسایل محیط که میدان مغناطیسی ایجاد میکنند حساسند . حتی یک جسم فلزی هم میتونه باعث مختل شدنش بشه یا موبایل و ....

  15. تشکرها از این نوشته :


  16. #11
    کاربر علاقه مند
    تاریخ عضویت
    Jul 2013
    نوشته ها
    61
    تشکر
    14
    تشکر شده 4 بار در 4 پست

    پیش فرض

    آقای شریفیان
    مشکل از نویز نیست
    من رجیستر رو میخونم و مستقیم روی tft نمایش میدم
    اینجور تغییر میکنه
    مثلا از 10 تا 55 افزایش پیدا میکنه بعد کاهش پیدا میکنه تا 0 و میشه 255 بعدش از 255 کاهش پیدا میکنه تا مثلا 90
    من دقت کردم دیدم موقعی مقدار y میرسه به 255 مقدار x روندش مختل میشه و بررعکس
    ینی در واقع ما دو تا 255 یا دو تا ماکزیمم داریم
    به نظرتونن مشکل کجاست؟
    مشکل کالیبره کردن اون نیست؟
    اصلا این ماژول به کالیبره کردن نیاز داره
    اگه داره چجوری؟
    ممنون اگه کمکم کنید
    ویرایش توسط Niloufar.Male : 21-02-2014 در ساعت 14:19

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •