
STM32F373C的芯片

搭配的磁编码器

官网的:

官网资料:
https://pan.baidu.com/share/init?surl=Mh2O3kjxmiBXRPXie9F6-wi3op电路图:

嘉立创上面的板子

芯片的引脚
VDD5V、VDD3V3:电源输入。
OUT:模拟电压/PWM输出口,如果输出模拟电压,其上限为VDD电源电压,下限为GND,以比例线性绝对值形式输出角度对应的电压值;如果输出PWM,其输出的角度值由PWM脉冲宽度表示。
GND:地。
PGO:模式选择:模式A:用I2C读取角度(PGO悬空);模式B:用OUT引脚读取角度(PGO接GND)。
SDA、SCL:I2C接口(需外部上拉)。
DIR:旋转方向(连GND:顺时针数值增加,连VDD:顺时针数值减小)。

供电情况
5V模式:当电源输入为5V时,其内部LDO输出的3.3V不能为其他I2C设备供电,且3.3V需要一个1uF电容;
3.3V模式:当电源输入为3.3V时,需要将VDD5V和VDD3V3连接到一起,如果需要OTP编程,VDD3.3V还需一个10uF电容。
所有资料:

AS5600支持Fast-mode Plus模式,SCL能达到1MHz。
https://blog.csdn.net/SC_Electronic/article/details/86105409https://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; //I2C地址
读取字节的函数:读取AS5600的角度数据。
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;}
角度数据是10bit的,要高位和低位,然后组合起来。
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就是1return retVal;}
读取两个数值组合后就是一个磁编码器数据,10bit;
根据角度划分,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);
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 degreefloat 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