mirror of
https://gitee.com/seekfree/TC264_Library.git
synced 2026-06-04 03:32:56 +00:00
V3.4.5 增加660RC驱动 增加660RC例程·
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,5 @@
|
|||||||
|
V3.4.5
|
||||||
|
<09><><EFBFBD><EFBFBD>660RC<52><43><EFBFBD><EFBFBD>
|
||||||
V3.4.4
|
V3.4.4
|
||||||
<09><EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
|
<09><EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
|
||||||
<09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD>
|
<09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD>
|
||||||
|
|||||||
@@ -90,6 +90,7 @@
|
|||||||
#include "zf_device_icm20602.h"
|
#include "zf_device_icm20602.h"
|
||||||
#include "zf_device_imu660ra.h"
|
#include "zf_device_imu660ra.h"
|
||||||
#include "zf_device_imu660rb.h"
|
#include "zf_device_imu660rb.h"
|
||||||
|
#include "zf_device_imu660rc.h"
|
||||||
#include "zf_device_imu660rx.h"
|
#include "zf_device_imu660rx.h"
|
||||||
#include "zf_device_imu963ra.h"
|
#include "zf_device_imu963ra.h"
|
||||||
#include "zf_device_ips114.h"
|
#include "zf_device_ips114.h"
|
||||||
|
|||||||
@@ -0,0 +1,563 @@
|
|||||||
|
/*********************************************************************************************************************
|
||||||
|
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD>⣩<EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
|
||||||
|
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᷢ<EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD>棨<EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><DEB8><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
|
||||||
|
*
|
||||||
|
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
|
||||||
|
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뱣<EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
|
||||||
|
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾
|
||||||
|
* <20>汾<EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
|
||||||
|
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
|
||||||
|
*
|
||||||
|
* <20>ļ<DEB8>¼
|
||||||
|
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
|
||||||
|
* 2025-12-12 SeekFree first version
|
||||||
|
********************************************************************************************************************/
|
||||||
|
/*********************************************************************************************************************
|
||||||
|
* <20><><EFBFBD>߶<EFBFBD><DFB6>壺
|
||||||
|
* ------------------------------------
|
||||||
|
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
|
||||||
|
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* ------------------------------------
|
||||||
|
********************************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
#include "zf_common_debug.h"
|
||||||
|
#include "zf_driver_delay.h"
|
||||||
|
#include "zf_driver_spi.h"
|
||||||
|
#include "zf_driver_gpio.h"
|
||||||
|
#include "zf_driver_soft_iic.h"
|
||||||
|
#include "zf_device_config.h"
|
||||||
|
#include "zf_driver_uart.h"
|
||||||
|
#include "zf_driver_exti.h"
|
||||||
|
|
||||||
|
#include "zf_device_imu660rc.h"
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.1415926f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static uint8 imu660rc_quarternion_rate;
|
||||||
|
|
||||||
|
float imu660rc_transition_factor[2];
|
||||||
|
int16 imu660rc_gyro_x = 0, imu660rc_gyro_y = 0, imu660rc_gyro_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
|
int16 imu660rc_acc_x = 0, imu660rc_acc_y = 0, imu660rc_acc_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>)
|
||||||
|
float imu660rc_roll = 0, imu660rc_pitch = 0, imu660rc_yaw = 0; // ŷ<><C5B7><EFBFBD><EFBFBD>
|
||||||
|
float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if IMU660RC_USE_SOFT_IIC
|
||||||
|
static soft_iic_info_struct imu660rc_iic_struct;
|
||||||
|
|
||||||
|
#define imu660rc_write_register(reg, data) (soft_iic_write_8bit_register (&imu660rc_iic_struct, (reg), (data)))
|
||||||
|
#define imu660rc_write_registers(reg, data, len) (soft_iic_write_8bit_registers(&imu660rc_iic_struct, (reg), (data), (len)))
|
||||||
|
#define imu660rc_read_register(reg) (soft_iic_read_8bit_register (&imu660rc_iic_struct, (reg)))
|
||||||
|
#define imu660rc_read_registers(reg, data, len) (soft_iic_read_8bit_registers (&imu660rc_iic_struct, (reg), (data), (len)))
|
||||||
|
#else
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC д<>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void imu660rc_write_register (uint8 reg, uint8 data)
|
||||||
|
{
|
||||||
|
IMU660RC_CS(0);
|
||||||
|
spi_write_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_W, data);
|
||||||
|
IMU660RC_CS(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_register(IMU660RC_CHIP_ID);
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static uint8 imu660rc_read_register (uint8 reg)
|
||||||
|
{
|
||||||
|
uint8 data;
|
||||||
|
IMU660RC_CS(0);
|
||||||
|
data = spi_read_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_R);
|
||||||
|
IMU660RC_CS(1);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_registers(IMU660RC_ACC_ADDRESS, dat, 6);
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void imu660rc_read_registers (uint8 reg, uint8 *data, uint32 len)
|
||||||
|
{
|
||||||
|
IMU660RC_CS(0);
|
||||||
|
spi_read_8bit_registers(IMU660RC_SPI, reg | IMU660RC_SPI_R, data, len);
|
||||||
|
IMU660RC_CS(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC fp16ת<36><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static uint32 fp16_to_float(uint16 h)
|
||||||
|
{
|
||||||
|
uint16 h_exp = (h & 0x7c00u);
|
||||||
|
uint32 f_sgn = ((uint32)h & 0x8000u) << 16;
|
||||||
|
switch (h_exp)
|
||||||
|
{
|
||||||
|
case 0x0000u: // 0 or subnormal
|
||||||
|
{
|
||||||
|
uint16 h_sig = (h & 0x03ffu);
|
||||||
|
// Signed zero
|
||||||
|
if (h_sig == 0)
|
||||||
|
{
|
||||||
|
return f_sgn;
|
||||||
|
}
|
||||||
|
// Subnormal
|
||||||
|
h_sig <<= 1;
|
||||||
|
while ((h_sig & 0x0400u) == 0)
|
||||||
|
{
|
||||||
|
h_sig <<= 1;
|
||||||
|
h_exp++;
|
||||||
|
}
|
||||||
|
uint32 f_exp = ((uint32)(127 - 15 - h_exp)) << 23;
|
||||||
|
uint32 f_sig = ((uint32)(h_sig & 0x03ffu)) << 13;
|
||||||
|
return f_sgn + f_exp + f_sig;
|
||||||
|
}
|
||||||
|
case 0x7c00u: // inf or NaN
|
||||||
|
{
|
||||||
|
// All-ones exponent and a copy of the significand
|
||||||
|
return f_sgn + 0x7f800000u + (((uint32)(h & 0x03ffu)) << 13);
|
||||||
|
}
|
||||||
|
default: // normalized
|
||||||
|
{
|
||||||
|
// Just need to adjust the exponent and shift
|
||||||
|
return f_sgn + (((uint32)(h & 0x7fffu) + 0x1c000u) << 13);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void quarternion_normalize(float quat[4], uint16 *fp16)
|
||||||
|
{
|
||||||
|
float n = 0;
|
||||||
|
float temp[4];
|
||||||
|
|
||||||
|
*(uint32 *)(&temp[0]) = fp16_to_float(fp16[0]);
|
||||||
|
*(uint32 *)(&temp[1]) = fp16_to_float(fp16[1]);
|
||||||
|
*(uint32 *)(&temp[2]) = fp16_to_float(fp16[2]);
|
||||||
|
*(uint32 *)(&temp[3]) = fp16_to_float(fp16[3]);
|
||||||
|
|
||||||
|
n = temp[0] * temp[0] + temp[1] * temp[1] + temp[2] * temp[2] + temp[3] * temp[3];
|
||||||
|
n = sqrtf(n);
|
||||||
|
|
||||||
|
if(n > 0.001f) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խӽ<D4BD>0<EFBFBD><30>ֵ
|
||||||
|
{
|
||||||
|
n = temp[3] < 0.0f ? -n : n;
|
||||||
|
|
||||||
|
quat[0] = temp[1] / n;
|
||||||
|
quat[1] = temp[2] / n;
|
||||||
|
quat[2] = temp[0] / n;
|
||||||
|
quat[3] = temp[3] / n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void quarternion_to_euler(float quat[4], float *roll, float *pitch, float *yaw)
|
||||||
|
{
|
||||||
|
float euler[3];
|
||||||
|
|
||||||
|
float sqx = quat[0] * quat[0];
|
||||||
|
float sqy = quat[1] * quat[1];
|
||||||
|
float sqz = quat[2] * quat[2];
|
||||||
|
|
||||||
|
euler[0] = atan2f(2.0f * (quat[1] * quat[3] + quat[0] * quat[2]), 1.0f - 2.0f * (sqy + sqx));
|
||||||
|
euler[1] = -asinf(2.0f * (quat[0] * quat[3] - quat[1] * quat[2]));
|
||||||
|
euler[2] = atan2f(2.0f * (quat[0] * quat[1] + quat[2] * quat[3]), 1.0f - 2.0f * (sqx + sqz));
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
|
||||||
|
euler[0] = 180 * (euler[0]) / M_PI;
|
||||||
|
euler[1] = 180 * (euler[1]) / M_PI;
|
||||||
|
euler[2] = 180 * (euler[2]) / M_PI;
|
||||||
|
|
||||||
|
// <20>Ƕȵ<C7B6><C8B5><EFBFBD>
|
||||||
|
euler[2] = 0 > euler[2] ? euler[2] + 360 : euler[2];
|
||||||
|
|
||||||
|
*roll = euler[0];
|
||||||
|
*pitch = euler[1];
|
||||||
|
*yaw = euler[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void imu660rc_set_mem_bank (imu660rc_mem_bank_enum bank)
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, bank);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D>Լ<EFBFBD>ʧ<EFBFBD><CAA7> 0-<2D>Լ<EFBFBD><D4BC>ɹ<EFBFBD>
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_self_check();
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static uint8 imu660rc_self_check (void)
|
||||||
|
{
|
||||||
|
uint8 dat = 0, return_state = 0;
|
||||||
|
uint16 timeout_count = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(IMU660RC_TIMEOUT_COUNT < timeout_count ++)
|
||||||
|
{
|
||||||
|
return_state = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dat = imu660rc_read_register(IMU660RC_CHIP_ID);
|
||||||
|
system_delay_ms(1);
|
||||||
|
}while(0x70 != dat); // <20><>ȡ<EFBFBD>豸ID<49>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD>Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>豸
|
||||||
|
return return_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_acc(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_get_acc (void)
|
||||||
|
{
|
||||||
|
int16 dat[3];
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
|
||||||
|
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_ACC<43><43><EFBFBD><EFBFBD>Ϊ1
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)dat, 6);
|
||||||
|
imu660rc_acc_x = dat[0];
|
||||||
|
imu660rc_acc_y = dat[1];
|
||||||
|
imu660rc_acc_z = dat[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_gyro(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_get_gyro (void)
|
||||||
|
{
|
||||||
|
int16 dat[3];
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
|
||||||
|
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_GYRO<52><4F><EFBFBD><EFBFBD>Ϊ1
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)dat, 6);
|
||||||
|
imu660rc_gyro_x = dat[0];
|
||||||
|
imu660rc_gyro_y = dat[1];
|
||||||
|
imu660rc_gyro_z = dat[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ת<EFBFBD><D7AA>Ϊŷ<CEAA><C5B7><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_quarternion(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20><>Ҫ<EFBFBD><D2AA>INT2<54><32><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵ<D0B6><CFB5>ô˺<C3B4><CBBA><EFBFBD>
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_get_quarternion(void)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
uint16 buff[4];
|
||||||
|
uint8 *buff1_ptr;
|
||||||
|
int16 *buff2_ptr;
|
||||||
|
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE != imu660rc_quarternion_rate)
|
||||||
|
{
|
||||||
|
buff1_ptr = (uint8 *)buff;
|
||||||
|
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_RW, 0x20);
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_SEL, 0x31);
|
||||||
|
|
||||||
|
for(i = 0; 8 > i; i++)
|
||||||
|
{
|
||||||
|
imu660rc_write_register(0x08, 0x4C + i);
|
||||||
|
buff1_ptr[i] = imu660rc_read_register(0x09);
|
||||||
|
}
|
||||||
|
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_RW, 0x0);
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
|
||||||
|
|
||||||
|
// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||||
|
quarternion_normalize(imu660rc_quarternion, buff);
|
||||||
|
// <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
|
||||||
|
quarternion_to_euler(imu660rc_quarternion, &imu660rc_roll, &imu660rc_pitch, &imu660rc_yaw);
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ
|
||||||
|
#if(1 == IMU660RC_QUARTERNION_GET_ACC)
|
||||||
|
{
|
||||||
|
buff2_ptr = (int16 *)buff;
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)buff2_ptr, 6);
|
||||||
|
imu660rc_acc_x = buff2_ptr[0];
|
||||||
|
imu660rc_acc_y = buff2_ptr[1];
|
||||||
|
imu660rc_acc_z = buff2_ptr[2];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if(1 == IMU660RC_QUARTERNION_GET_GYRO)
|
||||||
|
{
|
||||||
|
buff2_ptr = (int16 *)buff;
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)buff2_ptr, 6);
|
||||||
|
imu660rc_gyro_x = buff2_ptr[0];
|
||||||
|
imu660rc_gyro_y = buff2_ptr[1];
|
||||||
|
imu660rc_gyro_z = buff2_ptr[2];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC<52>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD><D0B6>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_callback(void)
|
||||||
|
{
|
||||||
|
imu660rc_get_quarternion();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC> IMU660RC
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> quarternion_rate ѡ<><D1A1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7> 0-<2D><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_init(IMU660RC_QUARTERNION_120HZ);
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
uint8 imu660rc_init(imu660rc_quarternion_rate_config quarternion_rate)
|
||||||
|
{
|
||||||
|
uint8 return_state = 0;
|
||||||
|
|
||||||
|
imu660rc_quarternion_rate = quarternion_rate;
|
||||||
|
#if IMU660RC_USE_SOFT_IIC
|
||||||
|
soft_iic_init(&imu660rc_iic_struct, IMU660RC_DEV_ADDR, IMU660RC_SOFT_IIC_DELAY, IMU660RC_SCL_PIN, IMU660RC_SDA_PIN); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> IIC <20>˿<EFBFBD>
|
||||||
|
|
||||||
|
#else
|
||||||
|
spi_init(IMU660RC_SPI, SPI_MODE0, IMU660RC_SPI_SPEED, IMU660RC_SPC_PIN, IMU660RC_SDI_PIN, IMU660RC_SDO_PIN, SPI_CS_NULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> SPI <20>˿<EFBFBD>
|
||||||
|
gpio_init(IMU660RC_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><>CS<43>˿<EFBFBD>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
system_delay_ms(10);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(imu660rc_self_check()) // IMU660RC <20>Լ<EFBFBD>
|
||||||
|
{
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE>ǻ<EFBFBD><C7BB><EFBFBD>
|
||||||
|
zf_log(0, "imu660rc self check error.");
|
||||||
|
return_state = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, 0x04);
|
||||||
|
system_delay_ms(30);
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL3, 0x44);
|
||||||
|
|
||||||
|
switch(IMU660RC_ACC_SAMPLE_DEFAULT)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
zf_log(0, "IMU660RC_ACC_SAMPLE_DEFAULT set error.");
|
||||||
|
return_state = 1;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_2G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x00);
|
||||||
|
imu660rc_transition_factor[0] = 16393.44;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_4G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x01);
|
||||||
|
imu660rc_transition_factor[0] = 8196.72;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_8G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x02);
|
||||||
|
imu660rc_transition_factor[0] = 4098.36;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_16G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x03);
|
||||||
|
imu660rc_transition_factor[0] = 2049.18;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
if(1 == return_state)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(IMU660RC_GYRO_SAMPLE_DEFAULT)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
zf_log(0, "IMU660RC_GYRO_SAMPLE_DEFAULT set error.");
|
||||||
|
return_state = 1;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_125DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x00);
|
||||||
|
imu660rc_transition_factor[1] = 228.5714;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_250DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x01);
|
||||||
|
imu660rc_transition_factor[1] = 114.2857;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_500DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x02);
|
||||||
|
imu660rc_transition_factor[1] = 57.1428;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_1000DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x03);
|
||||||
|
imu660rc_transition_factor[1] = 28.5714;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_2000DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x04);
|
||||||
|
imu660rc_transition_factor[1] = 14.2857;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_4000DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x0C);
|
||||||
|
imu660rc_transition_factor[1] = 7.14285;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
if(1 == return_state)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>߾<EFBFBD><DFBE><EFBFBD>ģʽ<C4A3>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL1, 0x15);
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL2, 0x18);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>LPF1<46>˲<EFBFBD><CBB2><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL7, 0x01);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>LPF2<46>˲<EFBFBD><CBB2><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL9, 0x08);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE != quarternion_rate)
|
||||||
|
{
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD>ź<EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_INT2_CTRL, 0x80);
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL4, 0x08);
|
||||||
|
imu660rc_write_register(IMU660RC_EMB_FUNC_CFG, 0x30);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC>ٶȡ<D9B6><C8A1><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL1, 0x10 | (quarternion_rate + 3));
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL2, 0x10 | (quarternion_rate + 3));
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
|
||||||
|
imu660rc_write_register(IMU660RC_SFLP_ODR, 0x43 | (quarternion_rate << 3));
|
||||||
|
imu660rc_write_register(IMU660RC_EMB_FUNC_EN_A, 0x02);
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_RW, 0x00);
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
exti_init(ERU_CH0_REQ0_P15_4, EXTI_TRIGGER_RISING);
|
||||||
|
}
|
||||||
|
}while(0);
|
||||||
|
|
||||||
|
return return_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,211 @@
|
|||||||
|
/*********************************************************************************************************************
|
||||||
|
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD>⣩<EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
|
||||||
|
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᷢ<EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD>棨<EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><DEB8><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
|
||||||
|
*
|
||||||
|
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
|
||||||
|
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뱣<EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
|
||||||
|
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾
|
||||||
|
* <20>汾<EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
|
||||||
|
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
|
||||||
|
*
|
||||||
|
* <20>ļ<DEB8>¼
|
||||||
|
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
|
||||||
|
* 2025-12-12 SeekFree first version
|
||||||
|
********************************************************************************************************************/
|
||||||
|
/*********************************************************************************************************************
|
||||||
|
* <20><><EFBFBD>߶<EFBFBD><DFB6>壺
|
||||||
|
* ------------------------------------
|
||||||
|
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
|
||||||
|
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* ------------------------------------
|
||||||
|
********************************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _zf_device_imu660rc_h_
|
||||||
|
#define _zf_device_imu660rc_h_
|
||||||
|
|
||||||
|
#include "zf_common_typedef.h"
|
||||||
|
|
||||||
|
|
||||||
|
// IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾʹ<CABE><CAB9>Ӳ<EFBFBD><D3B2>SPI<50><49><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ1<CEAA><31>ʾʹ<CABE><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IIC<49><43><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȱ<EFBFBD><C8B1>벢<EFBFBD><EBB2A2><EFBFBD>س<EFBFBD><D8B3><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҫ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
|
||||||
|
#define IMU660RC_USE_SOFT_IIC ( 1 ) // Ĭ<><C4AC>ʹ<EFBFBD><CAB9>Ӳ<EFBFBD><D3B2> SPI <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
#if IMU660RC_USE_SOFT_IIC // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7> <20><>ɫ<EFBFBD>ҵľ<D2B5><C4BE><EFBFBD>û<EFBFBD><C3BB><EFBFBD>õ<EFBFBD>
|
||||||
|
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#define IMU660RC_SOFT_IIC_DELAY ( 0 ) // <20><><EFBFBD><EFBFBD> IIC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> <20><>ֵԽС IIC ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
||||||
|
#define IMU660RC_SCL_PIN ( P20_11 ) // <20><><EFBFBD><EFBFBD> IIC SCL <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SCL <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SDA_PIN ( P20_14 ) // <20><><EFBFBD><EFBFBD> IIC SDA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SDA <20><><EFBFBD><EFBFBD>
|
||||||
|
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#else
|
||||||
|
|
||||||
|
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#define IMU660RC_SPI_SPEED (10 * 1000 * 1000) // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SPI (SPI_0) // Ӳ<><D3B2> SPI <20><>
|
||||||
|
#define IMU660RC_SPC_PIN (SPI0_SCLK_P20_11 ) // Ӳ<><D3B2> SPI SCK <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SDI_PIN (SPI0_MOSI_P20_14) // Ӳ<><D3B2> SPI MOSI <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SDO_PIN (SPI0_MISO_P20_12) // Ӳ<><D3B2> SPI MISO <20><><EFBFBD><EFBFBD>
|
||||||
|
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#endif
|
||||||
|
#define IMU660RC_CS_PIN ( P20_13 ) // CS Ƭѡ<C6AC><D1A1><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_CS(x) ( (x) ? (gpio_high(IMU660RC_CS_PIN)) : (gpio_low(IMU660RC_CS_PIN)) )
|
||||||
|
#define IMU660RC_INT2_PIN ( ERU_CH0_REQ0_P15_4 ) // <20>ж<EFBFBD><D0B6>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD><CAB1>Ҫʹ<D2AA><CAB9>
|
||||||
|
|
||||||
|
|
||||||
|
#define IMU660RC_QUARTERNION_GET_GYRO ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
|
||||||
|
#define IMU660RC_QUARTERNION_GET_ACC ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
|
||||||
|
#define IMU660RC_ACC_SAMPLE_DEFAULT ( IMU660RC_ACC_SAMPLE_SGN_8G ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>ٶȼ<D9B6> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_GYRO_SAMPLE_DEFAULT ( IMU660RC_GYRO_SAMPLE_SGN_2000DPS ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_MAIN_MEM_BANK = 0x00,
|
||||||
|
IMU660RC_HUB_MEM_BANK = 0x40,
|
||||||
|
IMU660RC_EMBED_MEM_BANK = 0x80,
|
||||||
|
}imu660rc_mem_bank_enum;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_2G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>2G (ACC = Accelerometer <20><><EFBFBD>ٶȼ<D9B6>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (G = g <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> g<><67>9.80 m/s^2)
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_4G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>4G
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_8G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>8G
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_16G, // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>16G
|
||||||
|
}imu660rc_acc_sample_config;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_125DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>125DPS (GYRO = Gyroscope <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (DPS = Degree Per Second <20><><EFBFBD>ٶȵ<D9B6>λ <20><>/S)
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_250DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>250DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_500DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>500DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_1000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>1000DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_2000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>2000DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_4000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>4000DPS
|
||||||
|
}imu660rc_gyro_sample_config;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_QUARTERNION_15HZ, // 15 Hz
|
||||||
|
IMU660RC_QUARTERNION_30HZ, // 30 Hz
|
||||||
|
IMU660RC_QUARTERNION_60HZ, // 60 Hz
|
||||||
|
IMU660RC_QUARTERNION_120HZ, // 120Hz
|
||||||
|
IMU660RC_QUARTERNION_240HZ, // 240Hz
|
||||||
|
IMU660RC_QUARTERNION_480HZ, // 480Hz
|
||||||
|
IMU660RC_QUARTERNION_DISABLE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
}imu660rc_quarternion_rate_config;
|
||||||
|
|
||||||
|
|
||||||
|
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>ڲ<EFBFBD><DAB2><EFBFBD>ַ================================================
|
||||||
|
#define IMU660RC_DEV_ADDR ( 0x6B ) // SA0<41>ӵأ<D3B5>0x6A SA0<41><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x6B ģ<><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SPI_W ( 0x00 )
|
||||||
|
#define IMU660RC_SPI_R ( 0x80 )
|
||||||
|
#define IMU660RC_TIMEOUT_COUNT ( 0x00FF ) // IMU660RC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
|
||||||
|
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ================================================
|
||||||
|
#define IMU660RC_FUNC_CFG_ACCESS ( 0x01 )
|
||||||
|
#define IMU660RC_INT2_CTRL ( 0x0E )
|
||||||
|
#define IMU660RC_CHIP_ID ( 0x0F )
|
||||||
|
#define IMU660RC_CTRL1 ( 0x10 )
|
||||||
|
#define IMU660RC_CTRL2 ( 0x11 )
|
||||||
|
#define IMU660RC_CTRL3 ( 0x12 )
|
||||||
|
#define IMU660RC_CTRL4 ( 0x13 )
|
||||||
|
#define IMU660RC_CTRL5 ( 0x14 )
|
||||||
|
#define IMU660RC_CTRL6 ( 0x15 )
|
||||||
|
#define IMU660RC_CTRL7 ( 0x16 )
|
||||||
|
#define IMU660RC_CTRL8 ( 0x17 )
|
||||||
|
#define IMU660RC_CTRL9 ( 0x18 )
|
||||||
|
#define IMU660RC_CTRL10 ( 0x19 )
|
||||||
|
#define IMU660RC_CTRL_STATUS ( 0x1A )
|
||||||
|
#define IMU660RC_STATUS_REG ( 0x1E )
|
||||||
|
#define IMU660RC_OUT_TEMP_L ( 0x20 )
|
||||||
|
#define IMU660RC_OUT_TEMP_H ( 0x21 )
|
||||||
|
#define IMU660RC_OUTX_L_G ( 0x22 )
|
||||||
|
#define IMU660RC_OUTX_H_G ( 0x23 )
|
||||||
|
#define IMU660RC_OUTY_L_G ( 0x24 )
|
||||||
|
#define IMU660RC_OUTY_H_G ( 0x25 )
|
||||||
|
#define IMU660RC_OUTZ_L_G ( 0x26 )
|
||||||
|
#define IMU660RC_OUTZ_H_G ( 0x27 )
|
||||||
|
#define IMU660RC_OUTX_L_A ( 0x28 )
|
||||||
|
#define IMU660RC_OUTX_H_A ( 0x29 )
|
||||||
|
#define IMU660RC_OUTY_L_A ( 0x2A )
|
||||||
|
#define IMU660RC_OUTY_H_A ( 0x2B )
|
||||||
|
#define IMU660RC_OUTZ_L_A ( 0x2C )
|
||||||
|
#define IMU660RC_OUTZ_H_A ( 0x2D )
|
||||||
|
|
||||||
|
#define IMU660RC_PAGE_SEL ( 0x02 )
|
||||||
|
#define IMU660RC_EMB_FUNC_EN_A ( 0x04 )
|
||||||
|
#define IMU660RC_PAGE_RW ( 0x17 )
|
||||||
|
#define IMU660RC_SFLP_ODR ( 0x5E )
|
||||||
|
#define IMU660RC_EMB_FUNC_CFG ( 0x63 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern float imu660rc_transition_factor[2];
|
||||||
|
extern int16 imu660rc_gyro_x, imu660rc_gyro_y, imu660rc_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
extern int16 imu660rc_acc_x , imu660rc_acc_y , imu660rc_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
extern float imu660rc_roll , imu660rc_pitch , imu660rc_yaw; // ŷ<><C5B7><EFBFBD><EFBFBD>
|
||||||
|
extern float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
|
||||||
|
|
||||||
|
|
||||||
|
void imu660rc_get_acc (void);
|
||||||
|
void imu660rc_get_gyro (void);
|
||||||
|
void imu660rc_get_quarternion (void);
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> acc_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_acc_transition(imu660rc_acc_x); // <20><>λΪ g(m/s^2)
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
#define imu660rc_acc_transition(acc_value) ((float)(acc_value) / imu660rc_transition_factor[0])
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> gyro_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_gyro_transition(imu660rc_gyro_x); // <20><>λΪ <20><>/s
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
#define imu660rc_gyro_transition(gyro_value) ((float)(gyro_value) / imu660rc_transition_factor[1])
|
||||||
|
void imu660rc_callback (void);
|
||||||
|
uint8 imu660rc_init (imu660rc_quarternion_rate_config quarternion_rate);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -49,7 +49,6 @@ int core0_main(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// <20>˴<EFBFBD><CBB4><EFBFBD>д<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// <20>˴<EFBFBD><CBB4><EFBFBD>д<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
cpu_wait_event_ready(); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
cpu_wait_event_ready(); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ IFX_INTERRUPT(exti_ch0_ch4_isr, 0, EXTI_CH0_CH4_INT_PRIO)
|
|||||||
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_callback(); // 660RC ģ<><C4A3> INT <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
V3.4.3
|
||||||
|
<09><><EFBFBD><EFBFBD>660RC<52><43><EFBFBD><EFBFBD>
|
||||||
V3.4.2
|
V3.4.2
|
||||||
<09><EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
|
<09><EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
|
||||||
<09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD>
|
<09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD>
|
||||||
|
|||||||
@@ -91,6 +91,7 @@
|
|||||||
#include "zf_device_imu660ra.h"
|
#include "zf_device_imu660ra.h"
|
||||||
#include "zf_device_imu660rb.h"
|
#include "zf_device_imu660rb.h"
|
||||||
#include "zf_device_imu660rx.h"
|
#include "zf_device_imu660rx.h"
|
||||||
|
#include "zf_device_imu660rc.h"
|
||||||
#include "zf_device_imu963ra.h"
|
#include "zf_device_imu963ra.h"
|
||||||
#include "zf_device_ips114.h"
|
#include "zf_device_ips114.h"
|
||||||
#include "zf_device_ips200.h"
|
#include "zf_device_ips200.h"
|
||||||
|
|||||||
@@ -0,0 +1,563 @@
|
|||||||
|
/*********************************************************************************************************************
|
||||||
|
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD>⣩<EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
|
||||||
|
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᷢ<EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD>棨<EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><DEB8><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
|
||||||
|
*
|
||||||
|
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
|
||||||
|
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뱣<EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
|
||||||
|
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾
|
||||||
|
* <20>汾<EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
|
||||||
|
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
|
||||||
|
*
|
||||||
|
* <20>ļ<DEB8>¼
|
||||||
|
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
|
||||||
|
* 2025-12-12 SeekFree first version
|
||||||
|
********************************************************************************************************************/
|
||||||
|
/*********************************************************************************************************************
|
||||||
|
* <20><><EFBFBD>߶<EFBFBD><DFB6>壺
|
||||||
|
* ------------------------------------
|
||||||
|
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
|
||||||
|
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* ------------------------------------
|
||||||
|
********************************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
#include "zf_common_debug.h"
|
||||||
|
#include "zf_driver_delay.h"
|
||||||
|
#include "zf_driver_spi.h"
|
||||||
|
#include "zf_driver_gpio.h"
|
||||||
|
#include "zf_driver_soft_iic.h"
|
||||||
|
#include "zf_device_config.h"
|
||||||
|
#include "zf_driver_uart.h"
|
||||||
|
#include "zf_driver_exti.h"
|
||||||
|
|
||||||
|
#include "zf_device_imu660rc.h"
|
||||||
|
|
||||||
|
#ifndef M_PI
|
||||||
|
#define M_PI 3.1415926f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static uint8 imu660rc_quarternion_rate;
|
||||||
|
|
||||||
|
float imu660rc_transition_factor[2];
|
||||||
|
int16 imu660rc_gyro_x = 0, imu660rc_gyro_y = 0, imu660rc_gyro_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
|
int16 imu660rc_acc_x = 0, imu660rc_acc_y = 0, imu660rc_acc_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>)
|
||||||
|
float imu660rc_roll = 0, imu660rc_pitch = 0, imu660rc_yaw = 0; // ŷ<><C5B7><EFBFBD><EFBFBD>
|
||||||
|
float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if IMU660RC_USE_SOFT_IIC
|
||||||
|
static soft_iic_info_struct imu660rc_iic_struct;
|
||||||
|
|
||||||
|
#define imu660rc_write_register(reg, data) (soft_iic_write_8bit_register (&imu660rc_iic_struct, (reg), (data)))
|
||||||
|
#define imu660rc_write_registers(reg, data, len) (soft_iic_write_8bit_registers(&imu660rc_iic_struct, (reg), (data), (len)))
|
||||||
|
#define imu660rc_read_register(reg) (soft_iic_read_8bit_register (&imu660rc_iic_struct, (reg)))
|
||||||
|
#define imu660rc_read_registers(reg, data, len) (soft_iic_read_8bit_registers (&imu660rc_iic_struct, (reg), (data), (len)))
|
||||||
|
#else
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC д<>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void imu660rc_write_register (uint8 reg, uint8 data)
|
||||||
|
{
|
||||||
|
IMU660RC_CS(0);
|
||||||
|
spi_write_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_W, data);
|
||||||
|
IMU660RC_CS(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_register(IMU660RC_CHIP_ID);
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static uint8 imu660rc_read_register (uint8 reg)
|
||||||
|
{
|
||||||
|
uint8 data;
|
||||||
|
IMU660RC_CS(0);
|
||||||
|
data = spi_read_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_R);
|
||||||
|
IMU660RC_CS(1);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_registers(IMU660RC_ACC_ADDRESS, dat, 6);
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void imu660rc_read_registers (uint8 reg, uint8 *data, uint32 len)
|
||||||
|
{
|
||||||
|
IMU660RC_CS(0);
|
||||||
|
spi_read_8bit_registers(IMU660RC_SPI, reg | IMU660RC_SPI_R, data, len);
|
||||||
|
IMU660RC_CS(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC fp16ת<36><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static uint32 fp16_to_float(uint16 h)
|
||||||
|
{
|
||||||
|
uint16 h_exp = (h & 0x7c00u);
|
||||||
|
uint32 f_sgn = ((uint32)h & 0x8000u) << 16;
|
||||||
|
switch (h_exp)
|
||||||
|
{
|
||||||
|
case 0x0000u: // 0 or subnormal
|
||||||
|
{
|
||||||
|
uint16 h_sig = (h & 0x03ffu);
|
||||||
|
// Signed zero
|
||||||
|
if (h_sig == 0)
|
||||||
|
{
|
||||||
|
return f_sgn;
|
||||||
|
}
|
||||||
|
// Subnormal
|
||||||
|
h_sig <<= 1;
|
||||||
|
while ((h_sig & 0x0400u) == 0)
|
||||||
|
{
|
||||||
|
h_sig <<= 1;
|
||||||
|
h_exp++;
|
||||||
|
}
|
||||||
|
uint32 f_exp = ((uint32)(127 - 15 - h_exp)) << 23;
|
||||||
|
uint32 f_sig = ((uint32)(h_sig & 0x03ffu)) << 13;
|
||||||
|
return f_sgn + f_exp + f_sig;
|
||||||
|
}
|
||||||
|
case 0x7c00u: // inf or NaN
|
||||||
|
{
|
||||||
|
// All-ones exponent and a copy of the significand
|
||||||
|
return f_sgn + 0x7f800000u + (((uint32)(h & 0x03ffu)) << 13);
|
||||||
|
}
|
||||||
|
default: // normalized
|
||||||
|
{
|
||||||
|
// Just need to adjust the exponent and shift
|
||||||
|
return f_sgn + (((uint32)(h & 0x7fffu) + 0x1c000u) << 13);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void quarternion_normalize(float quat[4], uint16 *fp16)
|
||||||
|
{
|
||||||
|
float n = 0;
|
||||||
|
float temp[4];
|
||||||
|
|
||||||
|
*(uint32 *)(&temp[0]) = fp16_to_float(fp16[0]);
|
||||||
|
*(uint32 *)(&temp[1]) = fp16_to_float(fp16[1]);
|
||||||
|
*(uint32 *)(&temp[2]) = fp16_to_float(fp16[2]);
|
||||||
|
*(uint32 *)(&temp[3]) = fp16_to_float(fp16[3]);
|
||||||
|
|
||||||
|
n = temp[0] * temp[0] + temp[1] * temp[1] + temp[2] * temp[2] + temp[3] * temp[3];
|
||||||
|
n = sqrtf(n);
|
||||||
|
|
||||||
|
if(n > 0.001f) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խӽ<D4BD>0<EFBFBD><30>ֵ
|
||||||
|
{
|
||||||
|
n = temp[3] < 0.0f ? -n : n;
|
||||||
|
|
||||||
|
quat[0] = temp[1] / n;
|
||||||
|
quat[1] = temp[2] / n;
|
||||||
|
quat[2] = temp[0] / n;
|
||||||
|
quat[3] = temp[3] / n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void quarternion_to_euler(float quat[4], float *roll, float *pitch, float *yaw)
|
||||||
|
{
|
||||||
|
float euler[3];
|
||||||
|
|
||||||
|
float sqx = quat[0] * quat[0];
|
||||||
|
float sqy = quat[1] * quat[1];
|
||||||
|
float sqz = quat[2] * quat[2];
|
||||||
|
|
||||||
|
euler[0] = atan2f(2.0f * (quat[1] * quat[3] + quat[0] * quat[2]), 1.0f - 2.0f * (sqy + sqx));
|
||||||
|
euler[1] = -asinf(2.0f * (quat[0] * quat[3] - quat[1] * quat[2]));
|
||||||
|
euler[2] = atan2f(2.0f * (quat[0] * quat[1] + quat[2] * quat[3]), 1.0f - 2.0f * (sqx + sqz));
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
|
||||||
|
euler[0] = 180 * (euler[0]) / M_PI;
|
||||||
|
euler[1] = 180 * (euler[1]) / M_PI;
|
||||||
|
euler[2] = 180 * (euler[2]) / M_PI;
|
||||||
|
|
||||||
|
// <20>Ƕȵ<C7B6><C8B5><EFBFBD>
|
||||||
|
euler[2] = 0 > euler[2] ? euler[2] + 360 : euler[2];
|
||||||
|
|
||||||
|
*roll = euler[0];
|
||||||
|
*pitch = euler[1];
|
||||||
|
*yaw = euler[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static void imu660rc_set_mem_bank (imu660rc_mem_bank_enum bank)
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, bank);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D>Լ<EFBFBD>ʧ<EFBFBD><CAA7> 0-<2D>Լ<EFBFBD><D4BC>ɹ<EFBFBD>
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_self_check();
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
static uint8 imu660rc_self_check (void)
|
||||||
|
{
|
||||||
|
uint8 dat = 0, return_state = 0;
|
||||||
|
uint16 timeout_count = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(IMU660RC_TIMEOUT_COUNT < timeout_count ++)
|
||||||
|
{
|
||||||
|
return_state = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dat = imu660rc_read_register(IMU660RC_CHIP_ID);
|
||||||
|
system_delay_ms(1);
|
||||||
|
}while(0x70 != dat); // <20><>ȡ<EFBFBD>豸ID<49>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD>Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>豸
|
||||||
|
return return_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_acc(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_get_acc (void)
|
||||||
|
{
|
||||||
|
int16 dat[3];
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
|
||||||
|
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_ACC<43><43><EFBFBD><EFBFBD>Ϊ1
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)dat, 6);
|
||||||
|
imu660rc_acc_x = dat[0];
|
||||||
|
imu660rc_acc_y = dat[1];
|
||||||
|
imu660rc_acc_z = dat[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_gyro(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_get_gyro (void)
|
||||||
|
{
|
||||||
|
int16 dat[3];
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
|
||||||
|
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_GYRO<52><4F><EFBFBD><EFBFBD>Ϊ1
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)dat, 6);
|
||||||
|
imu660rc_gyro_x = dat[0];
|
||||||
|
imu660rc_gyro_y = dat[1];
|
||||||
|
imu660rc_gyro_z = dat[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ת<EFBFBD><D7AA>Ϊŷ<CEAA><C5B7><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_quarternion(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20><>Ҫ<EFBFBD><D2AA>INT2<54><32><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵ<D0B6><CFB5>ô˺<C3B4><CBBA><EFBFBD>
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_get_quarternion(void)
|
||||||
|
{
|
||||||
|
uint8 i;
|
||||||
|
uint16 buff[4];
|
||||||
|
uint8 *buff1_ptr;
|
||||||
|
int16 *buff2_ptr;
|
||||||
|
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE != imu660rc_quarternion_rate)
|
||||||
|
{
|
||||||
|
buff1_ptr = (uint8 *)buff;
|
||||||
|
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_RW, 0x20);
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_SEL, 0x31);
|
||||||
|
|
||||||
|
for(i = 0; 8 > i; i++)
|
||||||
|
{
|
||||||
|
imu660rc_write_register(0x08, 0x4C + i);
|
||||||
|
buff1_ptr[i] = imu660rc_read_register(0x09);
|
||||||
|
}
|
||||||
|
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_RW, 0x0);
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
|
||||||
|
|
||||||
|
// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||||
|
quarternion_normalize(imu660rc_quarternion, buff);
|
||||||
|
// <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
|
||||||
|
quarternion_to_euler(imu660rc_quarternion, &imu660rc_roll, &imu660rc_pitch, &imu660rc_yaw);
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ
|
||||||
|
#if(1 == IMU660RC_QUARTERNION_GET_ACC)
|
||||||
|
{
|
||||||
|
buff2_ptr = (int16 *)buff;
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)buff2_ptr, 6);
|
||||||
|
imu660rc_acc_x = buff2_ptr[0];
|
||||||
|
imu660rc_acc_y = buff2_ptr[1];
|
||||||
|
imu660rc_acc_z = buff2_ptr[2];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if(1 == IMU660RC_QUARTERNION_GET_GYRO)
|
||||||
|
{
|
||||||
|
buff2_ptr = (int16 *)buff;
|
||||||
|
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)buff2_ptr, 6);
|
||||||
|
imu660rc_gyro_x = buff2_ptr[0];
|
||||||
|
imu660rc_gyro_y = buff2_ptr[1];
|
||||||
|
imu660rc_gyro_z = buff2_ptr[2];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC<52>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD><D0B6>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
void imu660rc_callback(void)
|
||||||
|
{
|
||||||
|
imu660rc_get_quarternion();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC> IMU660RC
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> quarternion_rate ѡ<><D1A1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7> 0-<2D><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_init(IMU660RC_QUARTERNION_120HZ);
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
uint8 imu660rc_init(imu660rc_quarternion_rate_config quarternion_rate)
|
||||||
|
{
|
||||||
|
uint8 return_state = 0;
|
||||||
|
|
||||||
|
imu660rc_quarternion_rate = quarternion_rate;
|
||||||
|
#if IMU660RC_USE_SOFT_IIC
|
||||||
|
soft_iic_init(&imu660rc_iic_struct, IMU660RC_DEV_ADDR, IMU660RC_SOFT_IIC_DELAY, IMU660RC_SCL_PIN, IMU660RC_SDA_PIN); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> IIC <20>˿<EFBFBD>
|
||||||
|
|
||||||
|
#else
|
||||||
|
spi_init(IMU660RC_SPI, SPI_MODE0, IMU660RC_SPI_SPEED, IMU660RC_SPC_PIN, IMU660RC_SDI_PIN, IMU660RC_SDO_PIN, SPI_CS_NULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> SPI <20>˿<EFBFBD>
|
||||||
|
gpio_init(IMU660RC_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><>CS<43>˿<EFBFBD>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
system_delay_ms(10);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(imu660rc_self_check()) // IMU660RC <20>Լ<EFBFBD>
|
||||||
|
{
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE>ǻ<EFBFBD><C7BB><EFBFBD>
|
||||||
|
zf_log(0, "imu660rc self check error.");
|
||||||
|
return_state = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, 0x04);
|
||||||
|
system_delay_ms(30);
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL3, 0x44);
|
||||||
|
|
||||||
|
switch(IMU660RC_ACC_SAMPLE_DEFAULT)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
zf_log(0, "IMU660RC_ACC_SAMPLE_DEFAULT set error.");
|
||||||
|
return_state = 1;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_2G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x00);
|
||||||
|
imu660rc_transition_factor[0] = 16393.44;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_4G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x01);
|
||||||
|
imu660rc_transition_factor[0] = 8196.72;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_8G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x02);
|
||||||
|
imu660rc_transition_factor[0] = 4098.36;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_ACC_SAMPLE_SGN_16G:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL8, 0x03);
|
||||||
|
imu660rc_transition_factor[0] = 2049.18;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
if(1 == return_state)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(IMU660RC_GYRO_SAMPLE_DEFAULT)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
zf_log(0, "IMU660RC_GYRO_SAMPLE_DEFAULT set error.");
|
||||||
|
return_state = 1;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_125DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x00);
|
||||||
|
imu660rc_transition_factor[1] = 228.5714;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_250DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x01);
|
||||||
|
imu660rc_transition_factor[1] = 114.2857;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_500DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x02);
|
||||||
|
imu660rc_transition_factor[1] = 57.1428;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_1000DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x03);
|
||||||
|
imu660rc_transition_factor[1] = 28.5714;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_2000DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x04);
|
||||||
|
imu660rc_transition_factor[1] = 14.2857;
|
||||||
|
}break;
|
||||||
|
case IMU660RC_GYRO_SAMPLE_SGN_4000DPS:
|
||||||
|
{
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL6, 0x0C);
|
||||||
|
imu660rc_transition_factor[1] = 7.14285;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
if(1 == return_state)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>߾<EFBFBD><DFBE><EFBFBD>ģʽ<C4A3>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL1, 0x15);
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL2, 0x18);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>LPF1<46>˲<EFBFBD><CBB2><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL7, 0x01);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD>LPF2<46>˲<EFBFBD><CBB2><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL9, 0x08);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
||||||
|
if(IMU660RC_QUARTERNION_DISABLE != quarternion_rate)
|
||||||
|
{
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD>ź<EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_INT2_CTRL, 0x80);
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL4, 0x08);
|
||||||
|
imu660rc_write_register(IMU660RC_EMB_FUNC_CFG, 0x30);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC>ٶȡ<D9B6><C8A1><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL1, 0x10 | (quarternion_rate + 3));
|
||||||
|
imu660rc_write_register(IMU660RC_CTRL2, 0x10 | (quarternion_rate + 3));
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
|
||||||
|
imu660rc_write_register(IMU660RC_SFLP_ODR, 0x43 | (quarternion_rate << 3));
|
||||||
|
imu660rc_write_register(IMU660RC_EMB_FUNC_EN_A, 0x02);
|
||||||
|
imu660rc_write_register(IMU660RC_PAGE_RW, 0x00);
|
||||||
|
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
|
||||||
|
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
exti_init(ERU_CH0_REQ0_P15_4, EXTI_TRIGGER_RISING);
|
||||||
|
}
|
||||||
|
}while(0);
|
||||||
|
|
||||||
|
return return_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,211 @@
|
|||||||
|
/*********************************************************************************************************************
|
||||||
|
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD>⣩<EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
|
||||||
|
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᷢ<EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD>棨<EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><DEB8><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
|
||||||
|
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
|
||||||
|
*
|
||||||
|
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
|
||||||
|
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
|
||||||
|
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뱣<EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
|
||||||
|
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾
|
||||||
|
* <20>汾<EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
|
||||||
|
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
|
||||||
|
*
|
||||||
|
* <20>ļ<DEB8>¼
|
||||||
|
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
|
||||||
|
* 2025-12-12 SeekFree first version
|
||||||
|
********************************************************************************************************************/
|
||||||
|
/*********************************************************************************************************************
|
||||||
|
* <20><><EFBFBD>߶<EFBFBD><DFB6>壺
|
||||||
|
* ------------------------------------
|
||||||
|
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
|
||||||
|
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
|
||||||
|
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20>궨<EFBFBD><EAB6A8>
|
||||||
|
* VCC 3.3V<EFBFBD><EFBFBD>Դ
|
||||||
|
* GND <20><>Դ<EFBFBD><D4B4>
|
||||||
|
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* ------------------------------------
|
||||||
|
********************************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _zf_device_imu660rc_h_
|
||||||
|
#define _zf_device_imu660rc_h_
|
||||||
|
|
||||||
|
#include "zf_common_typedef.h"
|
||||||
|
|
||||||
|
|
||||||
|
// IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾʹ<CABE><CAB9>Ӳ<EFBFBD><D3B2>SPI<50><49><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ1<CEAA><31>ʾʹ<CABE><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IIC<49><43><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȱ<EFBFBD><C8B1>벢<EFBFBD><EBB2A2><EFBFBD>س<EFBFBD><D8B3><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҫ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
|
||||||
|
#define IMU660RC_USE_SOFT_IIC ( 1 ) // Ĭ<><C4AC>ʹ<EFBFBD><CAB9>Ӳ<EFBFBD><D3B2> SPI <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
#if IMU660RC_USE_SOFT_IIC // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7> <20><>ɫ<EFBFBD>ҵľ<D2B5><C4BE><EFBFBD>û<EFBFBD><C3BB><EFBFBD>õ<EFBFBD>
|
||||||
|
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#define IMU660RC_SOFT_IIC_DELAY ( 0 ) // <20><><EFBFBD><EFBFBD> IIC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> <20><>ֵԽС IIC ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
||||||
|
#define IMU660RC_SCL_PIN ( P20_11 ) // <20><><EFBFBD><EFBFBD> IIC SCL <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SCL <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SDA_PIN ( P20_14 ) // <20><><EFBFBD><EFBFBD> IIC SDA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SDA <20><><EFBFBD><EFBFBD>
|
||||||
|
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#else
|
||||||
|
|
||||||
|
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#define IMU660RC_SPI_SPEED (10 * 1000 * 1000) // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SPI (SPI_0) // Ӳ<><D3B2> SPI <20><>
|
||||||
|
#define IMU660RC_SPC_PIN (SPI0_SCLK_P20_11 ) // Ӳ<><D3B2> SPI SCK <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SDI_PIN (SPI0_MOSI_P20_14) // Ӳ<><D3B2> SPI MOSI <20><><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SDO_PIN (SPI0_MISO_P20_12) // Ӳ<><D3B2> SPI MISO <20><><EFBFBD><EFBFBD>
|
||||||
|
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
|
||||||
|
#endif
|
||||||
|
#define IMU660RC_CS_PIN ( P20_13 ) // CS Ƭѡ<C6AC><D1A1><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_CS(x) ( (x) ? (gpio_high(IMU660RC_CS_PIN)) : (gpio_low(IMU660RC_CS_PIN)) )
|
||||||
|
#define IMU660RC_INT2_PIN ( ERU_CH0_REQ0_P15_4 ) // <20>ж<EFBFBD><D0B6>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD><CAB1>Ҫʹ<D2AA><CAB9>
|
||||||
|
|
||||||
|
|
||||||
|
#define IMU660RC_QUARTERNION_GET_GYRO ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
|
||||||
|
#define IMU660RC_QUARTERNION_GET_ACC ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
|
||||||
|
#define IMU660RC_ACC_SAMPLE_DEFAULT ( IMU660RC_ACC_SAMPLE_SGN_8G ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>ٶȼ<D9B6> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_GYRO_SAMPLE_DEFAULT ( IMU660RC_GYRO_SAMPLE_SGN_2000DPS ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_MAIN_MEM_BANK = 0x00,
|
||||||
|
IMU660RC_HUB_MEM_BANK = 0x40,
|
||||||
|
IMU660RC_EMBED_MEM_BANK = 0x80,
|
||||||
|
}imu660rc_mem_bank_enum;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_2G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>2G (ACC = Accelerometer <20><><EFBFBD>ٶȼ<D9B6>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (G = g <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> g<><67>9.80 m/s^2)
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_4G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>4G
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_8G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>8G
|
||||||
|
IMU660RC_ACC_SAMPLE_SGN_16G, // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>16G
|
||||||
|
}imu660rc_acc_sample_config;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_125DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>125DPS (GYRO = Gyroscope <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (DPS = Degree Per Second <20><><EFBFBD>ٶȵ<D9B6>λ <20><>/S)
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_250DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>250DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_500DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>500DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_1000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>1000DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_2000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>2000DPS
|
||||||
|
IMU660RC_GYRO_SAMPLE_SGN_4000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>4000DPS
|
||||||
|
}imu660rc_gyro_sample_config;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
IMU660RC_QUARTERNION_15HZ, // 15 Hz
|
||||||
|
IMU660RC_QUARTERNION_30HZ, // 30 Hz
|
||||||
|
IMU660RC_QUARTERNION_60HZ, // 60 Hz
|
||||||
|
IMU660RC_QUARTERNION_120HZ, // 120Hz
|
||||||
|
IMU660RC_QUARTERNION_240HZ, // 240Hz
|
||||||
|
IMU660RC_QUARTERNION_480HZ, // 480Hz
|
||||||
|
IMU660RC_QUARTERNION_DISABLE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
}imu660rc_quarternion_rate_config;
|
||||||
|
|
||||||
|
|
||||||
|
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>ڲ<EFBFBD><DAB2><EFBFBD>ַ================================================
|
||||||
|
#define IMU660RC_DEV_ADDR ( 0x6B ) // SA0<41>ӵأ<D3B5>0x6A SA0<41><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x6B ģ<><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
#define IMU660RC_SPI_W ( 0x00 )
|
||||||
|
#define IMU660RC_SPI_R ( 0x80 )
|
||||||
|
#define IMU660RC_TIMEOUT_COUNT ( 0x00FF ) // IMU660RC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
|
|
||||||
|
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ================================================
|
||||||
|
#define IMU660RC_FUNC_CFG_ACCESS ( 0x01 )
|
||||||
|
#define IMU660RC_INT2_CTRL ( 0x0E )
|
||||||
|
#define IMU660RC_CHIP_ID ( 0x0F )
|
||||||
|
#define IMU660RC_CTRL1 ( 0x10 )
|
||||||
|
#define IMU660RC_CTRL2 ( 0x11 )
|
||||||
|
#define IMU660RC_CTRL3 ( 0x12 )
|
||||||
|
#define IMU660RC_CTRL4 ( 0x13 )
|
||||||
|
#define IMU660RC_CTRL5 ( 0x14 )
|
||||||
|
#define IMU660RC_CTRL6 ( 0x15 )
|
||||||
|
#define IMU660RC_CTRL7 ( 0x16 )
|
||||||
|
#define IMU660RC_CTRL8 ( 0x17 )
|
||||||
|
#define IMU660RC_CTRL9 ( 0x18 )
|
||||||
|
#define IMU660RC_CTRL10 ( 0x19 )
|
||||||
|
#define IMU660RC_CTRL_STATUS ( 0x1A )
|
||||||
|
#define IMU660RC_STATUS_REG ( 0x1E )
|
||||||
|
#define IMU660RC_OUT_TEMP_L ( 0x20 )
|
||||||
|
#define IMU660RC_OUT_TEMP_H ( 0x21 )
|
||||||
|
#define IMU660RC_OUTX_L_G ( 0x22 )
|
||||||
|
#define IMU660RC_OUTX_H_G ( 0x23 )
|
||||||
|
#define IMU660RC_OUTY_L_G ( 0x24 )
|
||||||
|
#define IMU660RC_OUTY_H_G ( 0x25 )
|
||||||
|
#define IMU660RC_OUTZ_L_G ( 0x26 )
|
||||||
|
#define IMU660RC_OUTZ_H_G ( 0x27 )
|
||||||
|
#define IMU660RC_OUTX_L_A ( 0x28 )
|
||||||
|
#define IMU660RC_OUTX_H_A ( 0x29 )
|
||||||
|
#define IMU660RC_OUTY_L_A ( 0x2A )
|
||||||
|
#define IMU660RC_OUTY_H_A ( 0x2B )
|
||||||
|
#define IMU660RC_OUTZ_L_A ( 0x2C )
|
||||||
|
#define IMU660RC_OUTZ_H_A ( 0x2D )
|
||||||
|
|
||||||
|
#define IMU660RC_PAGE_SEL ( 0x02 )
|
||||||
|
#define IMU660RC_EMB_FUNC_EN_A ( 0x04 )
|
||||||
|
#define IMU660RC_PAGE_RW ( 0x17 )
|
||||||
|
#define IMU660RC_SFLP_ODR ( 0x5E )
|
||||||
|
#define IMU660RC_EMB_FUNC_CFG ( 0x63 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern float imu660rc_transition_factor[2];
|
||||||
|
extern int16 imu660rc_gyro_x, imu660rc_gyro_y, imu660rc_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
extern int16 imu660rc_acc_x , imu660rc_acc_y , imu660rc_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
extern float imu660rc_roll , imu660rc_pitch , imu660rc_yaw; // ŷ<><C5B7><EFBFBD><EFBFBD>
|
||||||
|
extern float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
|
||||||
|
|
||||||
|
|
||||||
|
void imu660rc_get_acc (void);
|
||||||
|
void imu660rc_get_gyro (void);
|
||||||
|
void imu660rc_get_quarternion (void);
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> acc_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_acc_transition(imu660rc_acc_x); // <20><>λΪ g(m/s^2)
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
#define imu660rc_acc_transition(acc_value) ((float)(acc_value) / imu660rc_transition_factor[0])
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> gyro_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
||||||
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_gyro_transition(imu660rc_gyro_x); // <20><>λΪ <20><>/s
|
||||||
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
||||||
|
//-------------------------------------------------------------------------------------------------------------------
|
||||||
|
#define imu660rc_gyro_transition(gyro_value) ((float)(gyro_value) / imu660rc_transition_factor[1])
|
||||||
|
void imu660rc_callback (void);
|
||||||
|
uint8 imu660rc_init (imu660rc_quarternion_rate_config quarternion_rate);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -90,6 +90,7 @@ IFX_INTERRUPT(exti_ch0_ch4_isr, 0, EXTI_CH0_CH4_INT_PRIO)
|
|||||||
{
|
{
|
||||||
exti_flag_clear(ERU_CH0_REQ0_P15_4);
|
exti_flag_clear(ERU_CH0_REQ0_P15_4);
|
||||||
|
|
||||||
|
imu660rc_callback(); // 660RC ģ<><C4A3> INT <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||||
}
|
}
|
||||||
|
|
||||||
if(exti_flag_get(ERU_CH4_REQ13_P15_5)) // ͨ<><CDA8>4<EFBFBD>ж<EFBFBD>
|
if(exti_flag_get(ERU_CH4_REQ13_P15_5)) // ͨ<><CDA8>4<EFBFBD>ж<EFBFBD>
|
||||||
|
|||||||
Reference in New Issue
Block a user