AMS_AS5047P
簡介Position Sensor
A position sensor is a sensor that facilitates measurement of mechanical position. A position sensor may indicate absolute position (location) or relative position (displacement), in terms of linear travel, rotational angle, or three-dimensional space.
Postition sensor的樣式很多元下表展示
比較表
可以看到目前量測位置的Sensor有以上這6種為主流,目前市面上常使用的的分別為Indutive、Hall_Effect、Magnetic Encoder這3類,其中Indutive的門檻較高主要是需要參考PCB的線圈繞現有一定規範可以看下圖,可以看到不同的線圈繞線方式對於波形會有不同且一般廠商不會PCB繞線Suporrt設計與驗證,因此Hall_Effect、Magnetic Encoder為大宗其中因為價格因素又以Hall_Effect更為廣泛
AMS Magnetic Encoder工作原理圖
這邊介紹Magnetic Encoder是以AMS的為主軸介紹,可以看到下方比較表AMS比Allegro有更短的響應時間,雖然在解析度上輸,但響應時間在馬達控制上會更為重要。
再來是AMS產品使用的是垂直磁場變化與一邊水平磁場不同有更好的抗周邊磁場能力
SPI Setting on STM32 and Coding Sample
這邊選比較需要解釋的SPI,看Datasheet裡可以看到每筆16bit的前2Bit是有額外定義,主要Data是由後面的14Bit來資料傳輸,但使用SPI傳輸完整還是16bit傳輸
這邊可以看到Datasheet裡分別有Read和Write傳輸這邊可以看到在讀取發送訊息後是下一筆Data的時間差才會收到DATA
下面放上讀取範例
SPI讀取資料
typedef union {
uint16_t raw;
struct __attribute__ ((packed)) {
uint16_t data:14;
uint16_t ef:1;
uint16_t pard:1;
} values;
} ReadDataFrame;
float getANGLE()
{
ReadDataFrame readDataFrame = readRegister(CMD_ANGLE);
Angle angle;
angle.raw = readDataFrame.values.data;
return angle.values.cordicang/16384.*360.;
}
SPI應用Position sensor
ReadDataFrame readRegister(uint16_t registerAddress)
{
CommandFrame command;
command.values.rw = READ;
command.values.commandFrame = registerAddress;
command.values.parc = isEven(command.raw);
CommandFrame nopCommand;
nopCommand.values.rw = READ;
nopCommand.values.commandFrame = CMD_NOP;
nopCommand.values.parc = isEven(nopCommand.raw);
ReadDataFrame receivedFrame;
receivedFrame.raw = SPI_read(command.raw, nopCommand.raw);
return receivedFrame;
}
void writeRegister(uint16_t registerAddress, uint16_t registerValue)
{
CommandFrame command;
command.values.rw = WRITE;
command.values.commandFrame = registerAddress;
command.values.parc = isEven(command.raw);
WriteDataFrame contentFrame;
contentFrame.values.data = registerValue;
contentFrame.values.low = 0;
contentFrame.values.pard = isEven(contentFrame.raw);
SPI_write(command.raw, contentFrame.raw);
}