更新IMU660RA硬件设置

This commit is contained in:
2023-12-14 21:18:55 +08:00
parent eaa7cc0eea
commit d2d40d225c
2 changed files with 247 additions and 249 deletions

View File

@@ -1,58 +1,58 @@
/********************************************************************************************************************* /*********************************************************************************************************************
* CH32V307VCT6 Opensourec Library 即CH32V307VCT6 开源库)是一个基于官方 SDK 接口的第三方开源库 * CH32V307VCT6 Opensourec Library 即CH32V307VCT6 开源库)是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技 * Copyright (c) 2022 SEEKFREE 逐飞科技
* *
* 本文件是CH32V307VCT6 开源库的一部分 * 本文件是 CH32V307VCT6 开源库的一部分
* *
* CH32V307VCT6 开源库 是免费软件 * CH32V307VCT6 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPLGNU General Public License即 GNU通用公共许可证的条款 * 您可以根据自由软件基金会发布的 GPLGNU General Public License即 GNU 通用公共许可证)的条款
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 * 即 GPL 的第 3 版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
* *
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证 * 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL * 更多细节请参见 GPL
* *
* 您应该在收到本开源库的同时收到一份 GPL 的副本 * 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有,请参阅<https://www.gnu.org/licenses/> * 如果没有,请参阅<https://www.gnu.org/licenses/>
* *
* 额外注明: * 额外注明:
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
* *
* 文件名称 zf_device_imu660ra * 文件名称 zf_device_imu660ra
* 公司名称 成都逐飞科技有限公司 * 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 MounRiver Studio V1.8.1 * 开发环境 MounRiver Studio V1.8.1
* 适用平台 CH32V307VCT6 * 适用平台 CH32V307VCT6
* 店铺链接 https://seekfree.taobao.com/ * 店铺链接 https://seekfree.taobao.com/
* *
* 修改记录 * 修改记录
* 日期 作者 备注 * 日期 作者 备注
* 2022-09-15 大W first version * 2022-09-15 大 W first version
********************************************************************************************************************/ ********************************************************************************************************************/
/********************************************************************************************************************* /*********************************************************************************************************************
* 接线定义: * 接线定义:
* ------------------------------------ * ------------------------------------
* 模块管脚 单片机管脚 * 模块管脚 单片机管脚
* // 硬件 SPI 引脚 * // 硬件 SPI 引脚
* SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SPC_PIN 宏定义 * SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SPC_PIN 宏定义
* SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDI_PIN 宏定义 * SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDI_PIN 宏定义
* SA0/SDO 查看 zf_device_imu660ra.h 中 IMU660RA_SDO_PIN 宏定义 * SA0/SDO 查看 zf_device_imu660ra.h 中 IMU660RA_SDO_PIN 宏定义
* CS 查看 zf_device_imu660ra.h 中 IMU660RA_CS_PIN 宏定义 * CS 查看 zf_device_imu660ra.h 中 IMU660RA_CS_PIN 宏定义
* VCC 3.3V电源 * VCC 3.3V 电源
* GND 电源地 * GND 电源地
* 其余引脚悬空 * 其余引脚悬空
* *
* // 软件 IIC 引脚 * // 软件 IIC 引脚
* SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SCL_PIN 宏定义 * SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SCL_PIN 宏定义
* SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDA_PIN 宏定义 * SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDA_PIN 宏定义
* VCC 3.3V电源 * VCC 3.3V 电源
* GND 电源地 * GND 电源地
* 其余引脚悬空 * 其余引脚悬空
* ------------------------------------ * ------------------------------------
********************************************************************************************************************/ ********************************************************************************************************************/
#include "zf_common_debug.h" #include "zf_common_debug.h"
#include "zf_driver_delay.h" #include "zf_driver_delay.h"
@@ -63,9 +63,14 @@
#include "zf_device_imu660ra.h" #include "zf_device_imu660ra.h"
int16 imu660ra_gyro_x = 0, imu660ra_gyro_y = 0, imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪) int16 imu660ra_gyro_x = 0;
int16 imu660ra_acc_x = 0, imu660ra_acc_y = 0, imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计) int16 imu660ra_gyro_y = 0;
float imu660ra_transition_factor[2] = {4096, 16.4}; int16 imu660ra_gyro_z = 0; // 三轴陀螺仪数据 gyro (陀螺仪)
int16 imu660ra_acc_x = 0;
int16 imu660ra_acc_y = 0;
int16 imu660ra_acc_z = 0; // 三轴加速度计数据 acc (accelerometer 加速度计)
float imu660ra_temperature = 0;
float imu660ra_transition_factor[2] = {4096, 16.4f};
#if IMU660RA_USE_SOFT_IIC #if IMU660RA_USE_SOFT_IIC
static soft_iic_info_struct imu660ra_iic_struct; static soft_iic_info_struct imu660ra_iic_struct;
@@ -136,9 +141,8 @@ static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len)
IMU660RA_CS(0); IMU660RA_CS(0);
spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1); spi_read_8bit_registers(IMU660RA_SPI, reg | IMU660RA_SPI_R, temp_data, len + 1);
IMU660RA_CS(1); IMU660RA_CS(1);
for(int i = 0; i < len; i ++) for (int i = 0; i < len; i++) {
{ *(data++) = temp_data[i + 1];
*(data ++) = temp_data[i + 1];
} }
} }
#endif #endif
@@ -150,20 +154,19 @@ static void imu660ra_read_registers(uint8 reg, uint8 *data, uint32 len)
// 使用示例 imu660ra_self_check(); // 使用示例 imu660ra_self_check();
// 备注信息 内部调用 // 备注信息 内部调用
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
static uint8 imu660ra_self_check (void) static uint8 imu660ra_self_check(void)
{ {
uint8 dat = 0, return_state = 0; uint8 dat = 0;
uint8 return_state = 0;
uint16 timeout_count = 0; uint16 timeout_count = 0;
do do {
{ if (timeout_count++ > IMU660RA_TIMEOUT_COUNT) {
if(timeout_count ++ > IMU660RA_TIMEOUT_COUNT)
{
return_state = 1; return_state = 1;
break; break;
} }
dat = imu660ra_read_register(IMU660RA_CHIP_ID); dat = imu660ra_read_register(IMU660RA_CHIP_ID);
system_delay_ms(1); system_delay_ms(1);
}while(0x24 != dat); // 读取设备ID是否等于0X24如果不是0X24则认为没检测到设备 } while (0x24 != dat); // 读取设备 ID 是否等于 0X24如果不是 0X24 则认为没检测到设备
return return_state; return return_state;
} }
@@ -172,34 +175,42 @@ static uint8 imu660ra_self_check (void)
// 参数说明 void // 参数说明 void
// 返回参数 void // 返回参数 void
// 使用示例 imu660ra_get_acc(); // 执行该函数后,直接查看对应的变量即可 // 使用示例 imu660ra_get_acc(); // 执行该函数后,直接查看对应的变量即可
// 备注信息 使用 SPI 的采集时间为69us // 备注信息 使用 SPI 的采集时间为 69us
// 使用 IIC 的采集时间为126us 采集加速度计的时间与采集陀螺仪的时间一致的原因是都只是读取寄存器数据 // 使用 IIC 的采集时间为 126us 采集加速度计的时间与采集陀螺仪的时间一致的原因是都只是读取寄存器数据
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
void imu660ra_get_acc (void) void imu660ra_get_acc(void)
{ {
uint8 dat[6]; uint8 dat[6];
imu660ra_read_registers(IMU660RA_ACC_ADDRESS, dat, 6); imu660ra_read_registers(IMU660RA_ACC_ADDRESS, dat, 6);
imu660ra_acc_x = (int16)(((uint16)dat[1]<<8 | dat[0])); imu660ra_acc_x = (int16)(((uint16)dat[1] << 8 | dat[0]));
imu660ra_acc_y = (int16)(((uint16)dat[3]<<8 | dat[2])); imu660ra_acc_y = (int16)(((uint16)dat[3] << 8 | dat[2]));
imu660ra_acc_z = (int16)(((uint16)dat[5]<<8 | dat[4])); imu660ra_acc_z = (int16)(((uint16)dat[5] << 8 | dat[4]));
} }
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
// 函数简介 获取 IMU660RA 陀螺仪数据 // 函数简介 获取 IMU660RA 陀螺仪数据
// 参数说明 void // 参数说明 void
// 返回参数 void // 返回参数 void
// 使用示例 imu660ra_get_gyro(); // 执行该函数后,直接查看对应的变量即可 // 使用示例 imu660ra_get_gyro(); // 执行该函数后,直接查看对应的变量即可
// 备注信息 使用 SPI 的采集时间为69us // 备注信息 使用 SPI 的采集时间为 69us
// 使用 IIC 的采集时间为126us // 使用 IIC 的采集时间为 126us
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
void imu660ra_get_gyro (void) void imu660ra_get_gyro(void)
{ {
uint8 dat[6]; uint8 dat[6];
imu660ra_read_registers(IMU660RA_GYRO_ADDRESS, dat, 6); imu660ra_read_registers(IMU660RA_GYRO_ADDRESS, dat, 6);
imu660ra_gyro_x = (int16)(((uint16)dat[1]<<8 | dat[0])); imu660ra_gyro_x = (int16)(((uint16)dat[1] << 8 | dat[0]));
imu660ra_gyro_y = (int16)(((uint16)dat[3]<<8 | dat[2])); imu660ra_gyro_y = (int16)(((uint16)dat[3] << 8 | dat[2]));
imu660ra_gyro_z = (int16)(((uint16)dat[5]<<8 | dat[4])); imu660ra_gyro_z = (int16)(((uint16)dat[5] << 8 | dat[4]));
}
void imu660ra_get_temperature(void)
{
uint8_t dat[2];
imu660ra_read_registers(IMU660RA_TEMP_ADDRESS, dat, 2);
imu660ra_temperature = (int16_t)((uint16_t)dat[1] << 8 | dat[0]);
imu660ra_temperature = imu660ra_temperature / 512.0f + 23.0f;
} }
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
@@ -209,7 +220,7 @@ void imu660ra_get_gyro (void)
// 使用示例 imu660ra_init(); // 使用示例 imu660ra_init();
// 备注信息 // 备注信息
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
uint8 imu660ra_init (void) uint8 imu660ra_init(void)
{ {
uint8 return_state = 0; uint8 return_state = 0;
system_delay_ms(20); // 等待设备上电成功 system_delay_ms(20); // 等待设备上电成功
@@ -218,11 +229,11 @@ uint8 imu660ra_init (void)
soft_iic_init(&imu660ra_iic_struct, IMU660RA_DEV_ADDR, IMU660RA_SOFT_IIC_DELAY, IMU660RA_SCL_PIN, IMU660RA_SDA_PIN); // 配置 IMU660RA 的 IIC 端口 soft_iic_init(&imu660ra_iic_struct, IMU660RA_DEV_ADDR, IMU660RA_SOFT_IIC_DELAY, IMU660RA_SCL_PIN, IMU660RA_SDA_PIN); // 配置 IMU660RA 的 IIC 端口
#else #else
spi_init(IMU660RA_SPI, SPI_MODE0, IMU660RA_SPI_SPEED, IMU660RA_SPC_PIN, IMU660RA_SDI_PIN, IMU660RA_SDO_PIN, SPI_CS_NULL); // 配置 IMU660RA 的 SPI 端口 spi_init(IMU660RA_SPI, SPI_MODE0, IMU660RA_SPI_SPEED, IMU660RA_SPC_PIN, IMU660RA_SDI_PIN, IMU660RA_SDO_PIN, SPI_CS_NULL); // 配置 IMU660RA 的 SPI 端口
gpio_init(IMU660RA_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 IMU660RA 的CS端口 gpio_init(IMU660RA_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 配置 IMU660RA 的 CS 端口
imu660ra_read_register(IMU660RA_CHIP_ID); // 读取一下设备ID 将设备设置为SPI模式 imu660ra_read_register(IMU660RA_CHIP_ID); // 读取一下设备 ID 将设备设置为 SPI 模式
#endif #endif
do{ do {
if(imu660ra_self_check()) // IMU660RA 自检 if (imu660ra_self_check()) // IMU660RA 自检
{ {
// 如果程序在输出了断言信息 并且提示出错位置在这里 // 如果程序在输出了断言信息 并且提示出错位置在这里
// 那么就是 IMU660RA 自检出错并超时退出了 // 那么就是 IMU660RA 自检出错并超时退出了
@@ -237,7 +248,7 @@ uint8 imu660ra_init (void)
imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件 imu660ra_write_registers(IMU660RA_INIT_DATA, imu660ra_config_file, sizeof(imu660ra_config_file)); // 输出配置文件
imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束 imu660ra_write_register(IMU660RA_INIT_CTRL, 0x01); // 初始化配置结束
system_delay_ms(20); system_delay_ms(20);
if(1 != imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成 if (1 != imu660ra_read_register(IMU660RA_INT_STA)) // 检查是否配置完成
{ {
// 如果程序在输出了断言信息 并且提示出错位置在这里 // 如果程序在输出了断言信息 并且提示出错位置在这里
// 那么就是 IMU660RA 配置初始化文件出错了 // 那么就是 IMU660RA 配置初始化文件出错了
@@ -255,36 +266,29 @@ uint8 imu660ra_init (void)
// 设置为 0x01 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2) // 设置为 0x01 加速度计量程为 ±4 g 获取到的加速度计数据除以 8192 可以转化为带物理单位的数据 单位 g(m/s^2)
// 设置为 0x02 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2) // 设置为 0x02 加速度计量程为 ±8 g 获取到的加速度计数据除以 4096 可以转化为带物理单位的数据 单位 g(m/s^2)
// 设置为 0x03 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2) // 设置为 0x03 加速度计量程为 ±16 g 获取到的加速度计数据除以 2048 可以转化为带物理单位的数据 单位 g(m/s^2)
switch(IMU660RA_ACC_SAMPLE_DEFAULT) switch (IMU660RA_ACC_SAMPLE_DEFAULT) {
{ default: {
default:
{
zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error."); zf_log(0, "IMU660RA_ACC_SAMPLE_DEFAULT set error.");
return_state = 1; return_state = 1;
}break; } break;
case IMU660RA_ACC_SAMPLE_SGN_2G: case IMU660RA_ACC_SAMPLE_SGN_2G: {
{
imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00); imu660ra_write_register(IMU660RA_ACC_RANGE, 0x00);
imu660ra_transition_factor[0] = 16384; imu660ra_transition_factor[0] = 16384;
}break; } break;
case IMU660RA_ACC_SAMPLE_SGN_4G: case IMU660RA_ACC_SAMPLE_SGN_4G: {
{
imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01); imu660ra_write_register(IMU660RA_ACC_RANGE, 0x01);
imu660ra_transition_factor[0] = 8192; imu660ra_transition_factor[0] = 8192;
}break; } break;
case IMU660RA_ACC_SAMPLE_SGN_8G: case IMU660RA_ACC_SAMPLE_SGN_8G: {
{
imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02); imu660ra_write_register(IMU660RA_ACC_RANGE, 0x02);
imu660ra_transition_factor[0] = 4096; imu660ra_transition_factor[0] = 4096;
}break; } break;
case IMU660RA_ACC_SAMPLE_SGN_16G: case IMU660RA_ACC_SAMPLE_SGN_16G: {
{
imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03); imu660ra_write_register(IMU660RA_ACC_RANGE, 0x03);
imu660ra_transition_factor[0] = 2048; imu660ra_transition_factor[0] = 2048;
}break; } break;
} }
if(1 == return_state) if (1 == return_state) {
{
break; break;
} }
@@ -294,45 +298,35 @@ uint8 imu660ra_init (void)
// 设置为 0x02 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.6 可以转化为带物理单位的数据 单位为 °/s // 设置为 0x02 陀螺仪量程为 ±500 dps 获取到的陀螺仪数据除以 65.6 可以转化为带物理单位的数据 单位为 °/s
// 设置为 0x01 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s // 设置为 0x01 陀螺仪量程为 ±1000 dps 获取到的陀螺仪数据除以 32.8 可以转化为带物理单位的数据 单位为 °/s
// 设置为 0x00 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s // 设置为 0x00 陀螺仪量程为 ±2000 dps 获取到的陀螺仪数据除以 16.4 可以转化为带物理单位的数据 单位为 °/s
switch(IMU660RA_GYRO_SAMPLE_DEFAULT) switch (IMU660RA_GYRO_SAMPLE_DEFAULT) {
{ default: {
default:
{
zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error."); zf_log(0, "IMU660RA_GYRO_SAMPLE_DEFAULT set error.");
return_state = 1; return_state = 1;
}break; } break;
case IMU660RA_GYRO_SAMPLE_SGN_125DPS: case IMU660RA_GYRO_SAMPLE_SGN_125DPS: {
{
imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04); imu660ra_write_register(IMU660RA_GYR_RANGE, 0x04);
imu660ra_transition_factor[1] = 262.4; imu660ra_transition_factor[1] = 262.4;
}break; } break;
case IMU660RA_GYRO_SAMPLE_SGN_250DPS: case IMU660RA_GYRO_SAMPLE_SGN_250DPS: {
{
imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03); imu660ra_write_register(IMU660RA_GYR_RANGE, 0x03);
imu660ra_transition_factor[1] = 131.2; imu660ra_transition_factor[1] = 131.2;
}break; } break;
case IMU660RA_GYRO_SAMPLE_SGN_500DPS: case IMU660RA_GYRO_SAMPLE_SGN_500DPS: {
{
imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02); imu660ra_write_register(IMU660RA_GYR_RANGE, 0x02);
imu660ra_transition_factor[1] = 65.6; imu660ra_transition_factor[1] = 65.6;
}break; } break;
case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: case IMU660RA_GYRO_SAMPLE_SGN_1000DPS: {
{
imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01); imu660ra_write_register(IMU660RA_GYR_RANGE, 0x01);
imu660ra_transition_factor[1] = 32.8; imu660ra_transition_factor[1] = 32.8;
}break; } break;
case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: case IMU660RA_GYRO_SAMPLE_SGN_2000DPS: {
{
imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00); imu660ra_write_register(IMU660RA_GYR_RANGE, 0x00);
imu660ra_transition_factor[1] = 16.4; imu660ra_transition_factor[1] = 16.4;
}break; } break;
} }
if(1 == return_state) if (1 == return_state) {
{
break; break;
} }
}while(0); } while (0);
return return_state; return return_state;
} }

