MA730 零点校准

本人项目最近在使用MA730磁编码传感器,发现MA730具有零点校准功能。本人按照程序逻辑如下:这套逻辑无法触发MA730的零点校准功能。

1.代码流程如下:
1.1 程序每次要把上电后的电机位置设置为0角度。

设备上电—>延时1秒---->读取当前角度值(a)—> 按照公式:A=65536-[(a/360)*65536]计算出Z(0x01和0x00)寄存器的设定值----> 0x00写入A低八位,0x01写入A的高八位 ---->再次读取0x00和0x01寄存器值判断与之前写入值是否一样---->开始正常读取角度值(零点更新后的)。
我按照以上逻辑编程后,读取角度值没有因零点重设后而发生变化。请问什么原因

您好,

欢迎在MPS技术论坛留言,编程的逻辑应该是没有问题的。
请问再次读取0x00和0x01的寄存器值是之前写入的值吗?
如果是写入成功,在零点更新后,再正常去读取角度就是零点更新后的值了。
有问题请在留言,谢谢。

1 个赞

感谢您的回复。我按照您的要求,再写入0x01,0x00后立刻回读发现数据是一样的(写入值和读出值)。之后,间隔10ms读取角度值,发现角度值没有因零点校准后而改变。你们有参考代码吗?

您好,

麻烦问一下,你有在芯片上放磁铁吗?因为我们芯片是感应磁铁的磁场强度来输出角度位置。
一般顺序就是,磁铁对着芯片,读取当前角度寄存器的值,角度寄存器的值转换成角度带入到您说的公式,将获得的数值写入零位寄存器。如果再重新去读的话,新的角度值应该是零位校准后的值。

1 个赞

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);

执行结果

您好,

程序看起来问题不大,方便拍照看看磁铁和芯片的位置和结构吗?怀疑是磁场感应上的问题?
另外之前不做角度校正,角度的读取是正确的吗?

1 个赞