stm32通过输出脉冲个数精确控制电机旋转角度

一、硬件准备

57步进电机在市面上还是挺常见的,每一款都大同小异。而市面上最为常用的为两相四线制的步进电机。两相即AB相,四线即步进电机引出来的四根线。

HTS-884A步进电机驱动器 

 

步进电机实际上是按着一定的频率,分别去给线圈上电,最后使其转起来,但我们有了驱动器就不需要考虑这么多了,里面已经帮我们把所需的电路集成好了,这里我们只需要会连线就行了。

 

其中还有的VCC接购买的步进电机所需的电压值

其中ENA,DIR,PUL的接线有两种,一种是共阳,另一种是共阴接法,共阳即将ENA+,DIR+,PUL+都接3.3V的口,而共阴接法则由上表格所示。

ENA为使电机脱机状态控制端子
若按上述接线,当ENA+赋予高电平时,电机处于脱机状态,手可以转动转轴,电流撤去。故一般工作情况,ENA+要赋予低电平。

DIR为控制步进电机正反转的控制端子
按上述接线,当DIR+赋予低电平时,默认为反转,DIR+赋予高电平时,默认为正转,可以通过控制这个端子去控制步进电机按照指定方向运作

PUL为脉冲控制端子
PUL为控制步进电机最为关键的端子。而在介绍PUL前,还需要介绍一个步进电机的基础知识,即细分和步距角。

步距角:输入一个电脉冲信号,步进电动机转子相应的角位移。
即说明,给一个PWM波,步进电机转子转过的角度。对于1.8°步距角的步进电机来说,转一圈则需要360/1.8=200个脉冲

步进电机细分技术:细分通俗易懂的说就是将上面所说的需要200个脉冲转一圈变成需要更多的脉冲才能转一圈了,如果是二细分,则为400个脉冲转一圈。

其中脉冲信号我们从PUL+中输入,而细分,则由驱动器上的说明设置

二、代码部分

main.c

#include "system.h"
#include "led.h"
#include "SysTIck.h"
#include "usart.h"
#include "key.h"
#include "motor1.h"


int main()
{
	
	//u16 period = 500;
	
	
	int j;
	SysTick_Init(72);//ϵͳ³õʼ»¯£¬Ñ¡ÔñʱÖÓÀ´Ô´£¬ÏµÍ³Ê±ÖÓԭΪ72£¬µ÷ÓÃÑÓʱº¯Êý
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	LED_Init();
	KEY_Init();
	//MY_EXIT_Init();
	USART1_Init(9600);
	//MOTOR_Init();
	//MOTOR_PWM_Init(period,12-1);//per,ÖØ×°Öµ£¬¿ØÖÆÖÜÆÚ£¬12-1¿ØÖÆƵÂÊ
	//TIM_SetCompare2(TIM3,period/2);//Õ¼¿Õ±ÈÒ»¶¨£¬£¨1/2£©µÄÖØ×°ÖµÊä³ö·½²¨
	Motor_Pin_Init();

	
	
	while(1)
	{
		j++;
		if(j%20==0)
		{
			led2=!led2;
		}
		if (KEY_SCAN(0) == KEY_UP)
		{
			led1=0;
			delay_ms(1000);
			delay_ms(1000);
			led1=1;
			MOTOR_DIR_CCW;//¸Ä±äDIR¸ßµÍµçƽ£¬¼´¸Ä±äתÏò
			Step_90_Degrees();
			
		}
		if (KEY_SCAN(0) == KEY_DOWN)
		{
			led3=0;
			delay_ms(1000);
			delay_ms(1000);
			led3=1;
			MOTOR_DIR_CW;
			Step_90_Degrees();
		}
  }
}

motor1.c

#include "motor1.h"
#include "led.h"
int i = 0;

