STM32 软件I2C方式读取AS5600磁编码器获取角度例程

STM32 软件I2C方式读取AS5600磁编码器获取角度例程


📘 硬件电路部分

  • 🌿原理图部分:
    在这里插入图片描述

  • 🌿PCB布线和电路
    在这里插入图片描述

  • 🌿磁场Bz和典型的间隙
    在这里插入图片描述

典型的间隙在0.5 mm到3 mm之间,这取决于所选的磁铁。一个更大和更强的磁铁允许一个更大的间隙。使用AGC值作为导轨,通过调整磁体与AS5600之间的距离,使AGC值在其范围的中心,可以找到最佳的间隙。当使用直径为6mm的磁铁时,参考磁铁的旋转轴从包装中心的最大允许位移为0.25 mm。

  • 🌿AS5600供电:支持5V由第一脚供电,如果使用3.3V供电,需要将第一脚和第二脚连接到一起。
    在这里插入图片描述

⛳注意事项:

  • ✨有些硬件I2C在配置开漏输出模式下(STM32F103),引脚不能同时开启内部上拉,有些硬件是支持在开启开漏输出模式下,引脚同时可以开启内部上拉电阻,这一点需要注意。
  • STM32G431:
    在这里插入图片描述
  • STM32F103
    在这里插入图片描述
  • ✨软件I2C方式没有I2C没有上拉电阻的情况下,需要将IO口配置为推挽输出模式才行,没有上拉情况下,开漏模式可能访问不到。

📙驱动代码部分

int main(void)
{

    u16 i = 0;
    u16 raw_num = 0;
    u16 JIAODUnum = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    delay_init(); //延时函数初始化
    uart_init(9600);	//串口初始化为9600
    LED_Init();	//初始化与LED连接的硬件接口
    IIC_Init();
    while(1) {


        delay_ms(10);
        if(++i > 100) {
            raw_num = AS5600_ReadTwoByte(_raw_ang_hi, _raw_ang_lo); //读取两个寄存器的值
            JIAODUnum = (raw_num * 360) / 4096; //对寄存器值进行处理得到角度值
            printf("AS5600 Angle:%d \r\n", JIAODUnum);
            LED0 = !LED0; //提示系统正在运行
            i = 0;
        }

    }
}
  • 🌿读取效果:
    在这里插入图片描述

📚测试代码

  • 🔖基于stm32f103标准库实现.
链接:https://pan.baidu.com/s/1jmWxyHLhXFY_c5sJyndkmg?pwd=hk0h 
提取码:hk0h
  • 🌿基于stm32f103,STM32CubeMX创建,模拟I2C,包含独立的驱动文件
链接:https://pan.baidu.com/s/1suhAVwKK6L82Hj2jgOJbxQ?pwd=5w41 
提取码:5w41

📒i2c地址扫描

  • 🌿基于HAL STM32F1硬件I2C扫描从设备地址:https://blog.csdn.net/weixin_42880082/article/details/131869827

  • 🌿基于Arduino rp2040 I2C扫描程序代码


#include <Wire.h>
 
 
void setup()
{
 // Wire.begin();
 
  Serial.begin(115200);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
    Wire.setSDA(8);
  Wire.setSCL(9);
  Wire.begin();
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);//从指定的地址开始向I2C从设备进行传输
    error = Wire.endTransmission();//停止与从机的数据传输
 /*
 * error返回结果:
 * 0: 成功
1: 数据量超过传送缓存容纳限制
2: 传送地址时收到 NACK
3: 传送数据时收到 NACK
4: 其它错误
 */
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值