这是AS5050读取角度的代码,目前使用了这两个寄存器,能够读取角度,但是一直存在瑕疵
Angular Data - [0x3FFF]
Power ON Reset (POR) Register - [0x3F22]
void printDataToSerial(uint16_t data) {
char buffer[50];
sprintf(buffer, "数据: %u\r\n", data);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}
void readAndPrintData(void) {
uint16_t angleData = 0;
uint8_t txBuffer[2];
uint8_t rxBuffer[2];
HAL_StatusTypeDef status;
uint16_t readCmd = 0x3FFF; // 正确的读取角度命令
txBuffer[0] = (readCmd >> 8) & 0xFF; //0x3F
txBuffer[1] = readCmd & 0xFF; //0xFF
// 发送读取命令
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET);
status = HAL_SPI_Transmit(&hspi2, txBuffer, 2, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET);
if (status != HAL_OK) {
HAL_UART_Transmit(&huart1, (uint8_t*)"SPI Transmit Error\r\n", strlen("SPI Transmit Error\r\n"), HAL_MAX_DELAY);
return;
}
char txbuffer[100];
sprintf(txbuffer, "发送命令: 0x%02X 0x%02X \r\n", txBuffer[0], txBuffer[1]);
HAL_UART_Transmit(&huart1, (uint8_t*)txbuffer, strlen(txbuffer), HAL_MAX_DELAY);
HAL_Delay(1);
// 读取数据
txBuffer[0] = 0x00;
txBuffer[1] = 0x00;
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET);
status = HAL_SPI_TransmitReceive(&hspi2, txBuffer, rxBuffer, 2, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET);
if (status != HAL_OK) {
HAL_UART_Transmit(&huart1, (uint8_t*)"SPI Transmit/Receive Error\r\n", strlen("SPI Transmit/Receive Error\r\n"), HAL_MAX_DELAY);
return;
}
// 拼接数据
angleData = (rxBuffer[0] << 8) | rxBuffer[1]; //高位<<8 | 低位字节
uint16_t angleValue = angleData & 0x03FF; //0x03FF 是一个掩码,用于提取低10位的数据
float actualAngle = (angleValue / (float)MAX_RAW_VALUE) * 360.0f;//公式
bool alarmHi = (angleData & (1 << 13)) != 0;
bool alarmLo = (angleData & (1 << 12)) != 0;
char buffer[100];
sprintf(buffer, "接收数据: 0x%02X 0x%02X 角度值: %u 实际角度值: %.2f° 下限报警: %d 上限报警: %d\r\n",
rxBuffer[0], rxBuffer[1], angleValue, actualAngle, alarmLo, alarmHi);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
}
uint16_t constructCommand(uint16_t address, bool rwFlag) {
// 确保正确设置命令和地址
return (address & 0x3FFF) | (rwFlag ? 0x8000 : 0); //0x8000读 0写
}
void readData(uint16_t address, uint8_t *data, uint8_t numBytes) {
uint8_t txBuffer[2];
uint8_t rxBuffer[numBytes];
uint16_t cmd = constructCommand(address, true); // 读操作命令
txBuffer[0] = (cmd >> 8) & 0xFF;
txBuffer[1] = cmd & 0xFF;
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET);
HAL_StatusTypeDef status = HAL_SPI_Transmit(&hspi2, txBuffer, 2, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET);
if (status != HAL_OK) {
HAL_UART_Transmit(&huart1, (uint8_t*)"SPI Transmit Error\r\n", strlen("SPI Transmit Error\r\n"), HAL_MAX_DELAY);
return;
}
HAL_Delay(1);
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET);
status = HAL_SPI_TransmitReceive(&hspi2, txBuffer, rxBuffer, numBytes, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET);
if (status != HAL_OK) {
HAL_UART_Transmit(&huart1, (uint8_t*)"SPI Transmit/Receive Error\r\n", strlen("SPI Transmit/Receive Error\r\n"), HAL_MAX_DELAY);
return;
}
memcpy(data, rxBuffer, numBytes);
}
uint8_t readData8(uint16_t address) {
uint8_t data;
readData(address, &data, 1);
return data;
}
uint16_t readData16(uint16_t address) {
uint8_t data[2];
readData(address, data, 2);
return (data[0] << 8) | data[1];
}
uint8_t readPorRegister() {
HAL_UART_Transmit(&huart1, (uint8_t*)"读取 POR 寄存器...\r\n", strlen("读取 POR 寄存器...\r\n"), HAL_MAX_DELAY);
return readData8(0x3F22); // 确保该地址正确
}
uint16_t readAngularData() {
HAL_UART_Transmit(&huart1, (uint8_t*)"读取角度数据...\r\n", strlen("读取角度数据...\r\n"), HAL_MAX_DELAY);
return readData16(0x3FFF) & 0x03FF;
}
主要代码就这一段,目前就是角度数据(低10位)和角度不匹配,还有就是POR寄存器数据一直在变,按理说不会变动的,还有一个大问题就是角度一直都只有几个方向159或者338,按理说360°都应该读取的,但是一直就只有几个角度,下面是串口助手收到的数据。谁能帮忙指导一下,到底该怎么修改啊,找不到问题,SPI设置的nss是GPIO_MODE_OUTPUT_PP、其他的是GPIO_MODE_AF_PP,mode 0 ,这一个128我不知道对不对
```c
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;