void Motor_Pin_Init(){
	
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(MOTOR_DIR_CLK | MOTOR_PUL_CLK | MOTOR_ENA_CLK, ENABLE);
	
	/*PE5¶ÔÓ¦DIR,ĬÈÏ˳ʱÕëÐýת*/
		
		GPIO_InitStructure.GPIO_Pin=MOTOR_DIR_PIN;  
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	 //ÉèÖÃΪ¸´ÓÃÍÆÍìÊä³ö
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	 
		GPIO_Init(MOTOR_DIR_PORT,&GPIO_InitStructure); 	  
		GPIO_ResetBits(MOTOR_DIR_PORT,MOTOR_DIR_PIN);
	
		/*PE6¶ÔÓ¦ENA,ĬÈÏΪ¸ßµçƽ£¬²»»áʹÄÜ*/
		GPIO_InitStructure.GPIO_Pin=MOTOR_ENA_PIN;  
		GPIO_Init(MOTOR_ENA_PORT,&GPIO_InitStructure); 	  
		GPIO_ResetBits(MOTOR_ENA_PORT,MOTOR_ENA_PIN); 


		GPIO_InitStructure.GPIO_Pin = MOTOR_PUL_PIN;
		GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;	 //ÉèÖÃΪ¸´ÓÃÍÆÍìÊä³ö
		GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	
    GPIO_Init(MOTOR_PUL_PORT, &GPIO_InitStructure);
    GPIO_ResetBits(MOTOR_PUL_PORT, MOTOR_PUL_PIN);

}
void Delay(__IO uint32_t nCount){
	for (; nCount != 0; nCount--)
		;
};

void Step_90_Degrees(){
	// NC = 1600, 800 toggles means 90 degree motor rotation
	for (i=0; i < 3200; i++)
	{	
		MOTOR_PUL_Toggle;//
		// The delay time determines the motor speed
		Delay(0xfff);
		
	}
	i=0;
}

motor1.h

#ifndef __motor1_H
#define __motor1_H

#include "system.h"


#define MOTOR_DIR_PORT      GPIOE
#define MOTOR_DIR_PIN       GPIO_Pin_5//DIR+¶ÔÓ¦PE5
#define MOTOR_DIR_CLK       RCC_APB2Periph_GPIOE

#define MOTOR_PUL_PORT      GPIOA
#define MOTOR_PUL_PIN       GPIO_Pin_7//PUL+¶ÔÓ¦PA7
#define MOTOR_PUL_CLK       RCC_APB2Periph_GPIOA

#define MOTOR_ENA_PORT      GPIOE
#define MOTOR_ENA_PIN       GPIO_Pin_4//ENA+¶ÔÓ¦PE4
#define MOTOR_ENA_CLK       RCC_APB2Periph_GPIOE

#define digitalHi(p,i) 			{p->BSRR=i;}
#define digitalLo(p,i) 			{p->BRR=i;}
#define digitalToggle(p,i) 	{p->ODR ^= i;}

#define MOTOR_ENA_Toggle    digitalToggle(MOTOR_ENA_PORT, MOTOR_ENA_PIN)
#define MOTOR_ON 	    			digitalHi(MOTOR_ENA_PORT, MOTOR_ENA_PIN)
#define MOTOR_OFF	    			digitalLo(MOTOR_ENA_PORT, MOTOR_ENA_PIN)

#define MOTOR_PUL_Toggle    digitalToggle(MOTOR_PUL_PORT, MOTOR_PUL_PIN)//ʹ¸ÃÒý½Å¸ßµÍµçƿת»»Ò»´Î£¬¼´Êä³öÒ»¸öÂö³å
#define MOTOR_PUL_ON 	    	digitalHi(MOTOR_PUL_PORT, MOTOR_PUL_PIN)
#define MOTOR_PUL_OFF 	    digitalLo(MOTOR_PUL_PORT, MOTOR_PUL_PIN)

#define MOTOR_DIR_Toggle    digitalToggle(MOTOR_DIR_PORT, MOTOR_DIR_PIN)
#define MOTOR_DIR_CCW    		digitalHi(MOTOR_DIR_PORT, MOTOR_DIR_PIN)
#define MOTOR_DIR_CW   			digitalLo(MOTOR_DIR_PORT, MOTOR_DIR_PIN)

void Motor_Pin_Init(void);
void Delay(__IO uint32_t nCount);

