赞
踩
软件: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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。