SCA100T-D01是SCA100T系列中一款测量角度为30°的双轴倾角传感器芯片,产品基于3D-MEMS技术,能够提供仪表/仪器级别的水平测量性能。内部两感应元件的测量轴平行于安装平面且相互正交,低温度漂移性、高分辨率、低噪音以及稳健的设计使得SCA100T成为水平仪器的理想选择。村田的倾角传感器能更好地对抗振动影响,且能经受高达20000g的震动冲击。
D01和D02两款测量范围和精度不同
使用STM32的模拟SPI驱动该芯片,C文件代码如下:
#include "SCA100T.h"
#include "variable.h"
#include "operate.h"
u8 angularflag=0;
//STM32 软件模拟SPI
void delay_us(u16 time)
{
u16 i=0;
while(time--)
{
i=10; //
while(i--) ;
}
}
void An_Tran_IOConfigure(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7; //MOSI,SCK,CS
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOA*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //MISO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOA*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void An_Tran_Init(void)
{
An_Tran_IOConfigure( );
An_Tran_WR_Byte(STX); //自检
DelayMs(1);
An_Tran_WR_Byte(STY); //自检
DelayMs(1);
An_Tran_WR_Byte(MEAS); //工作在测量模式
DelayMs(1);
}
void An_Tran_WR_Byte(u8 command)
{
u8 it=0,i=0;
CSB_CLR;
it=command;
for(i=0;i<8;i++)
{
SCK_CLR;
delay_us(2);
if(it&0x80)
{
MOSI_SET;
}
else
{
MOSI_CLR;
}
SCK_SET;
it=(it<<1);
delay_us(2);
}
CSB_SET;
SCK_CLR;
delay_us(150);
}
u16 An_Tran_Read_Byte(u8 command)
{
u8 i=0;
u16 indata=0;
CSB_CLR;
for(i=0;i<8;i++) // 发送命令
{
SCK_CLR;
delay_us(1);
if(command&0x80)
{
MOSI_SET;
}
else
{
MOSI_CLR;
}
SCK_SET;
command=(command<<1);
delay_us(1);
}
SCK_CLR;
indata=0;
for(i=0; i<11; i++) //11位数据
{
SCK_SET;
indata=indata<<1;
if(PAin(6)!=0) // 读取输入值
{
indata=indata+1;
}
SCK_CLR;
delay_us(1);
}
CSB_SET;
delay_us(50);
return(indata);
}
//如果读取的数据小于1024则代表右倾即左摆,大于1024则代表左倾即右摆 ,计算方法为:角度=arcsin【(输出的数据-1024)/819】
double AngularConvert(u8 Channel) //转换角度函数,45.45度为4545,最高位为1为右倾也即左摆
{
double tempbuf=0;
double tempbuf1=0;
double tempbuf2=0;
u16 rawbuf;
An_Tran_WR_Byte(0x0E); //工作在自检模式
An_Tran_WR_Byte(0x00); //工作在测量模式
rawbuf = AngularDataProcess(Channel);
if(rawbuf==0xFFFF)//无效
return 0;
tempbuf1=(double)(rawbuf);
if(tempbuf1<1024)
{
tempbuf2=(asin((1024-tempbuf1)/SCA100T_D01_Resolution))*180/3.1415926;
tempbuf=tempbuf2;
}
else
{
tempbuf2=(asin((tempbuf1-1024)/SCA100T_D01_Resolution))*180/3.1415926;
tempbuf=(-1)*tempbuf2;
}
return tempbuf;
}
u16 AngularDataProcess(u8 Channel)//倾角数据处理
{
u16 themp;
u8 i,j;
j = 0;
for(i=0;i<100;i++)//循环读数
{
themp=An_Tran_Read_Byte(Channel);
if((themp>=205)&&(themp<=1843))//有效数据
{
AngleSensorbuf[j]=themp;
j++;//有效点数量
}
}
if(j>0)
{
selectSort(AngleSensorbuf,j);
return AngleSensorbuf[j/2];
}
else
{
return 0xFFFF;
}
}
头文件代码如下:
#ifndef __SCA100T_H
#define __SCA100T_H
#include "stm32f10x.h"
#include "sys.h"
#include <stdio.h>
#include "math.h"
//========SCA100T控制命令
#define MEAS 0x00//测量模式
#define RWTR 0x08//读写温度数据寄存器
#define RDSR 0x0a
#define RLOAD 0x0b
#define STX 0x0e//X通道自检
#define STY 0x0f//Y通道自检
#define RDAX 0x10 //读X通道数据
#define RDAY 0x11 //读Y通道数据
//SCA100T灵敏度
#define SCA100T_D01_Resolution 1638
#define SCA100T_D02_Resolution 819
//IO操作函数
#define SCK_SET GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define SCK_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define MOSI_SET GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define MOSI_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#define CSB_SET GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define CSB_CLR GPIO_ResetBits(GPIOA,GPIO_Pin_4)
void An_Tran_IOConfigure(void);
void An_Tran_Init(void);
u16 An_Tran_Read_Byte(u8 command);
void An_Tran_WR_Byte(u8 command);
u16 AngularDataProcess(u8 Channel);
double AngularConvert(u8 Channel);
#endif