float hh_ma730_read_angle_not_use_filter(hh_ma730_t *ma730)
{
if(ma730->is_inital == HH_MA730_UNINITAL)
{
return 10000.0;
}
float angle = 0.0f;
uint8_t recv_data[2] = {0};
uint16_t raw_angle = 0;
ma730->ma730_cs_pin_set_low();
ma730->ma730_read_bytes(recv_data, sizeof(recv_data));
ma730->ma730_cs_pin_set_high();
raw_angle = (uint16_t)(recv_data[0] << 8) | recv_data[1];
raw_angle = raw_angle >> 2;
return raw_angle / 16384.0 * 360.0;
}
static uint16_t _hh_ma730_read_reg_val(hh_ma730_t *ma730, uint8_t reg_address)
{
uint16_t reg_val = 0;
uint8_t cmd_buf[2] = {0};
cmd_buf[0] = 0x40 | reg_address;
cmd_buf[1] = 0x00;
ma730->ma730_cs_pin_set_low();
ma730->ma730_write_bytes(cmd_buf, sizeof(cmd_buf));
ma730->ma730_cs_pin_set_high();
ma730->ma730_delay_ms(5);
uint8_t recv_buf[2] = {0};
ma730->ma730_cs_pin_set_low();
ma730->ma730_read_bytes(recv_buf, sizeof(recv_buf));
ma730->ma730_cs_pin_set_high();
reg_val = recv_buf[0];
return reg_val;
}
static hh_ma730_state_t _hh_ma730_write_reg_val(hh_ma730_t *ma730, uint8_t reg_address, uint8_t reg_val)
{
uint8_t cmd_buf[2] = {0};
cmd_buf[0] = 0x80 | reg_address;
cmd_buf[1] = reg_val;
ma730->ma730_cs_pin_set_low();
ma730->ma730_write_bytes(cmd_buf, sizeof(cmd_buf));
ma730->ma730_cs_pin_set_high();
ma730->ma730_delay_ms(20);
uint8_t recv_data = 0;
ma730->ma730_cs_pin_set_low();
ma730->ma730_read_bytes(&recv_data, 1);
ma730->ma730_cs_pin_set_high();
if (recv_data != reg_val)
{
return HH_MA730_failed;
}
else
{
return HH_MA730_ok;
}
}
hh_ma730_state_t hh_ma730_set_zero_position(hh_ma730_t *ma730 )
{
while( _hh_ma730_write_reg_val(ma730, HH_MA730_REG_Z_7_0 ,0) == HH_MA730_failed);
while( _hh_ma730_write_reg_val(ma730, HH_MA730_REG_Z_15_8 ,0)== HH_MA730_failed);
ma730->ma730_delay_ms(1000);
uint16_t current_angle = hh_ma730_read_angle_not_use_filter(ma730);
printf("current_raw_angle = %d\r\n" , current_angle);
uint16_t diff_raw_angle = 65536 - current_angle * 65536 / 360.0 ;
printf("diff_raw_angle %x %d \r\n", diff_raw_angle , diff_raw_angle);
while( _hh_ma730_write_reg_val(ma730, HH_MA730_REG_Z_7_0 ,diff_raw_angle) == HH_MA730_failed);
while( _hh_ma730_write_reg_val(ma730, HH_MA730_REG_Z_15_8 ,diff_raw_angle >> 8)== HH_MA730_failed);
uint8_t reg_val = _hh_ma730_read_reg_val(ma730 , HH_MA730_REG_Z_7_0);
uint8_t reg_val_1 = _hh_ma730_read_reg_val(ma730 , HH_MA730_REG_Z_15_8);
PRINT(diff_raw_angle, "HH_MA730_REG_Z_7_0=%x HH_MA730_REG_Z_15_8=%x\r\n" , reg_val , reg_val_1);
return HH_MA730_ok;
}
以下是调用过程:
HAL_Delay(1000);
hh_ma730_set_zero_position(&ma730);
current_angle = hh_ma730_read_angle_not_use_filter(&ma730 );
HAL_Delay(3000);
printf(“current_angle %.2f”, current_angle);
执行结果