AS5048A除了通过PWM向外传输数据外,还通过SPI口向外发送位置。手头的资料是寄存器SPI读写的版本,和HAL库简直不搭边,当然也因为水平限制看起来代码读的很累,尝试着将寄存器版本的库引入STM32MX生成的代码中,但是最终失败了,时间不等人,那就继续用HAL自带的库读写好了。其实最后完成了一看,HAL库真的是简单简洁,读起来很好。(寄存器运行的好像是要更快的,建议要求较高的地方还是采用寄存器方式)。
话不多说,上配置。在cube中配置好SPI通讯,注意CPOL的极性是Low。(水平还是太菜,没看懂这是什么意思,导致读出的结果范围不能到0):
然后写读取的函数如下:
#define Com_Ang 0xFFFF //读取角度命令
#define CS10 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET)
#define CS11 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET)//片选1号SPI使可读
uint16_t SPI_AS5048A_ReadData(void)
{
uint16_t angle_value;
command = Com_Ang;
CS10;
HAL_SPI_Transmit(&hspi1 ,(unsigned char *)&command ,1,100);
CS11;
CS10;
HAL_SPI_TransmitReceive(&hspi1 ,(unsigned char *)&command ,(unsigned char *)&angleValue ,1 ,100 );
CS11;
angle_value = angleValue & 0x3FFF;
return angle_value;
}
以上,就能读出来AS5048的SPI位置了。当然,得到的数据需要除以一个最大值0x3FFF再乘以三百六十度。
以上代码不包含校验,只是作为理想情况下的读出。Com_ang作为角度读出指令本应是0x3FFF,但是加上校验位和标志位,所以写入的时候应该是0xFFFF。AS5048是延迟输出的,就是读出的是上一次的位置,所以我在这里写两次读一次。后来一验证,你持续不断的读就可以了,不需要写两次读一次,反正读的就是上一次的值。但是,如果读的间隔太长,那还是建议写两次读一次的方式,毕竟这样读出来的值最接近当前位置。
头一次接触cube,磕磕绊绊的,搞了两天多。如果能对后来人有所帮助,那真是太好了。