SimpleFOC(三)—— AS5600角度读取

SimpleFOC的教程比较多,做了一个总的链接,欢迎点击阅读:SimpleFOC教程链接汇总

一、硬件介绍

1、磁编码器说明

  ◆AS5600与两极磁铁配对,可以输出12位分辨率的磁性旋转位置,支持IIC通信,还可以输出模拟电压和PWM信号。官方例程中主要演示了模拟电压和IIC通信两种角度获取方式。
在这里插入图片描述
   电机购买链接:淘宝购买

  ◆模拟电压模式,Aout引脚输出0—5V对应0°—360°,
在这里插入图片描述
  ◆I2C模式,读取0x0C/0x0D两个寄存器,获取12bits的角度值,0—4096对应0°—360°,
在这里插入图片描述

2、硬件连接

  ◆simpleFOC背面跳线如果用模拟信号,需按下图短接,保证A1的信号可以被单片机采样到;如果是I2C接口可以不用管。
在这里插入图片描述

   V2.0.3驱动板购买链接:淘宝购买
  

二、程序演示

1、模拟电压获取角度

  ⑴、编码器接GND/VCC/Aout对应simpleFOC的GND/5V/A1
在这里插入图片描述
  ⑵、电机编码器与simpleFOC的连接,本节实验并不驱动电机,可以不接电机相线和电源线。
在这里插入图片描述

  ⑶、打开例程,
在这里插入图片描述
  ⑷、查看 工具—>端口 确认连接端口正确,然后 上传,
在这里插入图片描述

  ⑸、打开 串口监视器,
在这里插入图片描述
  ⑹、串口源源不断的上传当前角度和瞬时转动速度,即使电机不动速度也会波动,说明有误差。
在这里插入图片描述
  ⑺、用手转动电机,角度和速度随之变化。角度和速度为弧度值,正转一圈角度增加6.28,反转一圈角度减小6.28。
  

2、I2C通信获取角度

  ⑴、编码器接GND/VCC/SCL/SDA对应simpleFOC的GND/5V/SCL/SDA,
在这里插入图片描述
  ⑵、电机编码器与simpleFOC的连接,本节实验并不驱动电机,可以不接电机相线和电源线,
在这里插入图片描述

  ⑶、打开例程,
在这里插入图片描述
  ⑷、查看 工具—>端口 确认连接端口正确,然后 上传,
在这里插入图片描述
  ⑸、打开 串口监视器,
在这里插入图片描述
  ⑹、串口源源不断的上传当前角度和瞬时转动速度,
在这里插入图片描述
  ⑺、用手转动电机,角度和速度随之变化。角度和速度为弧度值,正转一圈角度增加6.28,反转一圈角度减小6.28。
  

三、程序拓展

  ◆SimpleFOC的例程采用弧度制并且用角度累加方式显示角度,与我们平时的习惯不符,非常不直观,本人写了一个可以直接读出角度并显示的程序,加深对磁编码器的理解:

#include "Wire.h"

int _raw_ang_hi = 0x0c;
int _raw_ang_lo = 0x0d;
int _ams5600_Address = 0x36;
int ledtime = 0;

void setup() {
  pinMode(13,OUTPUT);
  Serial.begin(115200);
  Wire.begin();

  Serial.println("AS5600 Ready!");
  delay(1000);
}

void loop() {
  Serial.println(getRawAngle()*0.08789);
  LedBlink();
  delay(10);
}

void LedBlink()
{
  ledtime++;
  if(ledtime<=50){       //间隔500ms闪烁
    digitalWrite(13,HIGH);
    }
  else {
    digitalWrite(13,LOW);
    if(ledtime>=100)ledtime=0;
    }
}

word getRawAngle()
{
  return readTwoBytes(_raw_ang_hi, _raw_ang_lo);
}
 
