Drv8434s芯片两相步进电机驱动程序+硬件解决方案

一、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();
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 04:48:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 04:48:06       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 04:48:06       58 阅读
  4. Python语言-面向对象

    2024-07-13 04:48:06       69 阅读

热门阅读

  1. 力扣 150题 逆波兰表达式求值 记录

    2024-07-13 04:48:06       31 阅读
  2. cin和getline的区别

    2024-07-13 04:48:06       23 阅读
  3. STM32F103RC使用HAL库配置USART进行数据收发

    2024-07-13 04:48:06       28 阅读
  4. 07-7.5.3 处理冲突的方法

    2024-07-13 04:48:06       25 阅读
  5. Vue的import什么时候用大括号

    2024-07-13 04:48:06       23 阅读
  6. Spring Boot 框架知识汇总

    2024-07-13 04:48:06       26 阅读
  7. SpringBoot源码阅读(11)——后处理器2

    2024-07-13 04:48:06       24 阅读
  8. redis的发布与订阅

    2024-07-13 04:48:06       26 阅读
  9. Vue Router 4:构建高效单页面应用的路由管理

    2024-07-13 04:48:06       25 阅读
  10. c++【入门】病狗问题

    2024-07-13 04:48:06       22 阅读
  11. UE5 04-重新加载当前场景

    2024-07-13 04:48:06       25 阅读
  12. 【泛型】学习笔记

    2024-07-13 04:48:06       28 阅读
  13. python之修饰器介绍及示例

    2024-07-13 04:48:06       20 阅读
  14. 力扣1717.删除子字符串的最大得分

    2024-07-13 04:48:06       27 阅读
  15. 说一下你对dom驱动和数据驱动的理解

    2024-07-13 04:48:06       25 阅读
  16. GESP CCF C++ 一级认证真题 2024年6月

    2024-07-13 04:48:06       28 阅读