磁気式角度センサAS5050AMOME
ピンアサイン
この図のように配線する。
MOSI、MISO、SSは10kでプルアップ。
使う磁石はこういうやつ。"磁石径方向"と調べると出てくる。
ノイズはこうなるらしい。
Sysytem Configuration Register 1で4種選択できるようだ。
15Ωが無かったので、10Ωにした。
SPIでREAD ANGLEの合図を送ると、INTがHIGHになって計測を開始する。終わったら、INTがLOWになり、READ ANGLEができる。計測中にREAD ANGLEはしてないけない。
Jitterを減らすには、4回データを取得してその平均を取れば、50%減らせると書いてある。
CPOL=0、CPHA=1、MSB first
最初は4-wireでいいや。Daisy Chainとかできるらしい。
SPIコマンドフレーム
read/write指定。アドレス。パリティビット。
読み込み
書き込み
最初にソフトウェアリセットが必要。
磁石の強度を判別してくれるらしい。角度のデータ。
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
const uint16_t SOFTWARE_RESET = 0b0111100000000000;
const uint16_t MASTER_RESET = 0b0110011101001010;
const uint16_t CLEAR_ERROR_FLAG = 0b1110011100000000;
const uint16_t ANGULAR_DATA = 0b1111111111111111;
const uint16_t ERROR_STATUS = 0b1110011010110101;
uint16_t Tx = 0;
uint16_t Rx = 0;
char buffer[1024];
void send_uart(char *s){
HAL_UART_Transmit(&huart2, (uint8_t *) s, strlen(s), 2000);
}
void write_spi(uint16_t Tx, uint16_t write_val){
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,(uint8_t *)&Tx,1,100);
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,(uint8_t *)&write_val,1,100);
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET);
}
void read_spi(uint16_t Tx){
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1,(uint8_t *)&Tx,(uint8_t *)&Rx,1,100);
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET);
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
write_spi(SOFTWARE_RESET, 0b0000000000000101);
read_spi(CLEAR_ERROR_FLAG);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(READ_INT_GPIO_Port, READ_INT_Pin) == 0){
read_spi(ANGULAR_DATA);
sprintf(buffer, "Alarm Lo %d, Alarm Hi %d, Angle Value %u, Error %d\n", (Rx >> 15) & 1, (Rx >> 14) & 1, (Rx >> 2) & 0b1111111111, (Rx >> 1) & 1);
send_uart(buffer);
HAL_Delay(100);
}
}
/* USER CODE END 3 */