声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。
一、前言
由于之前DRV8301的驱动板出现了问题,而且在结构上也出现了部分问题,所以最近又重新绘制了一版,不过还是存在一些小问题,后面我还会重新绘制一版,并且修改控制板和驱动板"上-下"的结构,采用平行线的结构进行连接,修改后的DRV8301原理图如下:
PCB如下:
实物如下:
由于改版还不是最后一版,所以有些地方使用了比较便宜的元器件,不过测试都正常:
GVDD:12V
AVDD:6.8V
DVDD:3.3V
下图是C相上下两个MOS管栅极的信号(蓝色为上管的栅极驱动信号为24V;黄色为下管的栅极驱动信号,为12V):
DRV8301代码:
c
#include "DRV8301.h"
#include "spi.h"
#include "math.h"
uint16_t tx, rx=10;
static uint8_t tx_buff[14];
// uint8_t status[10] = {100,100,100,100,100,100,100,100,100,100};
uint8_t addr,dat;
uint8_t MCT8316_read_buffer(uint8_t const regAddr, uint8_t *pData, uint8_t len)
{
CS_LOW;
tx = regAddr | 0x80;
tx_buff[0] = tx;
HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&tx, (uint8_t *)&rx, 1, 55);
HAL_SPI_TransmitReceive(&hspi1, tx_buff, pData, len, 55);
CS_HIGH;
return 0;
}
uint16_t DRV8301_read_reg(uint8_t *pData, uint8_t len)
{
CS_LOW;
HAL_SPI_Receive(&hspi1, pData, len,55);
CS_HIGH;//源代码发送的是ff
return rx&0xFFFF;
}
uint8_t MCT8316_write_reg(uint16_t reg)
{
CS_LOW;
HAL_SPI_Transmit(&hspi1, (uint8_t *)®, 1,55);
CS_HIGH;
return 0;
}
uint8_t MCT8316_read(uint16_t reg)
{
uint8_t result;
MCT8316_write_reg(READ | reg << 11);
DRV8301_read_reg((uint8_t *)&result,1);
return result;
}
void DRV8301_Init(void)
{
uint8_t dat1,dat2;
dat1 = 0x03; // B10~B8
dat2 = 0xF1; // B7~B0
tx = WRITE | Control_Register_1<<11 | ((dat1<<6| dat2)&0x07FF);
// tx = 0x13F1;
MCT8316_write_reg(tx);
HAL_Delay(10);
dat1 = 0x00;
dat2 = 0x0F;
tx = WRITE | (Control_Register_2<<11)|((dat1<<6|dat2)&0x07FF);
// tx = 0x180F;
MCT8316_write_reg(tx);
HAL_Delay(10);
}
二、下版需要修改之处
- 修改MR30和XT60尺寸
- DRV8301的封装需要注意一下
- 驱动板、控制板修改连接线
- 使用STM32F405RGT6重新绘制控制板
三、往期回顾
FOC系列(一)----DRV8301芯片的学习
FOC系列(二)----继续学习DRV8301芯片
FOC系列(三)----AS5600磁编码器