View File

@@ -1,74 +1,74 @@
/********************************************************************************************************************* /*********************************************************************************************************************
* CH32V307VCT6 Opensourec Library 即CH32V307VCT6 开源库)是一个基于官方 SDK 接口的第三方开源库 * CH32V307VCT6 Opensourec Library 即CH32V307VCT6 开源库)是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技 * Copyright (c) 2022 SEEKFREE 逐飞科技
* *
* 本文件是CH32V307VCT6 开源库的一部分 * 本文件是CH32V307VCT6 开源库的一部分
* *
* CH32V307VCT6 开源库 是免费软件 * CH32V307VCT6 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPLGNU General Public License即 GNU通用公共许可证的条款 * 您可以根据自由软件基金会发布的 GPLGNU General Public License即 GNU通用公共许可证的条款
* 即 GPL 的第3版即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它 * 即 GPL 的第3版即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
* *
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证 * 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证 * 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL * 更多细节请参见 GPL
* *
* 您应该在收到本开源库的同时收到一份 GPL 的副本 * 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有,请参阅<https://www.gnu.org/licenses/> * 如果没有,请参阅<https://www.gnu.org/licenses/>
* *
* 额外注明: * 额外注明:
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本 * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件 * 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明) * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
* *
* 文件名称 zf_device_imu660ra * 文件名称 zf_device_imu660ra
* 公司名称 成都逐飞科技有限公司 * 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明 * 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 MounRiver Studio V1.8.1 * 开发环境 MounRiver Studio V1.8.1
* 适用平台 CH32V307VCT6 * 适用平台 CH32V307VCT6
* 店铺链接 https://seekfree.taobao.com/ * 店铺链接 https://seekfree.taobao.com/
* *
* 修改记录 * 修改记录
* 日期 作者 备注 * 日期 作者 备注
* 2022-09-15 大W first version * 2022-09-15 大W first version
********************************************************************************************************************/ ********************************************************************************************************************/
/********************************************************************************************************************* /*********************************************************************************************************************
* 接线定义: * 接线定义:
* ------------------------------------ * ------------------------------------
* 模块管脚 单片机管脚 * 模块管脚 单片机管脚
* // 硬件 SPI 引脚 * // 硬件 SPI 引脚
* SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SPC_PIN 宏定义 * SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SPC_PIN 宏定义
* SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDI_PIN 宏定义 * SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDI_PIN 宏定义
* SA0/SDO 查看 zf_device_imu660ra.h 中 IMU660RA_SDO_PIN 宏定义 * SA0/SDO 查看 zf_device_imu660ra.h 中 IMU660RA_SDO_PIN 宏定义
* CS 查看 zf_device_imu660ra.h 中 IMU660RA_CS_PIN 宏定义 * CS 查看 zf_device_imu660ra.h 中 IMU660RA_CS_PIN 宏定义
* VCC 3.3V电源 * VCC 3.3V电源
* GND 电源地 * GND 电源地
* 其余引脚悬空 * 其余引脚悬空
* *
* // 软件 IIC 引脚 * // 软件 IIC 引脚
* SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SCL_PIN 宏定义 * SCL/SPC 查看 zf_device_imu660ra.h 中 IMU660RA_SCL_PIN 宏定义
* SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDA_PIN 宏定义 * SDA/DSI 查看 zf_device_imu660ra.h 中 IMU660RA_SDA_PIN 宏定义
* VCC 3.3V电源 * VCC 3.3V电源
* GND 电源地 * GND 电源地
* 其余引脚悬空 * 其余引脚悬空
* ------------------------------------ * ------------------------------------
********************************************************************************************************************/ ********************************************************************************************************************/
#ifndef _zf_device_imu660ra_h_ #ifndef _zf_device_imu660ra_h_
#define _zf_device_imu660ra_h_ #define _zf_device_imu660ra_h_
#include "zf_common_typedef.h" #include "zf_common_typedef.h"
#define IMU660RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 #define IMU660RA_USE_SOFT_IIC (1) // 默认使用硬件 SPI 方式驱动
#if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 #if IMU660RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的
//====================================================软件 IIC 驱动==================================================== //====================================================软件 IIC 驱动====================================================
#define IMU660RA_SOFT_IIC_DELAY (10 ) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 #define IMU660RA_SOFT_IIC_DELAY (10) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快
#define IMU660RA_SCL_PIN (B13) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚 #define IMU660RA_SCL_PIN (B3) // 软件 IIC SCL 引脚 连接 IMU660RA 的 SCL 引脚
#define IMU660RA_SDA_PIN (B15) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚 #define IMU660RA_SDA_PIN (B5) // 软件 IIC SDA 引脚 连接 IMU660RA 的 SDA 引脚
//====================================================软件 IIC 驱动==================================================== //====================================================软件 IIC 驱动====================================================
#else #else
//====================================================硬件 SPI 驱动==================================================== //====================================================硬件 SPI 驱动====================================================
#define IMU660RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 #define IMU660RA_SPI_SPEED (10 * 1000 * 1000) // 硬件 SPI 速率
#define IMU660RA_SPI SPI_3 // 硬件 SPI 号 #define IMU660RA_SPI SPI_3 // 硬件 SPI 号
#define IMU660RA_SPC_PIN SPI3_MAP0_SCK_B3 // 硬件 SPI SCK 引脚 #define IMU660RA_SPC_PIN SPI3_MAP0_SCK_B3 // 硬件 SPI SCK 引脚
#define IMU660RA_SDI_PIN SPI3_MAP0_MOSI_B5 // 硬件 SPI MOSI 引脚 #define IMU660RA_SDI_PIN SPI3_MAP0_MOSI_B5 // 硬件 SPI MOSI 引脚
@@ -79,53 +79,58 @@
#define IMU660RA_CS_PIN (C10) // CS 片选引脚 #define IMU660RA_CS_PIN (C10) // CS 片选引脚
#define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN))) #define IMU660RA_CS(x) ((x) ? (gpio_high(IMU660RA_CS_PIN)) : (gpio_low(IMU660RA_CS_PIN)))
typedef enum typedef enum {
{ IMU660RA_ACC_SAMPLE_SGN_2G, // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2)
IMU660RA_ACC_SAMPLE_SGN_2G , // 加速度计量程 ±2G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) IMU660RA_ACC_SAMPLE_SGN_4G, // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2)
IMU660RA_ACC_SAMPLE_SGN_4G , // 加速度计量程 ±4G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) IMU660RA_ACC_SAMPLE_SGN_8G, // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2)
IMU660RA_ACC_SAMPLE_SGN_8G , // 加速度计量程 ±8G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2)
IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2) IMU660RA_ACC_SAMPLE_SGN_16G, // 加速度计量程 ±16G (ACC = Accelerometer 加速度计) (SGN = signum 带符号数 表示正负范围) (G = g 重力加速度 g≈9.80 m/s^2)
}imu660ra_acc_sample_config; } imu660ra_acc_sample_config;
typedef enum typedef enum {
{ IMU660RA_GYRO_SAMPLE_SGN_125DPS, // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S)
IMU660RA_GYRO_SAMPLE_SGN_125DPS , // 陀螺仪量程 ±125DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) IMU660RA_GYRO_SAMPLE_SGN_250DPS, // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S)
IMU660RA_GYRO_SAMPLE_SGN_250DPS , // 陀螺仪量程 ±250DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) IMU660RA_GYRO_SAMPLE_SGN_500DPS, // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S)
IMU660RA_GYRO_SAMPLE_SGN_500DPS , // 陀螺仪量程 ±500DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S)
IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) IMU660RA_GYRO_SAMPLE_SGN_1000DPS, // 陀螺仪量程 ±1000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S)
IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S) IMU660RA_GYRO_SAMPLE_SGN_2000DPS, // 陀螺仪量程 ±2000DPS (GYRO = Gyroscope 陀螺仪) (SGN = signum 带符号数 表示正负范围) (DPS = Degree Per Second 角速度单位 °/S)
}imu660ra_gyro_sample_config; } imu660ra_gyro_sample_config;
#define IMU660RA_ACC_SAMPLE_DEFAULT ( IMU660RA_ACC_SAMPLE_SGN_8G ) // 在这设置默认的 加速度计 初始化量程 #define IMU660RA_ACC_SAMPLE_DEFAULT (IMU660RA_ACC_SAMPLE_SGN_8G) // 在这设置默认的 加速度计 初始化量程
#define IMU660RA_GYRO_SAMPLE_DEFAULT ( IMU660RA_GYRO_SAMPLE_SGN_2000DPS ) // 在这设置默认的 陀螺仪 初始化量程 #define IMU660RA_GYRO_SAMPLE_DEFAULT (IMU660RA_GYRO_SAMPLE_SGN_2000DPS) // 在这设置默认的 陀螺仪 初始化量程
#define IMU660RA_TIMEOUT_COUNT ( 0x00FF ) // IMU660RA 超时计数 #define IMU660RA_TIMEOUT_COUNT (0x00FF) // IMU660RA 超时计数
//================================================定义 IMU660RA 内部地址================================================ //================================================定义 IMU660RA 内部地址================================================
#define IMU660RA_DEV_ADDR ( 0x69 ) // SA0接地0x68 SA0上拉0x69 模块默认上拉 #define IMU660RA_DEV_ADDR (0x69) // SA0 接地0x68 SA0 上拉0x69 模块默认上拉
#define IMU660RA_SPI_W ( 0x00 ) #define IMU660RA_SPI_W (0x00)
#define IMU660RA_SPI_R ( 0x80 ) #define IMU660RA_SPI_R (0x80)
#define IMU660RA_CHIP_ID ( 0x00 ) #define IMU660RA_CHIP_ID (0x00)
#define IMU660RA_PWR_CONF ( 0x7C ) #define IMU660RA_PWR_CONF (0x7C)
#define IMU660RA_PWR_CTRL ( 0x7D ) #define IMU660RA_PWR_CTRL (0x7D)
#define IMU660RA_INIT_CTRL ( 0x59 ) #define IMU660RA_INIT_CTRL (0x59)
#define IMU660RA_INIT_DATA ( 0x5E ) #define IMU660RA_INIT_DATA (0x5E)
#define IMU660RA_INT_STA ( 0x21 ) #define IMU660RA_INT_STA (0x21)
#define IMU660RA_ACC_ADDRESS ( 0x0C ) #define IMU660RA_TEMP_ADDRESS (0x22)
#define IMU660RA_GYRO_ADDRESS ( 0x12 ) #define IMU660RA_ACC_ADDRESS (0x0C)
#define IMU660RA_ACC_CONF ( 0x40 ) #define IMU660RA_GYRO_ADDRESS (0x12)
#define IMU660RA_ACC_RANGE ( 0x41 ) #define IMU660RA_ACC_CONF (0x40)
#define IMU660RA_GYR_CONF ( 0x42 ) #define IMU660RA_ACC_RANGE (0x41)
#define IMU660RA_GYR_RANGE ( 0x43 ) #define IMU660RA_GYR_CONF (0x42)
#define IMU660RA_GYR_RANGE (0x43)
//================================================定义 IMU660RA 内部地址================================================ //================================================定义 IMU660RA 内部地址================================================
extern int16 imu660ra_gyro_x, imu660ra_gyro_y, imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪) extern int16 imu660ra_gyro_x;
extern int16 imu660ra_acc_x, imu660ra_acc_y, imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计) extern int16 imu660ra_gyro_y;
extern int16 imu660ra_gyro_z; // 三轴陀螺仪数据 gyro (陀螺仪)
extern int16 imu660ra_acc_x;
extern int16 imu660ra_acc_y;
extern int16 imu660ra_acc_z; // 三轴加速度计数据 acc (accelerometer 加速度计)
extern float imu660ra_temperature;
extern float imu660ra_transition_factor[2]; extern float imu660ra_transition_factor[2];
void imu660ra_get_acc (void); // 获取 IMU660RA 加速度计数据 void imu660ra_get_acc(void); // 获取 IMU660RA 加速度计数据
void imu660ra_get_gyro (void); // 获取 IMU660RA 陀螺仪数据 void imu660ra_get_gyro(void); // 获取 IMU660RA 陀螺仪数据
void imu660ra_get_temperature(void);
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
// 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据 // 函数简介 将 IMU660RA 加速度计数据转换为实际物理数据
@@ -145,7 +150,6 @@ void imu660ra_get_gyro (void);
//------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------
#define imu660ra_gyro_transition(gyro_value) ((float)(gyro_value) / imu660ra_transition_factor[1]) #define imu660ra_gyro_transition(gyro_value) ((float)(gyro_value) / imu660ra_transition_factor[1])
uint8 imu660ra_init (void); // 初始化 IMU660RA uint8 imu660ra_init(void); // 初始化 IMU660RA
#endif #endif