首页 > 其他分享 >电机笔记

电机笔记

时间:2023-10-08 12:11:06浏览次数:40  
标签:HAL Pin PIN 电机 WritePin 笔记 STEP GPIO

目录


步进电机

什么是步进电机

步进电机是将电脉冲信号转变为角位移或者线位移的开环控制元步进电机件。
通过控制施加在电机线圈上的电脉冲顺序、频率和数量,可以实现对步进电机的转向、速度和旋转角度的控制。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,成为“步距角”。

步进电机距频特性

四相步进电机为例,所谓四相,是指电机内部有4对磁极,此外还有一个公共端(COM)接电源,另外的A、B、C、D是四相的接头。
而四相电机也可以向外引出六条线(两条COM共同接入VCC),也可以引出五条线,所以我们会看到有六线四相制五线四相制的步进电机。
如下图所示,A、B、C、D四相接头需接到单片机的IO口上,通过一定的规律改变四相接口的通电状态来控制电机的正反转动。

步进电机关键参数

  • 步距角
    例如,步距角 = 5.625°/64,表示施加每64个脉冲,步进电机就转动5.625度。
    旋转角度与脉冲个数的计算公式:pluse = (angle/5.625)*64
    转一圈所需脉冲数则为,360/5.625*64 = 4096

步进电机驱动方式

单四拍
这是最简单的步进电机驱动方式。这种方式,电机在每个瞬间只有一个线圈导通,消耗电力小,但在切换瞬间没有任何的电磁作用在转子上,容易造成振动,也容易因为惯性而失步。

双四拍
这种方式输出的转矩较大,且振动较少,切换过程中至少有一个线圈通电且作用于转子,所以比单四拍平稳,不易失步。

八拍
八拍则是综合以上两种驱动信号,使用单四拍和双四拍交替进行的方式,每传送一个励志信号,步进电机前进半个步距角。
其特点是分辨率高,运转更加平滑,也是最常用的驱动方式。

以下是这三种驱动方式的时序波形图

驱动例程代码

void MOTOR_CONTROLD(uint8_t direction) // 8拍驱动模式
{
	static uint8_t step = 0;
	if(1 == direction){
		if(0 == step) step = 8;
		step--;
	}
	if(0 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_RESET);
	}else if(1 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_RESET);
	}else if(2 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_RESET);
	}else if(3 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_RESET);
	}else if(4 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_RESET);
	}else if(5 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_SET);
	}else if(6 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_SET);
	}else if(7 == step){
		HAL_GPIO_WritePin(STEP_A_GPIO_Port, STEP_A_Pin, GPIO_PIN_SET);
		HAL_GPIO_WritePin(STEP_B_GPIO_Port, STEP_B_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_C_GPIO_Port, STEP_C_Pin, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(STEP_D_GPIO_Port, STEP_D_Pin, GPIO_PIN_SET);
	}
	if(0 == direction){
		step++; if(8 == step) step = 0;
	}
}

void Step_Motor_Start(uint16_t angle, uint8_t direction)
{
	int i = 0;
	int pulse = (int)((double)(angle / 5.625) * 64) ;
	for(i=0; i<pulse; i++){
        MOTOR_CONTROLD(direction);
    }
}

参考 https://b23.tv/jIr1iP5

标签:HAL,Pin,PIN,电机,WritePin,笔记,STEP,GPIO
From: https://www.cnblogs.com/mydodo/p/17748581.html

相关文章

  • 力扣刷题笔记-07 整数反转
    07整数反转狗看了都摇头的年纪,纯爱战士一败涂地。怎么反转temp用来保存个位数res用来保存当前结果123,取模运算,这样就可以获得最后一位。比如对123%10,得到temp=3.判断res是不是溢出(重点)如果没有溢出,res扩大十倍,再加上个位数,就相当于是反转了。res=res*10+temp;返回......
  • Programming abstractions in C阅读笔记:p166-p175
    《ProgrammingAbstractionsInC》学习第58天,p166-p175总结。一、技术总结1.斐波那契数列(FibonacciSequenc)(1)斐波那契数列来源斐波那契数列来自于《LiberAbaci》一书里兔子繁殖问题,相关资料很多,这里不赘述。(2)关于《LiberAbaci》一书《LiberAbaci》——Liber:abook......
  • go笔记
    1、Go语言中的变量、函数、常量名称的首字母也可以大写,如果首字母大写,则表示它可以被其它的包访问(类似于 Java 中的public);如果首字母小写,则表示它只能在本包中使用(类似于Java中private)。......
  • 研发三维GIS系统笔记/实现wgs84投影-001
    1.工作内容,改造引擎,支持wgs84投影改造原因:目前投影是墨卡托投影(与GoogleMap一致)目前的GIS系统是二维的采用这个坐标系是没有问题的但不支持wgs84瓦片数据以及高程数据,工作中很多数据是wgs84格式的,尤其很多三维GIS都是采用wgs84投影wgs84与mercator从数据上......
  • 《用户故事与敏捷方法》阅读笔记(一)
     本学期我们学习了软件需求这门课程,了解关于需求分析的相关知识,在软件开发过程中,软件需求是第一步,同时也是最重要的一步,当我们找到了用户真正的需求,在开发过程中会达到事半功倍的效果,阅读了《用户故事与敏捷方法》这本书,在这本书中详细的介绍了用户故事与敏捷开发方法的结合,找到......
  • 【刷题笔记】73. Set Matrix Zeroes
    题目Givenan *m* x *n* matrix.Ifanelementis 0,setitsentirerowandcolumnto 0.Doit in-place.Followup:AstraightforwardsolutionusingO(mn)spaceisprobablyabadidea.AsimpleimprovementusesO(m + n)space,butstillnotthebest......
  • Reinforcement Learning 学习笔记 1
    什么是强化学习(reinforcementlearning)?假设一个场景,一个智能体(agent)和环境(env)交互,智能体基于当前环境\(S_t\)每产生一个动作\(A_t\),环境便给它一个反馈,也被称为奖励(reward)\(R_{t+1}\),随后,智能体的状态变为\(S_{t+1}\).这样生成了一系列状态\(S_t,A_t,R_{t+1},S_{t+1......
  • Webserver学习笔记1
    一.为什么要做webserver的项目呢?串联了C++的相关基础知识,语⾔(C/C++全覆盖,可以扩展⾄C++11/17)+操作系统(含有⼤量的I/O系统调⽤及其封装,还有EPOLL等多路复⽤机制)+计算机⽹络(本身就是⼀个⽹络框架,对⽹络异常的处理)+数据库(注册中⼼的数据库语句、负载均衡等)。二.线程池线程数怎么......
  • 博客笔记目录导航
    博客笔记目录导航本篇作为博客中各科笔记的目录的导航技术类目录Python笔记目录MySQL笔记目录Docker笔记目录Linux笔记目录理论类目录计算机组成原理-哈工大刘宏伟老师操作系统-王道计算机网络-中科大郑烇分布式系统数据库系统概述-赵亮区块链-肖臻......
  • openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-M
    openGauss学习笔记-92openGauss数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOTSQL覆盖和限制MOT设计几乎能够覆盖SQL和未来特性集。例如,大多数支持标准的PostgresSQL,也支持常见的数据库特性,如存储过程、自定义函数等。下面介绍各种SQL覆盖和限制。92.1不支持......