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

news2024/11/13 10:55:47

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最小二乘算法的解

最小二乘法&#xff08;Least Squares&#xff09;是一种用于寻找线性回归模型的最佳拟合直线的标准方法。它通过最小化数据点与拟合直线之间的平方差来找到最佳拟合的线性模型。 线性回归模型 假设我们有一组数据点 (xi,yi)&#xff0c;线性回归模型的目标是找到系数 w 和截…

一个很变态但是有用的变现手段:用AI技术搞电商模特图,接单接到手软~

前言 今天带大家拆解一个特别有趣的项目&#xff0c;必须得跟大家分享一下&#xff1a;用AI技术搞电商模特图。 是不是感觉挺科幻的&#xff1f;但这真不是科幻小说里的情节&#xff0c;而是咱们现实生活中已经实现的事情。 想想看&#xff0c;咱们平常在网上看到的那些漂亮…

《数据科学与工程》课程结课报告

目录 作业要求: 一、数据预处理(包括数据扩展、数据过滤、数据加载等) 1.数据查看 2.上传数据 3.查看数据读取情况 4.时间维度的切割 二、单维度数据描述分析 2.1 条数统计 (1)查询数据的总条数 (2)非空查询条数 (3)查询无重复总条数 (4)查询UID唯一的条…

ARM功耗管理之功耗数据与功耗收益评估

安全之安全(security)博客目录导读 思考&#xff1a;功耗数据如何测试&#xff1f;功耗曲线&#xff1f;功耗收益评估&#xff1f; UPF的全称是Unified Power Format&#xff0c;其作用是把功耗设计意图&#xff08;power intent&#xff09;传递给EDA工具&#xff0c; 从而帮…

Vue3 使用 Vue Router 时,prams 传参失效和报错问题

Discarded invalid param(s) “id“, “name“, “age“ when navigating 我尝试使用 prams 传递数据 <script setup> import { useRouter } from vue-routerconst router useRouter() const params { id: 1, name: ly, phone: 13246566476, age: 23 } const toDetail…

XSS: 原理 反射型实例[入门]

原理 服务器未对用户输入进行严格校验&#xff0c;使攻击者将恶意的js代码&#xff0c;拼接到前端代码中&#xff0c;从而实现恶意利用 XSS攻击危害 窃取用户Cookie和其他敏感信息&#xff0c;进行会话劫持或身份冒充后台增删改文章进行XSS钓鱼攻击利用XSS漏洞进行网页代码的…

ARM功耗管理之唤醒源与组合唤醒源

安全之安全(security)博客目录导读 思考&#xff1a;什么是睡眠锁&#xff1f;什么是唤醒源&#xff1f;什么是组合唤醒源&#xff1f; DynamIQ系统下的唤醒源 Redistributor中包含了一个GICR_WAKER寄存器&#xff0c;用于记录connected PE的状态是onLine还是offline. 如果让P…

数电基础 - 组合逻辑电路

目录 一. 简介 二. 分析方法 三. 设计方法 四. 常用的逻辑组合电路 五. 冒险现象 六. 消除冒险现象 七. 总结 一. 简介 组合逻辑电路是数字电路中的一种类型&#xff0c;它在任何时刻的输出仅仅取决于当时的输入信号组合&#xff0c;而与电路过去的状态无关。 组合逻辑…

C#实现最短路径算法

创建点集 double r 200 * 500;double width 1920;double height 1080;int col (int)(r / width);int row (int)(r / height);List<(double, double)> list1 new List<(double, double)>();for (int i 0; i < row; i){var y i * height;if (y < r){va…

[web]-图片上传、文件包含-图片上传

题目内容提示&#xff1a;上传图片试试吧&#xff0c;注意统一时区问题 打开页面如图&#xff0c;源码没有过滤&#xff0c;随便输入&#xff0c;进入上传目录 根据链接可以看到是文件包含&#xff0c;可以利用编码读取源码&#xff0c;这里只列出有用页面的编码&#xff08;?…

数据结构:链表详解 (c++实现)

前言 对于数据结构的线性表&#xff0c;其元素在逻辑结构上都是序列关系&#xff0c;即数据元素之间有前驱和后继关系。 但在物理结构上有两种存储方式&#xff1a; 顺序存储结构&#xff1a; 使用此结构的线性表也叫 顺序表物理存储上是连续的&#xff0c;因此可以随机访问…

Redis 中Sorted Set 类型命令(命令语法、操作演示、命令返回值、时间复杂度、注意事项)

Sorted Set 类型 文章目录 Sorted Set 类型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

秋招Java后端开发冲刺——Mybatis使用总结

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目&#xff0c;它封装了 JDBC&#xff0c;使开发者只需要关注 SQL 语句本身&#xff0c;而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO&#xff08;Plain …

服务器数据恢复—2块硬盘离线且热备盘未完全激活的raid5数据恢复案例

服务器存储数据恢复环境&#xff1a; 北京某企业一台EMC FCAX-4存储上搭建一组由12块成员盘的raid5磁盘阵列&#xff0c;其中包括2块热备盘。 服务器存储故障&#xff1a; raid5阵列中两块硬盘离线&#xff0c;热备盘只有一块成功激活&#xff0c;raid瘫痪&#xff0c;上层LUN…

Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理

文章目录 滑动时间窗算法基本知识源码算法分析 漏桶算法令牌桶算法拦截器处理web请求 滑动时间窗算法 基本知识 限流算法最简单的实现就是使用一个计数器法。比如对于A接口来说&#xff0c;我要求一分钟之内访问量不能超过100&#xff0c;那么我们就可以这样来实现&#xff1…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时&#xff0c;Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

映美精黑白相机IFrameQueueBuffer转halcon的HObject

映美精黑白相机&#xff0c;用wpfhalcon开发取图 1.到官网下载&#xff0c;开发包 1sdk 2c开发例子 3c#开发例子 引入TIS.Imaging.ICImagingControl35.dll 3.ICImagingControl使用这个类控制相机 /// <summary> /// 相机控制 /// </summary> public ICImagingC…

《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》

MindNLP 原理 MindNLP 是一个自然语言处理&#xff08;NLP&#xff09;框架&#xff0c;用于处理和分析文本数据。 文本预处理&#xff1a;包括去除噪声、分词、词性标注、命名实体识别等步骤&#xff0c;使文本数据格式化并准备好进行进一步分析。 特征提取&#xff1a;将文…

LightRAG:高效构建和优化大型语言模型应用的 PyTorch 框架

一、前言 随着大语言模型 (LLM) 的蓬勃发展&#xff0c;检索增强生成 (RAG) 技术作为一种将 LLM 与外部知识库结合的有效途径&#xff0c;受到了越来越多的关注。 然而&#xff0c;构建 LLM 应用的真正挑战在于开发者需要根据具体需求进行高度定制化&#xff0c;而现有的 RAG …