步进电机控制和步进电机原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36305492/article/details/78585449

今天调试了一个惠斯通的步进电机,原来调试过一款欧柯达的42步进电机, 本以为两个电机差不多,驱动器给的一样,结果发现死活不能动。用自己百度了一下,做一个笔记

例如这个电机 42BYGH403AA

 42 为机座尺寸, BYGH是指混合式步进电机(混合式步进电机是综合了永磁式和反应式的优点而设计的步进电机。它又分为两相、三相和五相,两相步进角一般为1.8度 ,三相步进角 一 般为 1.2度 ,而五相步进角 一 般为0.72度。
混合式步进电机的转子本身具有磁性,因此在同样的定子电流下产生的转矩要大于反应式步进电机,且其步距角通常也较小,因此,经济型数控机床一般需用混合式步进电机驱动。但混合转子的结构较复杂、转子惯量大,其快速性要低于反应式步进电机)

这个图像就能看出电机的具体的尺寸标准 绕组是星型步距角1.8度,H就是混合式,法兰是异性法兰 

  步进电机还有带行星减速的尺寸,在最后我们可以看到一个

比如这个

OK42STH47-168AG3.71

ok:是产品名,欧柯达42是尺寸其他的看不懂,3.71就是减速比


最后一句话直接买电机对应的驱动器,这个市场根本没有统一的标准,杂乱无章,还是直接买一套直接用好,这一会调好了,一般工频10k左右吧程序发给大家参考一下

#include "sydj.h"
#include "gpio.h"
#include "stmflash.h"
#include "usart.h"


 u8 DJ_Buffer_temp[4];
 u8 datatemp[4];
#define FLASH_SAVE_ADDR  0X08070000 	//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)

int32_t DJ_WEIZHI ;
u8 End_flage=0;
u8 Dj_turn=0;
u32 Dj_step=0;
u16 Dj_speed=0;
u16 Dj_set=0;

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
void TIM1_Init(u16 arr ,u16 psc)
{

	

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能

	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
	
	TIM_Cmd(TIM1, ENABLE); 
	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQn;  //TIM7中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

 //使能TIMx					
}

void Sydj_move(u8 turn, u16 speed,u32 steep)
{
	  
	  Dj_step=steep;
	  Dj_speed=speed;
    Dj_set=speed+500;
   	Dj_turn=turn;
		SYDJ_DR=turn;
	  TIM1_Init(71,speed);
		while(End_flage==0);

}


void TIM1_UP_IRQHandler()
{
	static u8 dj_flag=0;
	       u8 jiyi_flag=0;
	if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
	{
		dj_flag=~dj_flag;
	  if(dj_flag!=0)
		{
			SYDJ_DR=Dj_turn;
			SYDJ_PR=1;
		  
		}	
    else 
		{
			SYDJ_DR=Dj_turn;
			SYDJ_PR=0;
		}
		jiyi_flag++;
		Dj_step--;
//		if(jiyi_flag==50)
//		{
//			jiyi_flag=0;
//			 STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,4);
//			if(Dj_turn)
//			{
//			 DJ_WEIZHI=(int32_t)(datatemp[3]<<24|datatemp[2]<<16|datatemp[3]<<8|datatemp[0]);
//			  printf("%d\n",DJ_WEIZHI);
//				DJ_WEIZHI+=1;
//			}
//			else
//			{
//			 DJ_WEIZHI=(int32_t)(datatemp[3]<<24|datatemp[2]<<16|datatemp[3]<<8|datatemp[0]);
//			 DJ_WEIZHI-=1;
//			
//			}
//			DJ_Buffer_temp[3]=DJ_WEIZHI>>24;
//			DJ_Buffer_temp[2]=DJ_WEIZHI>>16;
//			DJ_Buffer_temp[1]=DJ_WEIZHI>>8;
//			DJ_Buffer_temp[0]=DJ_WEIZHI;			
//			 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)DJ_Buffer_temp,4);
//			 
//		}
	if(Dj_step>450)
	{
    if(Dj_speed>150)
 		{
	    Dj_speed=Dj_speed-1;
			printf("%d\n",Dj_speed);
			TIM1->PSC=Dj_speed;
			
		}
		else 
			TIM1->PSC=150;	
	 }
    else if(Dj_step<=450)
		{  Dj_speed+=1;
				printf("%d\n",Dj_speed);
			TIM1->PSC=Dj_speed;
			if(Dj_step==0)//
			{
				TIM_Cmd(TIM1,DISABLE );
				End_flage=1;
			}
		}			
		
			TIM_ClearITPendingBit(TIM1, TIM_IT_Update);	
	}
	
}






猜你喜欢

转载自blog.csdn.net/qq_36305492/article/details/78585449