打印
[STM32F1]

有没有用过SCA61T 或 SCA100T倾角传感器的,测量角度问题,急!

[复制链接]
4849|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用的是SCA61T-FA1H1G倾角传感器,用的SPI方式读取X轴的值,读取11位数据后,发现在0度和90度时候都比较准确,而始终测不到-90度,读取值11位数据最小是217,换算后也就是-80度,这个是怎么回事?
沙发
mmuuss586| | 2017-3-30 14:44 | 只看该作者
没用过;

是不是换算方式不对

使用特权

评论回复
板凳
18518779114|  楼主 | 2017-3-30 16:08 | 只看该作者
mmuuss586 发表于 2017-3-30 14:44
没用过;

是不是换算方式不对

应该不是,我在采集端,把采集值固定写成205,换算出来的是-90度。 现在问题是,采集这个传感器值,读不到205,我把传感器按90度放置,只能读出217的值(也就是80度),不知道是传感器自身问题,还是硬件电路问题,还是软件采集SPI方式采集问题。

使用特权

评论回复
地板
18518779114|  楼主 | 2017-3-30 16:43 | 只看该作者
这是采集值与角度对应的表

微信截图_20170330113624.png (42.4 KB )

微信截图_20170330113624.png

使用特权

评论回复
5
chenghaichao| | 2017-3-30 20:58 | 只看该作者
你可以跟模拟电压对比量一下。

使用特权

评论回复
6
18518779114|  楼主 | 2017-3-31 09:09 | 只看该作者
chenghaichao 发表于 2017-3-30 20:58
你可以跟模拟电压对比量一下。

目前因为硬件工程师已经做好板子,没有接那个模拟电压的管脚,暂时没法测量。
不过昨天我又测试了一下SPI方式读取X轴的值,发现在-90的位置的时候,并不是读不到205,可以偶尔读到205,或207的值(换算后角度是-90度左右)。但是必须在-90度位置一直得晃动传感器,才可以读到。 如果在-90度位置静止不动,就只能读出217或更高,换算角度就是-70多度至-80度。 不停的晃动,才偶尔出现-90度,这个现象好奇怪?不知道是什么原因。

使用特权

评论回复
7
chenghaichao| | 2017-3-31 21:14 | 只看该作者
传感器本身在端值的时候都是跳变的,采样加滤波处理吧,另外不知道什么封装的,引脚应该能测量到吧。

使用特权

评论回复
8
18518779114|  楼主 | 2017-4-1 16:43 | 只看该作者
chenghaichao 发表于 2017-3-31 21:14
传感器本身在端值的时候都是跳变的,采样加滤波处理吧,另外不知道什么封装的,引脚应该能测量到吧。 ...

加过滤处理了,数值稳定,但是值不是-90度。目前考虑用传感器的模拟输出管脚测试一下。

使用特权

评论回复
9
18518779114|  楼主 | 2017-4-1 16:46 | 只看该作者
18518779114 发表于 2017-4-1 16:43
加过滤处理了,数值稳定,但是值不是-90度。目前考虑用传感器的模拟输出管脚测试一下。 ...

用的STM32采集的传感器值,一开始使用硬件SPI方式,其它角度测量都没问题,就是-90度总是不行。后又用IO口模拟SPI方式读取传感器值,效果是一样的,将传感器-90放置,测量总是-80。依然没能解决问题。

使用特权

评论回复
10
chenghaichao| | 2017-4-1 21:42 | 只看该作者
所有的电源相关都得是高精度的。

使用特权

评论回复
11
febgxu| | 2017-4-1 22:59 | 只看该作者
计算的数据有问题吗

使用特权

评论回复
12
febgxu| | 2017-4-1 23:01 | 只看该作者
看看你的代码,使用传感器数据对不对

使用特权

评论回复
13
18518779114|  楼主 | 2017-4-2 09:55 | 只看该作者
chenghaichao 发表于 2017-4-1 21:42
所有的电源相关都得是高精度的。

现在又用AD方式采集测试了一下,当平放时候,采集电压时2.5V,0度。 当按-90度方向放置传感器,采集值是0.54左右,是-80度左右,还是没到-90,跟SPI方式采集的现象基本一致。

使用特权

评论回复
14
18518779114|  楼主 | 2017-4-2 09:57 | 只看该作者
febgxu 发表于 2017-4-1 23:01
看看你的代码,使用传感器数据对不对

