一、Drv8434s芯片介绍
PWM 微步进电机驱动器
– 具有 STEP/DIR 引脚的 SPI 接口
– 最高 1/256 的微步进分度器
• 集成电流检测功能
– 无需检测电阻
– ±4% 满量程电流精度
• 智能调优、慢速和混合衰减选项
• 工作电源电压范围为 4.5V 至 48V
• 低 RDS(ON):24V、25°C 时为 330mΩ HS + LS
• 高电流容量:2.5A 满量程、1.8A 均方根电流
• TRQ_DAC 位可调节满量程电流
• 可配置关断时间 PWM 斩波
– 7μs、16μs、24μs 或 32μs
• 支持 1.8V、3.3V、5.0V 逻辑输入
• SPI 支持菊花链
• 低电流睡眠模式 (2μA)
• 展频时钟,以降低 EMI
• 小型封装和外形尺寸
• 保护特性
– VM 欠压锁定 (UVLO)
– 电荷泵欠压 (CPUV)
– 过流保护 (OCP)
– 无传感器失速检测
– 开路负载检测 (OL)
– 过热警告 (OTW)
– 热关断 (OTSD)
– 故障调节输出 (nFAULT)
1.1 说明
DRV8434S 是一款适用于工业和消费类应用的步进电机驱动器。该器件由两个 N 沟道功率 MOSFET H 桥驱动器、一个微步进分度器以及集成电流检测功能完全集成。DRV8434S 最高可驱动 2.5A 满量程输出电流(取决于 PCB 设计)。
DRV8434S 采用内部电流检测架构,无需再使用两个外部功率检测电阻,可缩小 PCB 面积并降低系统成本。该器件使用内部 PWM 电流调节方案,该方案能在智能调优、慢速和混合衰减选项之间进行选择。智能调
优技术可自动调节,以实现出色的电流调节并减少电机的可闻噪声。
借助具有 STEP/DIR 引脚的简单 SPI 接口,可通过外部控制器管理步进电机的方向和步进速率。这款器件可配置为多种步进模式,从全步进模式到 1/256 微步进模式皆可。利用先进的失速检测算法,设计人员可以检测电机是否停止运行,并根据需要采取措施。该器件还包括一个集成的扭矩 DAC,该扭矩 DAC 允许通过 SPI 调整输出电流,而无需调整 VREF 基准。提供的其他保护特性包括:电源欠压、电荷泵故障、过流、短路、开路负载和过热保护。故障状态通过 nFAULT 引脚指示。
该器件采用 nSLEEP 引脚,可提供一种低功耗的休眠模式,从而实现极低待机电流。该器件采用全双工、4 线同步 SPI 通信功能,并允许通过菊花链方式串联最多 63 个器件以实现可配置性和提供详细故障报告。
二、硬件原理图
我这里是驱动的5V电机,所以原理图是5V的,芯片可以驱动5V,12V,24V的电机,只需要修改供电电压即可。
三、驱动程序
由于我这里用了rtthread的系统,所以中间混杂了一些rtt的延时函数和一些时间轮转调度的函数。但是大致是对的,已经完整运行。缺的函数需要读者自己去填补。
void Drv8434_Device_Sleep(uint8_t DeviceId)
{
Drv8434_SLEEP_Low(DeviceId);
}
void Drv8434_Device_WakeUp(uint8_t DeviceId)
{
Drv8434_SLEEP_High(DeviceId);
}
void Drv8434_Device_HalfBridge_Enable(uint8_t DeviceId)
{
Drv8434_ENABLE_High(DeviceId);
}
void Drv8434_Device_HalfBridge_Disable(uint8_t DeviceId)
{
Drv8434_ENABLE_Low(DeviceId);
}
//Æ÷¼þģʽÉèÖÃ
void Drv8434_Device_WorkingMode(uint8_t DeviceId)
{
Drv8434_Device_WakeUp(DeviceId);
Drv8434_Device_HalfBridge_Enable(DeviceId);
}
void Drv8434_Device_SleepMode(uint8_t DeviceId)
{
Drv8434_Device_Sleep(DeviceId);
}
void Drv8434_Device_DisableMode(uint8_t DeviceId)
{
Drv8434_Device_WakeUp(DeviceId);
Drv8434_Device_HalfBridge_Disable(DeviceId);
}
void Drv8434_TransmitRecvive( uint8_t* SendData, uint8_t* RecvData, uint8_t Size)
{
Drv8434_CS_Low();
rt_thread_delay(DRV8434_Delay_Time);
for(int i=0;i < Size;i++)
{
for(int j=0;j < 8;j++)
{
DRV8434_SCLK_High;
if( (SendData[i] & 0x80) != 0)
{
DRV8434_SDI_High;
}
else
{
DRV8434_SDI_Low;
}
if(j<7)
{
SendData[i] = SendData[i] <<1;
}
rt_thread_delay(DRV8434_Delay_Time);
DRV8434_SCLK_Low;
uint8_t a = Drv8434_SDO_Read();
if(a !=0)
{
RecvData[i] = RecvData[i] | 0x01;
}
if(j<7)
{
RecvData[i] = RecvData[i] <<1;
}
rt_thread_delay(DRV8434_Delay_Time);
}
}
rt_thread_delay(DRV8434_Delay_Time);
Drv8434_CS_High(DeviceId);
}
void Drv8434_Init()
{
//³õʼ»¯
rt_enter_critical();
DRV8434_SCLK_Low;
Drv8434_Device_WorkingMode(1);
Drv8434_Device_WorkingMode(2);
Drv8434_CS_High(1);
Drv8434_CS_High(2);
rt_thread_delay(10);
uint8_t SData[2] = {0};
uint8_t RData[2] = {0};
SData[0] = SData[0] | DRV8434_Write | DRV8434_CTRL2_ControlResgister_Address;
SData[1] = 0x8E;
delay_ms(10);
//Drv8434_TransmitRecvive(1, SData,RData, 2);
delay_ms(1000);
Drv8434_TransmitRecvive(2, SData,RData, 2);
delay_ms(10);
//CTRL3¿ØÖƲ½½ø΢²½
// double f = Drv8434_Get_Frequece();
//
// double t = 1.0/f;
//printf("Drv8434_2_Step_Delay_Time:%f\r\n",t);
Drv8434_1_Step_Delay_Time = 300;
Drv8434_2_Step_Delay_Time = 300;
//printf("Drv8434_2_Step_Delay_Time:%d\r\n",Drv8434_2_Step_Delay_Time);
//printf("%d\r\n",Drv8434_2_Step_Delay_Time);
uint8_t SData2[2] = {0};
uint8_t RData2[2] = {0};
SData2[0] = SData2[0] | DRV8434_Write | DRV8434_CTRL3_ControlResgister_Address;
SData2[1] = 0x01;
//HAL_UART_Transmit(&huart1, SData2, 2, 100);
delay_ms(10);
//Drv8434_TransmitRecvive(1, SData2, RData2, 2);
delay_ms(1000);
Drv8434_TransmitRecvive(2, SData2, RData2, 2);
delay_ms(10);
//HAL_UART_Transmit(&huart1, RData2, 2, 100);
DRV8434_Device1_DIR_High;
DRV8434_Device1_STEP_High;
DRV8434_Device2_DIR_High;
DRV8434_Device2_STEP_High;
rt_exit_critical();
}