前几天拆了一个云台,研究了一下具体的实现,是使用的编码传感器。但是资料比较少,我这里收集了一下,需要的可以找我拿一下。
STM32F373C的芯片
下面就是无刷搭配的磁编码器了
后面
正面的小磁铁
我喜欢这个,官网的东西
这个也是一个接线图
https://ams.com/zh/as5600#tab/documents
官网在此
https://pan.baidu.com/share/init?surl=Mh2O3kjxmiBXRPXie9F6-w
i3op
这是找到的一些程序代码
这么多
接线图
嘉立创上面的板子
https://oshwhub.com/colin2135/as5600
芯片的引脚
供电情况
所有资料
AS5600支持Fast-mode Plus模式,SCL能达到1MHz。
https://blog.csdn.net/SC_Electronic/article/details/86105409
https://github.com/capella-ben/microPython_AS5600L
https://github.com/sgall17a/AS5600
芯片框图,注意供电和控制以及输出
I2C的时序
数据读
数据写
角度输出
int _raw_ang_hi = 0x0c;
int _raw_ang_lo = 0x0d;
int _ams5600_Address = 0x36;
高低位和数据的地址
int readOneByte(int in_adr)
{
int retVal = -1;
Wire.beginTransmission(_ams5600_Address);//开始传输
Wire.write(in_adr);//需要读的地址
Wire.endTransmission();
Wire.requestFrom(_ams5600_Address, 1);//从5600处获取数据
while(Wire.available() == 0);//等待I2C总线停止占用(传输结束)
retVal = Wire.read();//读到的数据
return retVal;
}
读取字节的函数
10位的数据,要高位和地位,然后组合起来
word readTwoBytes(int in_adr_hi, int in_adr_lo)
{
word retVal = -1;
/* 先读取低位 */
Wire.beginTransmission(_ams5600_Address);
Wire.write(in_adr_lo);
Wire.endTransmission();
Wire.requestFrom(_ams5600_Address, 1);
while(Wire.available() == 0);
int low = Wire.read();
/* 再读取高位 */
Wire.beginTransmission(_ams5600_Address);
Wire.write(in_adr_hi);
Wire.endTransmission();
Wire.requestFrom(_ams5600_Address, 1);
while(Wire.available() == 0);
word high = Wire.read();
high = high << 8;//高位数据左移
retVal = high | low; //高位数据左移动8位之后,和低位数据或
//或计算就是尽量等于1,任何一边有1就是1
return retVal;
}
读取两个数值组合后就是一个磁编码器数据,10bit,从0-4096的那种,根据角度划分,360/4096=0.087度,精度达到0.1度。
把这个东西输出:
int val = getRawAngle()*0.087;//获取10bit数值,乘以角度后转成实际角度
Serial.println(val);
//delay(10);
digitalWrite(OUTPORT,HIGH);
delayMicroseconds(400);
digitalWrite(OUTPORT,LOW);
delay(3);
这里接电机
#include "Wire.h"
#define OUTPORT 8 //ver2
int _raw_ang_hi = 0x0c;
int _raw_ang_lo = 0x0d;
int _ams5600_Address = 0x36;
void setup() {
Serial.begin(115200);
Wire.begin();
pinMode(OUTPORT,OUTPUT);
}
void loop() {
//Serial.println(String(convertRawAngleToDegrees(getRawAngle()),DEC));
int val = getRawAngle()*0.087;
Serial.println(val);
//delay(10);
digitalWrite(OUTPORT,HIGH);
delayMicroseconds(400);
digitalWrite(OUTPORT,LOW);
delay(3);
}
float convertRawAngleToDegrees(word newAngle)
{
/* Raw data reports 0 - 4095 segments, which is 0.087 of a degree */
float retVal = newAngle * 0.087;
return retVal;
}
word getRawAngle()
{
return readTwoBytes(_raw_ang_hi, _raw_ang_lo);
}
int readOneByte(int in_adr)
{
int retVal = -1;
Wire.beginTransmission(_ams5600_Address);
Wire.write(in_adr);
Wire.endTransmission();
Wire.requestFrom(_ams5600_Address, 1);
while(Wire.available() == 0);
retVal = Wire.read();
return retVal;
}
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);
word high = Wire.read();
high = high << 8;
retVal = high | low;
return retVal;
}
串口绘图
https://blog.csdn.net/u012388993/article/details/113590623
以上代码来自这里。
就是不知道我这个电机要这么搞下来了。。。