当前位置:   article > 正文

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

stm32步进电机按键程序

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

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

实验效果:

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

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

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

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

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

直接上代码:

主函数:

  1. int main(void)
  2. {
  3. Stm32_Clock_Init(336,8,2,7);//ÉèÖÃʱÖÓ,168Mhz
  4. delay_init(168); //ÑÓʱ³õʼ»¯
  5. uart_init(84,115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
  6. usmart_dev.init(84); //³õʼ»¯USMART
  7. LED_Init(); //³õʼ»¯LED
  8. KEY_Init(); //°´¼ü³õʼ»¯
  9. Driver_Init(); //Çý¶¯Æ÷³õʼ»¯
  10. TIM8_OPM_RCR_Init(999,168-1); //1MHz¼ÆÊýƵÂÊ µ¥Âö³å+Öظ´¼ÆÊýģʽ
  11. while(1)
  12. {
  13. u8 i;
  14. u8 keyval;
  15. keyval=KEY_Scan(0);
  16. if(keyval==KEY3_PRES)
  17. {
  18. DRIVER_OE1=0;
  19. DRIVER_OE2=1;
  20. DRIVER_OE3=1;
  21. DRIVER_OE4=1;
  22. }
  23. //
  24. if(keyval==KEY4_PRES)
  25. {
  26. DRIVER_OE1=1;
  27. DRIVER_OE2=0;
  28. DRIVER_OE3=1;
  29. DRIVER_OE4=1;
  30. }
  31. if(keyval==KEY5_PRES)
  32. {
  33. DRIVER_OE1=1;
  34. DRIVER_OE2=1;
  35. DRIVER_OE3=0;
  36. DRIVER_OE4=1;
  37. }
  38. if(keyval==KEY6_PRES)
  39. {
  40. DRIVER_OE1=1;
  41. DRIVER_OE2=1;
  42. DRIVER_OE3=1;
  43. DRIVER_OE4=0;
  44. }
  45. if(keyval==WKUP_PRES)
  46. {
  47. Locate_Abs(0,500);//°´ÏÂWKUP£¬»ØÁãµã
  48. }else if(keyval==KEY0_PRES)
  49. {
  50. Locate_Rle(200,500,CW);//°´ÏÂKEY0£¬ÒÔ500HzµÄƵÂÊ Ë³Ê±Õë·¢200Âö³å
  51. }else if(keyval==KEY1_PRES)
  52. {
  53. Locate_Rle(400,500,CCW);//°´ÏÂKEY1£¬ÒÔ500HzµÄƵÂÊ ÄæʱÕë·¢400Âö³å
  54. }
  55. delay_ms(10);
  56. i++;
  57. if(i==50)
  58. {
  59. i=0;
  60. LED1=!LED1;
  61. }
  62. }
  63. }

按键define:

  1. #define KEY6 PFin(5) //PF5 ZJ
  2. #define KEY5 PFin(4) //PF4 ZJ
  3. #define KEY4 PFin(3) //PF3 ZJ
  4. #define KEY3 PFin(2) //PF2 ZJ
  5. #define KEY0 PEin(4) //PE4
  6. #define KEY1 PEin(3) //PE3
  7. #define KEY2 PEin(2) //P32
  8. #define WK_UP PAin(0) //PA0
  9. ///
  10. #define KEY3_PRES 5 //KEY0°´ÏÂ ZJ
  11. #define KEY4_PRES 6 //KEY1°´ÏÂ ZJ
  12. #define KEY5_PRES 7 //KEY2°´ÏÂ ZJ
  13. #define KEY6_PRES 8 //KEY_UP°´ÏÂ(¼´WK_UP) ZJ
  14. //#define KEY7_PRES 5 //KEY0°´ÏÂ ZJ
  15. //#define KEY8_PRES 6 //KEY1°´ÏÂ ZJ
  16. #define KEY0_PRES 1 //KEY0°´ÏÂ
  17. #define KEY1_PRES 2 //KEY1°´ÏÂ
  18. #define KEY2_PRES 3 //KEY2°´ÏÂ
  19. #define WKUP_PRES 4 //KEY_UP°´ÏÂ(¼´WK_UP)
  20. void KEY_Init(void); //IO³õʼ»¯
  21. u8 KEY_Scan(u8); //°´¼üɨÃ躯Êý

IO口define:

  1. #define DRIVER_DIR PFout(15) // Ðýת·½Ïò
  2. //#define DRIVER_OE1_H GPIO_SetBits(GPIOE,PIN6);
  3. //#define DRIVER_OE1_L GPIO_ResetBits(GPIOE,PIN6);
  4. //#define DRIVER_OE2_H GPIO_SetBits(GPIOE,PIN1);
  5. //#define DRIVER_OE2_L GPIO_ResetBits(GPIOE,PIN2);
  6. #define DRIVER_OE1 PFout(6) //zj
  7. #define DRIVER_OE2 PFout(1) //zj
  8. #define DRIVER_OE3 PFout(14) //zj
  9. #define DRIVER_OE4 PFout(13) //zj
  10. //#define DRIVER_OE PEout(6) // ʹÄܽŠµÍµçƽÓÐЧ
  11. #define RCR_VAL 255 //ÿ¼ÆÊý£¨RCR_VAL+1£©´Î£¬ÖжÏÒ»´Î£¬Õâ¸öÖµ£¨0~255£©ÉèÖôóһЩ¿ÉÒÔ½µµÍÖжÏƵÂÊ
  12. typedef enum
  13. {
  14. CW = 1,//¸ßµçƽ˳ʱÕë
  15. CCW = 0,//µÍµçƽÄæʱÕë
  16. }DIR_Type;//ÔËÐз½Ïò
  17. extern long target_pos;//ÓзûºÅ·½Ïò
  18. extern long current_pos;//ÓзûºÅ·½Ïò
  19. void Driver_Init(void);//Çý¶¯Æ÷³õʼ»¯
  20. void TIM8_OPM_RCR_Init(u16 arr,u16 psc);//TIM8_CH2 µ¥Âö³åÊä³ö+Öظ´¼ÆÊý¹¦Äܳõʼ»¯
  21. void TIM8_Startup(u32 frequency); //Æô¶¯¶¨Ê±Æ÷8
  22. void Locate_Rle(long num,u32 frequency,DIR_Type dir); //Ïà¶Ô¶¨Î»º¯Êý
  23. void Locate_Abs(long num,u32 frequency);//¾ø¶Ô¶¨Î»º¯Êý
  24. #endif

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/522591
推荐阅读
相关标签
  

闽ICP备14008679号