TA的每日心情 | 奋斗 2024-11-12 19:35 |
---|
签到天数: 12 天 连续签到: 1 天 [LV.3]偶尔看看II
|
这次教程目的很简单 使用SPI解算ICM20602数据并且送到oled上显示首先看看ICM20602数据手册
还是那句话都2022年了 换个新一点的芯片吧,,,,
SPI时序图 我们编写驱动就是按照这个来的
对于陀螺仪我们一般都推荐采用SPI通信 因为速度足够快!!
先定义一组数据和20602的寄存器
如图 名字都有了
- int16 icm_gyro_x,icm_gyro_y,icm_gyro_z;
- int16 icm_acc_x,icm_acc_y,icm_acc_z;
复制代码
- extern int16 icm_gyro_x,icm_gyro_y,icm_gyro_z;
- extern int16 icm_acc_x,icm_acc_y,icm_acc_z;
复制代码
这里我们使用模拟iic
- void icm20602_self1_check(void)
- {
- uint8 dat=0;
- while(0x12 != dat) //读取ICM20602 ID
- {
- dat = simiic_read_reg(ICM20602_DEV_ADDR,ICM20602_WHO_AM_I,SIMIIC);
- systick_delay_ms(STM0, 10);
- //卡在这里原因有以下几点
- //1 ICM20602坏了,如果是新的这样的概率极低
- //2 接线错误或者没有接好
- //3 可能你需要外接上拉电阻,上拉到3.3V
- //4 可能没有调用模拟IIC的初始化函数
- }
- }
复制代码
首先是自检函数 用来检查是不是正常的
初始化函数
- void icm20602_init(void)
- {
- simiic_init();
- systick_delay_ms(STM0, 10); //上电延时
-
- //检测
- icm20602_self1_check();
-
- //复位
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_1,0x80); //复位设备
- systick_delay_ms(STM0, 2); //延时
- while(0x80 & simiic_read_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_1,SIMIIC));//等待复位完成
-
- //配置参数
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_1,0x01); //时钟设置
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_2,0x00); //开启陀螺仪和加速度计
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_CONFIG,0x01); //176HZ 1KHZ
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_SMPLRT_DIV,0x07); //采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV)
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_GYRO_CONFIG,0x18); //±2000 dps
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_ACCEL_CONFIG,0x10); //±8g
- simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_ACCEL_CONFIG_2,0x03); //Average 4 samples 44.8HZ //0x23 Average 16 samples
- }
复制代码 得到加速度计数据
- void get_icm20602_accdata(void)
- {
- uint8 dat[6];
-
- simiic_read_regs(ICM20602_DEV_ADDR, ICM20602_ACCEL_XOUT_H, dat, 6, SIMIIC);
- icm_acc_x = (int16)(((uint16)dat[0]<<8 | dat[1]));
- icm_acc_y = (int16)(((uint16)dat[2]<<8 | dat[3]));
- icm_acc_z = (int16)(((uint16)dat[4]<<8 | dat[5]));
- }
复制代码 得到陀螺仪数据
- void get_icm20602_gyro(void)
- {
- uint8 dat[6];
- simiic_read_regs(ICM20602_DEV_ADDR, ICM20602_GYRO_XOUT_H, dat, 6, SIMIIC);
- icm_gyro_x = (int16)(((uint16)dat[0]<<8 | dat[1]));
- icm_gyro_y = (int16)(((uint16)dat[2]<<8 | dat[3]));
- icm_gyro_z = (int16)(((uint16)dat[4]<<8 | dat[5]));
- }
复制代码 陀螺仪驱动就做完了在主函数里分别初始化器件
直接调用函数就可以查看对应变量
因为帖子太长被限制了 寄存器数据我日后补发
|
|