二维码是我创建的QQ群,欢迎新朋友加入。
近日接手一个项目,要求在STC单片机上面读取RM3100的数据,淘宝看了下,还真不便宜。
这个东西本身难度不是很大,麻烦的是没有什么参考资料,就官网那点东西。
程序思路很简单,调SPI通信,调初始化设置。
查看数据手册,这些寄存器都是可以被设置的,还好,不算太多。
也没必要全都设置一遍,只需要把需要的设置一下就行,我的话主要是设置了连续测量和转换周期。
/**
* @brief Sets cycle count and updates gain and max_data_rate values
* @param[in] desire value PNI recomends values between 30 and 400 Hz
* @return 1 if successful, 0 otherwise.
*/
void setCycleCount ( u16 value )
{
char to_reg[6];
if (value > 400)
value=400;
else if (value < 30)
value=30;
to_reg[0] = value>>8;
to_reg[1] = value;
to_reg[2] = to_reg[0];
to_reg[3] = to_reg[1];
to_reg[4] = to_reg[0];
to_reg[5] = to_reg[1];
SPIWriteBytes(M3D_3100_CCX,6,to_reg);
}
/**
* @brief Sets data rate in Continuous Measurement Mode.
* Fails if desire datarate is higher than the max data rate recommended by PNI.
* @param[in] Data rate configuration BYTE
* @return 1 if successful, 0 otherwise.
*/
void setCMMdatarate ( char conf )
{
char *ptr;
float temp = 1000;
switch (conf){
case CMM_UPDATERATE_600: temp=600;
break;
case CMM_UPDATERATE_300: temp=300;
break;
case CMM_UPDATERATE_150: temp=150;
break;
case CMM_UPDATERATE_75 : temp=75;
break;
case CMM_UPDATERATE_37 : temp=37;
break;
case CMM_UPDATERATE_18 : temp=18;
break;
case CMM_UPDATERATE_9 : temp=9;
break;
case CMM_UPDATERATE_4_5: temp=4.5;
break;
case CMM_UPDATERATE_2_3: temp=2.3;
break;
case CMM_UPDATERATE_1_2: temp=1.2;
break;
case CMM_UPDATERATE_0_6: temp=0.6;
break;
case CMM_UPDATERATE_0_3: temp=0.3;
break;
case CMM_UPDATERATE_0_15: temp=0.15;
break;
case CMM_UPDATERATE_0_075: temp=0.075;
break;
}
ptr = &conf ;
SPIWriteBytes(M3D_3100_TMRC,1,ptr);
}
设置之后就是对数据的读取
/**********************/
/***** ¶ÁÈ¡Êý¾Ý ******/
/**********************/
void MagGetData(void)
{
int i = 0;
unsigned char temp[9]={0};
static long Mag_Data[3]={0};
static char state = 0; //0 :cmd 1:wait get data
static char cNoDataCnt = 0;
if (CheckMagDataReady())
{
//´«¸ÐÆ÷×¼±¸ºÃ´¦ÀíÊý¾Ý
state = 0;
//¶ÁÈ¡Êý¾Ýµ½Êý×é
SPIReadBytes(0xA4,9,temp);
//Êý¾Ý¼ÆËã
Mag_Data[0]=temp[0]<<16 | temp[1]<<8 | temp[2]; //ned×ø±êϵ--Ç°ÌáÊÇËùÓк¸½Ó¶¼ÊDZê¼Çλº¸½Óµ½N
Mag_Data[1]=temp[3]<<16 | temp[4]<<8 | temp[5];
Mag_Data[2]=temp[6]<<16 | temp[7]<<8 | temp[8];
for(i=0;i<3;i++)
{
if(Mag_Data[i]&0x00800000)
Mag_Data[i]|=0xff000000;
}
temp[0]=0x70;
SPIWrite(0,0x70);
}
else
{
//´«¸ÐÆ÷»¹Ã»×¼±¸ºÃ´¦ÀíÊý¾Ý
cNoDataCnt+=5;
if (cNoDataCnt>=20)
{
cNoDataCnt=0;
SPIWrite(0,0x70);
}
}
//Êý¾ÝתÒƵ½½á¹¹Ìå
rm3100.rx = Mag_Data[0];
rm3100.ry = Mag_Data[1];
rm3100.rz = Mag_Data[2];
//´®¿Ú´òÓ¡ÈýÖá²ÎÊý
printf("´Å³¡Ç¿¶È\r\n");
printf("XÖá:%ld\r\n",rm3100.rx);
printf("YÖá:%ld\r\n",rm3100.ry);
printf("ZÖá:%ld\r\n",rm3100.rz);
}
完成之后,就可以通过串口打印出当前测量的磁场强度
二维码是我创建的QQ群,欢迎新朋友加入。