سلام
اون اعداد عجیب و غریب شامل 3 سری 11 تایی عدد هست که اولی یه عدد هگز ثابت (آدرس) ، دومی یه عدد هگز که 3 مقدار مختلف میتونه داشته باشه و آدرس سری هست و سری 9 تایی که پشتش میاد سه حالت داره
1-سه محور ژیروسکوپ و دما (hi-low) ، جمع مقادیر عددی
2-سه محور شتاب سنج و دما (hi-low) ، جمع مقادیر عددی
3-زاویه حول سه محور و دما (hi-low) ، جمع مقادیر عددی
تو دیتاشیت متاسفانه چینی این محصول هم یک سری برنامه برای نمونه آورده که باز هم متاسفانه باید عرض کنم نتونستم برای آردوینو تطبیقش بدم با این که به زبان سی هست...
و عرض دیگم هم اینه که بنده واقعا سواد الکترونیکم محدوده (با فرض اینکه اصلا وجود داره!!) ، برنامه نویسی رو هم اندکی از دوران طفولیت به یاد دارم ، دستم هم زیر ساطوره ، اگر کسی میدونه چطور باید ورودی تی تی ال آردوینو رو به این کدها داد و چه تغییراتی خود کدها لازم دارن متشکر میشم در میون بذاره
کد ها :
double a[3],w[3],Angle[3],T;
void DecodeIMUData(unsigned char chrTemp[])
{
switch(chrTemp[1])
{
case 0x51:
a[0] = (short(chrTemp[3]<<8|chrTemp[2]))/32768.0*16;
a[1] = (short(chrTemp[5]<<8|chrTemp[4]))/32768.0*16;
a[2] = (short(chrTemp[7]<<8|chrTemp[6]))/32768.0*16;
T = (short(chrTemp[9]<<8|chrTemp[8]))/340.0+36.25;
printf("a = %4.3f\t%4.3f\t%4.3f\t\r\n",a[0],a[1],a[2]);
break;
case 0x52:
w[0] = (short(chrTemp[3]<<8|chrTemp[2]))/32768.0*2000;
w[1] = (short(chrTemp[5]<<8|chrTemp[4]))/32768.0*2000;
w[2] = (short(chrTemp[7]<<8|chrTemp[6]))/32768.0*2000;
T = (short(chrTemp[9]<<8|chrTemp[8]))/340.0+36.25;
printf("w = %4.3f\t%4.3f\t%4.3f\t\r\n",w[0],w[1],w[2]);
break;
case 0x53:
Angle[0] = (short(chrTemp[3]<<8|chrTemp[2]))/32768.0*180;
Angle[1] = (short(chrTemp[5]<<8|chrTemp[4]))/32768.0*180;
Angle[2] = (short(chrTemp[7]<<8|chrTemp[6]))/32768.0*180;
T = (short(chrTemp[9]<<8|chrTemp[8]))/340.0+36.25;
printf("Angle = %4.2f\t%4.2f\t%4.2f\tT=%4.2f\r\n",Angle[0],Angle[1],Angle[2],T);
break;
}
}
بعدی
unsigned char Re_buf[11],counter=0;
unsigned char sign;
interrupt [USART_RXC] void usart_rx_isr(void) //USART串行接收中断
{
Re_buf[counter]=UDR;//不同单片机略有差异
if(counter==0&&Re_buf[0]!=0x55) return; //第 0 号数据不是帧头,跳过
counter++;
if(counter==11) //接收到11 个数据
{
counter=0; //重新赋值,准备下一帧数据的接收
sign=1;
}
}
بعدی
float a[3],w[3],angle[3],T;
extern unsigned char Re_buf[11],counter;
extern unsigned char sign;
while(1)
{
if(sign)
{
sign=0;
if(Re_buf[0]==0x55) //检查帧头
{
switch(Re_buf [1])
{
case 0x51:
a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x52:
w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x53:
angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
}
}
}
عملکرد کد ها رو تقریبا می فهمم ولی چطور با rx باید ارتباط برقرار کنه؟! و آیا نیاز به فراخوانی هست؟!
متشکر