SCA100T STM32代码

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

 

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值