STM32控制四个步进电机(包含运行程序)

软件:keil 5(其他版本也ok)

硬件:步进电机(我用的是42)×4;单片机开发板(本例使用STM32F407ZGT6);电机驱动器×4;外部按键;杜邦线。

实验效果:

四个步进电机对应四个外部按键,按下对应的外部按键选择需要控制的电机。

在开发板上按下KEYO,步进电机以500HZ的频率顺时针转动200个脉冲的角度(相对定位);

按下KEY1,步进电机以500H的频率逆时针转动400个脉冲的角度(相对定位);

按下KEY UP,步进电机以500HZ的频率回到绝对原点(绝对定位);

同时DS1以1s的周期闪烁,提示代码正在运行。

直接上代码:

主函数:

int main(void)
{    

	Stm32_Clock_Init(336,8,2,7);//ÉèÖÃʱÖÓ,168Mhz 
	delay_init(168);			//ÑÓʱ³õʼ»¯  
	uart_init(84,115200);		//³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200 
	usmart_dev.init(84); 		//³õʼ»¯USMART		
	LED_Init();					//³õʼ»¯LED
	KEY_Init();					//°´¼ü³õʼ»¯
	Driver_Init();				//Çý¶¯Æ÷³õʼ»¯
	TIM8_OPM_RCR_Init(999,168-1); //1MHz¼ÆÊýƵÂÊ  µ¥Âö³å+Öظ´¼ÆÊýģʽ
	while(1) 
	{	
			u8 i;
	u8 keyval;
		
		keyval=KEY_Scan(0);
		
		if(keyval==KEY3_PRES)       
		{
			DRIVER_OE1=0;
			DRIVER_OE2=1;
			DRIVER_OE3=1;
			DRIVER_OE4=1;
		}
//		
		if(keyval==KEY4_PRES)       
		{
			DRIVER_OE1=1;
			DRIVER_OE2=0;
			DRIVER_OE3=1;
			DRIVER_OE4=1;
		}
			
			
			
		
		
			if(keyval==KEY5_PRES)       
		{
			DRIVER_OE1=1;
			DRIVER_OE2=1;
			DRIVER_OE3=0;
			DRIVER_OE4=1;
		}
		
		
				if(keyval==KEY6_PRES)       
		{
			DRIVER_OE1=1;
			DRIVER_OE2=1;
			DRIVER_OE3=1;
			DRIVER_OE4=0;
		}
		
		

		
		
		if(keyval==WKUP_PRES)
		{
			Locate_Abs(0,500);//°´ÏÂWKUP£¬»ØÁãµã
		}else if(keyval==KEY0_PRES)
		{
			Locate_Rle(200,500,CW);//°´ÏÂKEY0£¬ÒÔ500HzµÄƵÂÊ Ë³Ê±Õë·¢200Âö³å
		}else if(keyval==KEY1_PRES)
		{
			Locate_Rle(400,500,CCW);//°´ÏÂKEY1£¬ÒÔ500HzµÄƵÂÊ ÄæʱÕë·¢400Âö³å
		}			
		delay_ms(10);
		i++;
		if(i==50)	
		{	
			i=0;
			LED1=!LED1;
		}				
	}
}

按键define:

#define KEY6 		PFin(5)		//PF5      ZJ
#define KEY5		PFin(4)   //PF4  		 ZJ
#define KEY4 		PFin(3)		//PF3      ZJ
#define KEY3 		PFin(2)		//PF2      ZJ


#define KEY0 		PEin(4)   	//PE4
#define KEY1 		PEin(3)		//PE3 
#define KEY2 		PEin(2)		//P32
#define WK_UP 	PAin(0)		//PA0 

///

#define KEY3_PRES 	5	//KEY0°´ÏÂ     ZJ
#define KEY4_PRES	6	//KEY1°´ÏÂ        ZJ
#define KEY5_PRES	7	//KEY2°´ÏÂ       ZJ
#define KEY6_PRES   8	//KEY_UP°´ÏÂ(¼´WK_UP)    ZJ
//#define KEY7_PRES 	5	//KEY0°´ÏÂ     ZJ
//#define KEY8_PRES	6	//KEY1°´ÏÂ        ZJ



#define KEY0_PRES 	1	//KEY0°´ÏÂ
#define KEY1_PRES	2	//KEY1°´ÏÂ
#define KEY2_PRES	3	//KEY2°´ÏÂ
#define WKUP_PRES   4	//KEY_UP°´ÏÂ(¼´WK_UP)

void KEY_Init(void);	//IO³õʼ»¯
u8 KEY_Scan(u8);  		//°´¼üɨÃ躯Êý				

IO口define:

#define DRIVER_DIR   PFout(15) // Ðýת·½Ïò


//#define 		DRIVER_OE1_H  GPIO_SetBits(GPIOE,PIN6);
//#define 		DRIVER_OE1_L  GPIO_ResetBits(GPIOE,PIN6);
//#define 		DRIVER_OE2_H  GPIO_SetBits(GPIOE,PIN1);
//#define 		DRIVER_OE2_L  GPIO_ResetBits(GPIOE,PIN2);

#define 		DRIVER_OE1 PFout(6)               //zj
#define 		DRIVER_OE2 PFout(1)               //zj
#define 		DRIVER_OE3 PFout(14)               //zj
#define 		DRIVER_OE4 PFout(13)               //zj
//#define DRIVER_OE    PEout(6) // ʹÄܽŠµÍµçƽÓÐЧ 

#define RCR_VAL    255  //ÿ¼ÆÊý£¨RCR_VAL+1£©´Î£¬ÖжÏÒ»´Î£¬Õâ¸öÖµ£¨0~255£©ÉèÖôóһЩ¿ÉÒÔ½µµÍÖжÏƵÂÊ

typedef enum
{
	CW = 1,//¸ßµçƽ˳ʱÕë
	CCW = 0,//µÍµçƽÄæʱÕë
}DIR_Type;//ÔËÐз½Ïò

extern long target_pos;//ÓзûºÅ·½Ïò
extern long current_pos;//ÓзûºÅ·½Ïò

void Driver_Init(void);//Çý¶¯Æ÷³õʼ»¯
void TIM8_OPM_RCR_Init(u16 arr,u16 psc);//TIM8_CH2 µ¥Âö³åÊä³ö+Öظ´¼ÆÊý¹¦Äܳõʼ»¯
void TIM8_Startup(u32 frequency);   //Æô¶¯¶¨Ê±Æ÷8
void Locate_Rle(long num,u32 frequency,DIR_Type dir); //Ïà¶Ô¶¨Î»º¯Êý
void Locate_Abs(long num,u32 frequency);//¾ø¶Ô¶¨Î»º¯Êý

#endif

电机对应外部按键key3,key4,key5,key6。

需要几个电机大家可以对应着代码改动,我这边实现了两个的和四个的。

代码包我会上传供大家使用,感谢!

链接:https://pan.baidu.com/s/1y08H-W0AWwxMo8IgdEuRKg?pwd=cgr7 
提取码:cgr7

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值