计算应该没问题吧,0度到正90度的计算都正确,但是从传感器采集的数值,始终不能到-90度,只能到-80度左右。
void SCA61T_SpiInit(void) 
{
  
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Enable SPI3 and GPIO clocks */  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3 , ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  
  /* Connect PXx to SPI_SCK */
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
  
  /* Connect PXx to SPI_MISO */
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
  
  /* Connect PXx to SPI_MOSI */
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);  
  
  /* Configure SPI3 pins: SCK, MISO and MOSI */
  GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd         = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  /* SPI3 configuration */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI3, &SPI_InitStructure);
  
  /* Enable SPI3 */
  SPI_Cmd(SPI3, ENABLE);
  
  /* Configure GPIO PIN for Lis Chip select */
  GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd         = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Deselect : Chip Select high */
  GPIO_SetBits(GPIOA, GPIO_Pin_15);
       
}

/*******************************************************************************
* Function Name  : SCA61T_SPI_SendByte
* Description    : Sends a Byte through the SPI interface and return the
*                  Byte received from the SPI bus.
* Input          : Byte : Byte send.
* Output         : None
* Return         : The received byte value
*******************************************************************************/
uint8_t SCA61T_SPI_SendByte(uint8_t byte)
{
  /* Loop while DR register in not emplty */
  while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
  
  /* Send Half Word through the SPI peripheral */
  SPI_I2S_SendData(SPI3, byte);
       
  /* Wait to receive a Half Word */
  while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET);
  
  /* Return the Half Word read from the SPI bus */
  return (int8_t)SPI_I2S_ReceiveData(SPI3);
}


uint8_t SCA61T_ReadDataReg(uint8_t Reg, uint16_t* Data)
{
   
    uint8_t value_h=0,value_l=0;
    uint16_t value_temp=0;
               
    SCA61T_CS_LOW();
               
    SCA61T_SPI_SendByte(Reg);                                                                                //read x data command
    value_h = SCA61T_SPI_SendByte(0xFF);                                //read  hight 8 bit data       
    value_l = SCA61T_SPI_SendByte(0xFF);                                //read  low 8 bit data
   
    SCA61T_CS_HIGH();
               
    value_temp = ((uint16_t)value_h & 0x00FF);                                                                                                                                       
    value_temp = ((value_temp << 3) & 0x07F8) + (((value_l & 0xE0) >> 5) & 0x07);                //hight 8 bit + low 3 bit  = 11bit x data;
   
   *Data = value_temp;
               
    return MEMS_SUCCESS;
}

uint16_t SCA61T_Read_Xdata(void)
{
                uint16_t x_value=0;
               
                SCA61T_CS_HIGH();
                vTaskDelay(1);
                SCA61T_ReadDataReg(RDAX_REG,&x_value);
                my_uDelay(10);
                return x_value;
               
}

float SCA61T_Transformation_Angle(float senscomp)
{
                float angle=0.00f;
                uint8_t i=0;
                uint16_t x_value=0;
                uint32_t temp_value=0;
               
                for(i=0; i<3; i++)
                {
                    temp_value += SCA61T_Read_Xdata();
                }
                x_value = temp_value / i;
               
                if(x_value <= 1024 - SENS) x_value = 1024-SENS;
                if(x_value >= 1024 + SENS) x_value = 1024+SENS;
                angle=asinf(((float)x_value-1024.00)/senscomp);
               
                angle=angle*180/PI;
               
                return angle;
}

使用特权

评论回复
15
18518779114|  楼主 | 2017-4-2 10:03 | 只看该作者
我的主芯片是STM32 传感器用的是 SCA61T-FA1H1G  测量范围是正负90度   

使用特权

评论回复
16
wangdezhi| | 2017-4-2 11:36 | 只看该作者
使用校准算法了吗?

使用特权

评论回复
17
wangdezhi| | 2017-4-2 11:40 | 只看该作者
推荐mpu6050芯片,这个计算角度。

使用特权

评论回复
18
uiint| | 2017-4-2 22:33 | 只看该作者
这个不是ADC采样的角度传感器么

使用特权

评论回复
19
uiint| | 2017-4-2 22:41 | 只看该作者
换算的方式不对,这个没有用过。

使用特权

评论回复
20
18518779114|  楼主 | 2017-4-3 20:39 | 只看该作者
uiint 发表于 2017-4-2 22:41
换算的方式不对,这个没有用过。

换算方式不对么????

这个是ADC采样和SPI采用两种方式,可通过硬件接线选择。  目前我这两种方式都尝试过,效果一样。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