近几天一直和师兄在配置驱动芯片,目前的进展是可以通过SPI配置、读取寄存器等,但是电机一直未被驱动起来(这个问题困扰了我们一两天了,希望有大佬可以帮忙解决一下)。
配置SPI要先根据数据手册的说明,确认好SPI如何配置,下图是数据手册中关于SPI的相关内容:
根据上面的格式就可以配置SPI,下面是使用cubeMX配置的SPI:
在本项目中,SPI的CS引脚为通过普通的GPIO口,所以将SPI_NSS设置为GPIO_Output,NSS Singal Type设置为Software。
下面是cubeMX生成的初始化代码:
/* SPI1 init function */
void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END SPI1_Init 1 */
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
下面是SPI写寄存器的代码,以MCT8316的控制寄存器1为例:
// 地址为为6位,所以先将寄存器地址左移1位
addr = (Control_Register_1<<1)&0X7F;
// 要写入寄存器的值,根据数据手册有关寄存器的介绍
dat = 0x03;
// 将地址和数据的奇偶校验异或(相同为0,相异为1),最后再将地址与最终的奇偶校验位“|”一下
addr |= ParityCheck(addr)^ParityCheck(dat);
// 写寄存器,函数的参数为地址(已经加入奇偶校验位)和数据
MCT8316_write_reg(addr,dat);
// 延时
HAL_Delay(10);
MCT8316_write_reg():
uint8_t MCT8316_write_reg(uint8_t reg,uint8_t val)
{
// CS引脚拉低
HAL_GPIO_WritePin(GPIOA,CS_Pin,0);
// 写寄存器是MSB为0,将reg(地址)"&0x7F",确保MSB为0
tx = reg & 0x7F;
// 将tx左移八位并"|"上要写入寄存器的值,得到十六位数据形式
tx = (tx<<8)|val;
// 通过HAL库的函数将数据发送出去
HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&tx, (uint8_t *)&rx, 1, 55);
// CS引脚拉高
HAL_GPIO_WritePin(GPIOA,CS_Pin,1);
return 0;
}
下面是示波器观察的CLK和CS引脚的波形图(非常可惜的是CLK和MOSI引脚的波形图忘记拍照了,只能粗略的形容一下就是:非常完美!!!):
上面就是基本配置和调试SPI的过程了,下面是MCT8316芯片寄存器的部分介绍(主要介绍踩坑的寄存器):
1、IC_Status_Register Register (Read Only)
2、Control_Register_1 Register
3、Control_Register_2A Register
4、Control_Register_7 Register
5、Control_Register_8 Register
目前我们寄存器都已经配置完成,不过电机还是无法驱动。目前遇到的问题是:使用的数字霍尔,但是必须要将霍尔上拉才会有波形输出,但是此时上电nFAULT引脚会频繁的拉低(nFAULT高电平时才表示无故障)。
在看数据手册时,介绍说要在VM(电机的电压)上电之前,要先将nFAULT引脚拉高至2.2V以上,所以我们通过飞线直接将nFAULT引脚上拉到3.3V(之前是上拉到AVDD,当然也是3.3V,不过AVDD是MCT8316芯片上电之后才有输出的,跟TI推荐的方法不一样,所以这样连接,避免进入内部测试模式,不用nFAULT引脚也要将其拉高)。
同时为了在刚上电时,保证MCT8316芯片不工作,所以先配置nSLEEP引脚为低电平,使芯片进入睡眠模式,延时100ms之后再配置为高电平,退出睡眠模式,这样也保证nFAULT引脚在驱动芯片上电之前电压大于2.2V。
上面就基本上这两天的工作的总结了,今天一天找了很多资料配置寄存器(疯狂尝试各种寄存器配置),但是电机还是不会转起来,人已经麻了。。。不过好在还是有点小收获的,至少以后用一些芯片时可以自己配置了,不再全网找别人的代码了(安慰自己一下)。