磁気式角度センサAS5050AMOME

ピンアサイン

画像1

画像2

画像3

画像4

この図のように配線する。
MOSI、MISO、SSは10kでプルアップ。

画像6

使う磁石はこういうやつ。"磁石径方向"と調べると出てくる。

画像8

画像5

ノイズはこうなるらしい。
Sysytem Configuration Register 1で4種選択できるようだ。

画像7

15Ωが無かったので、10Ωにした。

画像9

SPIでREAD ANGLEの合図を送ると、INTがHIGHになって計測を開始する。終わったら、INTがLOWになり、READ ANGLEができる。計測中にREAD ANGLEはしてないけない。
Jitterを減らすには、4回データを取得してその平均を取れば、50%減らせると書いてある。

画像10

画像11

CPOL=0、CPHA=1、MSB first

画像12

最初は4-wireでいいや。Daisy Chainとかできるらしい。

SPIコマンドフレーム

画像13

read/write指定。アドレス。パリティビット。

読み込み

画像14

画像15

書き込み

画像16

画像17

画像18

画像19

画像20

最初にソフトウェアリセットが必要。

画像21

磁石の強度を判別してくれるらしい。角度のデータ。

画像22

画像23

画像24

/* 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 */

この記事が気に入ったらサポートをしてみませんか?