void Step_90_Degrees(void);
#endif

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要实现对步进电机精确角度控制,可以采用以下几个关键步骤: 1. 选择适当的步进电机型号:首先需要了解步进电机的特性,包括步进角、细分步数、转速范围等。根据具体需求选择合适的型号,确保其满足所需的角度精度要求。 2. 配置驱动电路:为步进电机提供稳定的电源和驱动电路,常用的驱动方式包括双H桥驱动和步进电机驱动芯片。根据具体电机型号和特性,选择合适的驱动方式。 3. 设置步进电机驱动方式:根据步进电机的工作方式,选择适当的驱动模式,包括全步进模式和微步进模式。微步进模式可以提供更高的角度精度,但同时也会增加控制复杂度。 4. 编写控制程序:使用STM32系列单片机进行步进电机控制。通过编写控制程序来控制电机的步进角、方向和转速等参数。重点在于准确计算每一次步进的角度和实现精确角度控制。 5. 使用闭环控制:为了进一步提高精度和稳定性,可以考虑引入闭环控制,使用编码器或其他传感器来反馈电机的实际位置,实时调整控制参数,使得电机能够更精确地停在目标角度。 总结来说,针对步进电机精确角度控制,需要选择合适的电机型号、配置适当的驱动电路、设置合理的驱动方式,并使用 STM32 单片机编写控制程序,若需要更高的精度和稳定性,还可使用闭环控制。 ### 回答2: 要实现STM32控制步进电机精确角度,一般需要遵循以下几个步骤: 1. 确定步进电机的工作模式:步进电机控制方式有全步进和半步进两种。全步进模式下,每个步进脉冲产生一个角度位移,而半步进模式下,每个步进脉冲产生的位移较小。根据实际需求选择电机的工作模式。 2. 配置GPIO和定时器:利用STM32的GPIO和定时器模块来产生步进电机控制信号。通过GPIO配置引脚输出电平,定时器产生脉冲频率,从而控制步进电机转动。 3. 编写控制程序:在STM32控制程序中,通过控制GPIO引脚的输出状态来控制步进电机转动方向和步进脉冲的产生。可以利用定时器中断进行脉冲信号的周期性产生,从而实现精确控制。 4. 确定步进角度:根据步进电机角度和步数的关系,计算出每个步进脉冲对应的角度值。根据需要的角度,计算出所需的步数,控制步进电机按照给定的步数旋转。 5. 编写驱动程序:根据步进电机转动特性,编写对应的驱动程序。可以通过改变脉冲频率、改变脉冲个数或改变转动方向等方式来控制步进电机转动到目标角度。 综上所述,通过STM32的GPIO和定时器模块,配合编写的控制程序和驱动程序,可以实现对步进电机精确角度控制。根据需求确定步进电机的工作模式,在控制程序中计算出所需步数,通过驱动程序来控制电机转动,从而实现精确角度控制。 ### 回答3: 要控制步进电机精确角度,可以通过STM32控制器与步进电机驱动模块的组合实现。具体步骤如下: 1. 确定步进电机控制模式:步进电机通常采用开环控制或闭环控制。开环控制简单,闭环控制精确。根据具体需求选择合适的控制模式。 2. 连接STM32步进电机驱动模块:将STM32输出引脚与步进电机驱动模块的控制接口相连。通常,驱动模块包括使能端、方向端和脉冲端。 3. 编写STM32的软件程序:使用STM32的开发工具,如Keil或STM32CubeIDE,编写控制程序。程序需要根据步进电机的特性和工作模式来确定输出脉冲的频率和方向。 4. 控制步进电机步进角度:通过改变STM32输出脉冲的频率和方向,控制步进电机转动。根据步进电机角度分辨率和所需精度,确定输出脉冲的数量和频率。 5. 校准步进电机:根据实际应用需求,可能需要对步进电机进行校准。校准过程可以通过试运行和调整控制程序中的参数来实现,以确保步进电机角度精确控制。 总之,通过STM32控制器与步进电机驱动模块的组合,编写控制程序来控制输出脉冲的频率和方向,可以实现对步进电机精确控制角度的要求。此外,根据具体需求,还可以进行校准以提高控制精确度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值