项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等

近几天一直和师兄在配置驱动芯片,目前的进展是可以通过SPI配置、读取寄存器等,但是电机一直未被驱动起来(这个问题困扰了我们一两天了,希望有大佬可以帮忙解决一下)。
配置SPI要先根据数据手册的说明,确认好SPI如何配置,下图是数据手册中关于SPI的相关内容:
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第1张图片
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第2张图片
根据上面的格式就可以配置SPI,下面是使用cubeMX配置的SPI:
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第3张图片
在本项目中,SPI的CS引脚为通过普通的GPIO口,所以将SPI_NSS设置为GPIO_Output,NSS Singal Type设置为Software。
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第4张图片

下面是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)
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第5张图片
2、Control_Register_1 Register
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第6张图片

3、Control_Register_2A Register
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第7张图片
4、Control_Register_7 Register
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第8张图片

5、Control_Register_8 Register
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等_第9张图片
目前我们寄存器都已经配置完成,不过电机还是无法驱动。目前遇到的问题是:使用的数字霍尔,但是必须要将霍尔上拉才会有波形输出,但是此时上电nFAULT引脚会频繁的拉低(nFAULT高电平时才表示无故障)。
在看数据手册时,介绍说要在VM(电机的电压)上电之前,要先将nFAULT引脚拉高至2.2V以上,所以我们通过飞线直接将nFAULT引脚上拉到3.3V(之前是上拉到AVDD,当然也是3.3V,不过AVDD是MCT8316芯片上电之后才有输出的,跟TI推荐的方法不一样,所以这样连接,避免进入内部测试模式,不用nFAULT引脚也要将其拉高)。
同时为了在刚上电时,保证MCT8316芯片不工作,所以先配置nSLEEP引脚为低电平,使芯片进入睡眠模式,延时100ms之后再配置为高电平,退出睡眠模式,这样也保证nFAULT引脚在驱动芯片上电之前电压大于2.2V。
在这里插入图片描述
在这里插入图片描述
上面就基本上这两天的工作的总结了,今天一天找了很多资料配置寄存器(疯狂尝试各种寄存器配置),但是电机还是不会转起来,人已经麻了。。。不过好在还是有点小收获的,至少以后用一些芯片时可以自己配置了,不再全网找别人的代码了(安慰自己一下)。

你可能感兴趣的:(Balance项目,学习,BLDC,驱动芯片)