word readTwoBytes(int in_adr_hi, int in_adr_lo)
{
  word retVal = -1;
 
  /* Read Low Byte */
  Wire.beginTransmission(_ams5600_Address);
  Wire.write(in_adr_lo);
  Wire.endTransmission();
  Wire.requestFrom(_ams5600_Address, 1);
  while(Wire.available() == 0);
  int low = Wire.read();
 
  /* Read High Byte */  
  Wire.beginTransmission(_ams5600_Address);
  Wire.write(in_adr_hi);
  Wire.endTransmission();
  Wire.requestFrom(_ams5600_Address, 1);
  while(Wire.available() == 0);
  int high = Wire.read();
  
  retVal = (high << 8) | low;
  
  return retVal;
}

  ◆程序采用I2C接口与AS5600连接,读取原始角度,转换为0°—360°后显示,简单直观。
  ◆新建一个Arduino工程,将以上代码复制到工程中,验证无误后上传,
在这里插入图片描述
  ◆打开串口监视器,转动电机,可以看到角度在0°—360°之间变化。
在这里插入图片描述


(完)

欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:优快云)

请继续阅读相关文章:
SimpleFOC(一)—— 简介(附有文件下载链接)
SimpleFOC(二)—— 快速入门 (开环控制)
SimpleFOC(四)—— 闭环控制
SimpleFOC(五)—— 双电机控制
SimpleFOC(六)—— PowerShield和AS5047P
SimpleFOC(七)——STM32(Bluepill)的应用
SimpleFOC(八)—— 理论+实践 深度分析SVPWM
SimpleFOC(九)—— 霍尔电机控制

### 关于STM32上使用AS5600磁性编码器 #### 初始化和定义对象 为了初始化并创建`AS5600`磁编码器的对象,在程序启动部分应当包含如下语句来指定设备地址: ```cpp #include "as5600.h" // 创建AS5600实例,假设使用的I2C地址为 I2C_ADDR_0 AS5600Encoder encoder = AS5600Encoder(I2C_ADDR_0); ``` 这段代码展示了如何声明一个名为`encoder`的变量作为`AS5600Encoder`类的一个实例,并指定了其通信所用到的具体硬件接口地址[^1]。 #### 配置I2C接口与DMA传输 对于采用STM32 HAL库实现高效的数据交换过程而言,可以利用直接存储访问(DMA)技术加速数据传送速度。下面是一个简单的例子说明怎样设置I2C DMA模式下的读操作函数原型: ```c void MX_I2C1_Init(void){ hi2c1.Instance = I2C1; hi2c1.Init.Timing = 0x20909CEC; // 设置时序参数 ... } static void SystemClock_Config(void){...} /* 用户自定义 */ uint8_t buffer[2]; /* 缓冲区大小取决于要接收的数据量 */ HAL_StatusTypeDef ReadAngleData_DMA(AS5600Encoder *pEnc, uint8_t* pDataBuffer){ return HAL_I2C_Master_Receive_DMA(&hi2c1, (uint16_t)pEnc->address << 1 ,pDataBuffer, sizeof(buffer)); } ``` 上述片段来自一个开源项目案例,其中包含了必要的头文件引入、外设初始化以及实际执行DMA读取命令的部分逻辑[^2]。 #### 控制电机的位置调整 当涉及到闭环控制系统中的位置调节任务时,可以通过集成像SimpleFOC这样的外部库简化开发流程。这里给出了一种典型应用场景&mdash;&mdash;让直流无刷电机依据由AS5600提供的实时角位移信息在两个极限点间循环往复运动的方法概述: ```cpp #include <SimpleFOC.h> BLDCMotor motor; motor.setup(); while(true){ float angle = encoder.read_angle(); // 获取当前角度值 if(angle >= 0 && angle <= PI || angle >= -PI && angle <= 0){ motor.move_to(-angle); // 向相反方向转动至目标位置 } delay(10); // 延迟一段时间再继续下一次检测 } ``` 此段伪代码体现了通过调用`read_angle()`方法获取当前位置后,根据设定条件驱动电机到达特定方位的过程[^3]。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值