找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10206|回复: 25
收起左侧

stm32控制步进电机源码 给定不同频率的脉冲、不同脉冲数达到两个电机走速不同

  [复制链接]
ID:195727 发表于 2017-5-2 20:16 | 显示全部楼层 |阅读模式
stm32控制步进电机源码:
0.png

stm32单片机源程序:
  1. /*******************************************************************************
  2. * 文件名          : main.c
  3. * 作者            : jackice
  4. * 时间                          :2013/8/10
  5. * 文件描述        : EN:PA.0 CLK:PA.1;DIR:PA.2
  6. ******两个电机同时走动,可以通过给定不同频率的脉冲、不同脉冲数达到两个电机走速不同,走的距离不同************
  7. **********134个脉冲 电机走1mm;1345个脉冲 电机走10mm;13450个脉冲电机走100mm;******
  8. ********************************************************************************/

  9. /* 头文件    ------------------------------------------------------------------*/

  10. #include "stm32f10x_lib.h"


  11. #define en0_0()   GPIO_ResetBits(GPIOA , GPIO_Pin_0)                  //宏定义
  12. #define en0_1()   GPIO_SetBits(GPIOA , GPIO_Pin_0)                               
  13. #define en1_0()   GPIO_ResetBits(GPIOA , GPIO_Pin_4)                  //宏定义
  14. #define en1_1()   GPIO_SetBits(GPIOA , GPIO_Pin_4)               
  15. #define clk0_0()  GPIO_ResetBits(GPIOA , GPIO_Pin_1)
  16. #define clk0_1()  GPIO_SetBits(GPIOA , GPIO_Pin_1)               
  17. #define clk1_0()  GPIO_ResetBits(GPIOA , GPIO_Pin_5)
  18. #define clk1_1()  GPIO_SetBits(GPIOA , GPIO_Pin_5)               
  19. #define dir0_0()  GPIO_ResetBits(GPIOA , GPIO_Pin_2)                  
  20. #define dir0_1()  GPIO_SetBits(GPIOA , GPIO_Pin_2)                               
  21. #define dir1_0()  GPIO_ResetBits(GPIOA , GPIO_Pin_3)                  
  22. #define dir1_1()  GPIO_SetBits(GPIOA , GPIO_Pin_3)                               



  23. /* 自定义同义关键字    --------------------------------------------------------*/

  24. /* 自定义参数宏        --------------------------------------------------------*/

  25. /* 自定义函数宏        --------------------------------------------------------*/

  26. /* 自定义变量          --------------------------------------------------------*/

  27. /* 自定义函数声明      --------------------------------------------------------*/

  28. void RCC_Configuration(void);
  29. void GPIO_Configuration(void);
  30. void delay(u32 i);
  31. void motor_contrl(u32 Xsteps,u8 Xdirection,u16 Xspeed,u32 Ysteps,u8 Ydirection,u16 Yspeed,u32 setps);



  32. /*******************************************************************************
  33. * 函数名                 : main
  34. * 函数描述       : 无
  35. * 输入参数       : 无
  36. * 输出结果       : 无
  37. * 返回值         : 无
  38. *******************************************************************************/

  39. int main(void)
  40. {
  41.    
  42.           /* 设置系统时钟 */
  43.           RCC_Configuration();                       

  44.           /* 设置GPIO端口 */
  45.           GPIO_Configuration();

  46.                 /*打开使能端*/
  47.           en0_1();
  48.                 en1_1();
  49.           while(1)
  50.                  {
  51.                                  motor_contrl(1,0,3,1,0,3,13450);
  52.                                 delay(100000);
  53.                                 motor_contrl(1,1,3,1,1,3,13450);       
  54.                                 delay(100000);
  55.                  }
  56. }



  57. /*******************************************************************************
  58. * 函数名        : RCC_Configuration
  59. * 函数描述  : 设置系统各部分时钟
  60. * 输入参数  : 无
  61. * 输出结果  : 无
  62. * 返回值    : 无
  63. *******************************************************************************/

  64. void RCC_Configuration(void)
  65. {
  66.         /* 定义枚举类型变量 HSEStartUpStatus */
  67.         ErrorStatus HSEStartUpStatus;

  68.           /* 复位系统时钟设置*/
  69.           RCC_DeInit();

  70.           /* 开启HSE*/
  71.           RCC_HSEConfig(RCC_HSE_ON);

  72.           /* 等待HSE起振并稳定*/
  73.           HSEStartUpStatus = RCC_WaitForHSEStartUp();
  74.        
  75.         /* 判断HSE起是否振成功,是则进入if()内部 */
  76.           if(HSEStartUpStatus == SUCCESS)
  77.           {
  78.             /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
  79.             RCC_HCLKConfig(RCC_SYSCLK_Div1);
  80.   
  81.             /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
  82.             RCC_PCLK2Config(RCC_HCLK_Div1);

  83.             /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
  84.             RCC_PCLK1Config(RCC_HCLK_Div2);

  85.             /* 设置FLASH延时周期数为2 */
  86.             FLASH_SetLatency(FLASH_Latency_2);
  87.             /* 使能FLASH预取缓存 */
  88.             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  89.             /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
  90.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  91.             /* 使能PLL */
  92.             RCC_PLLCmd(ENABLE);

  93.             /* 等待PLL输出稳定 */
  94.             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

  95.             /* 选择SYSCLK时钟源为PLL */
  96.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  97.             /* 等待PLL成为SYSCLK时钟源 */
  98.             while(RCC_GetSYSCLKSource() != 0x08);
  99.           }
  100.    
  101.           /* 打开APB2总线上的GPIOA时钟*/
  102.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  103. }


  104. /*******************************************************************************
  105. * 函数名                  : GPIO_Configuration
  106. * 函数描述            : 设置各GPIO端口功能
  107. * 输入参数      : 无
  108. * 输出结果      : 无
  109. * 返回值        : 无
  110. *******************************************************************************/

  111. void GPIO_Configuration(void)
  112. {
  113.           GPIO_InitTypeDef GPIO_InitStructure;

  114.           /* 设置PA4,PA5,PA6,PA7口为推挽输出,最大翻转频率为50MHz*/
  115.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  116.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  117.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  118.           GPIO_Init(GPIOA , &GPIO_InitStructure);   
  119. }


  120. /*******************************************************************************
  121. * 函数名                  : delay
  122. * 函数描述            : 简单延时
  123. * 输入参数      : i
  124. * 输出结果      : 无
  125. * 返回值        : 无
  126. *******************************************************************************/

  127. void delay(u32 k)
  128. {
  129.         u32 j,i;
  130.         for(i=k;i>0;i--)
  131.         for(j=300;j>0;j--);
  132. }   

  133. /*******************************************************************************
  134. * 函数名                    : motor_contrl
  135. * 函数描述            : 电机控制,X和Y方向
  136. * 输入参数      : Xsteps,Xdirection,Xspeed,Ysteps,Ydirection,Yspeed,u32 steps
  137. * 输出结果      : 无
  138. * 返回值        : 无
  139. *******************************************************************************/
  140. void motor_contrl(u32 Xsteps,u8 Xdirection,u16 Xspeed,u32 Ysteps,u8 Ydirection,u16 Yspeed,u32 steps)
  141. {
  142.     u32 step,Xstep,Ystep;
  143.           if(Xdirection==1)    //判断向左还是向右
  144.                 {
  145.         dir0_1();        //向右   
  146.     }
  147.                 else
  148.                 {
  149.         dir0_0();        //向左
  150.     }
  151.                   if(Ydirection==1)    //判断向上还是向下
  152.                 {
  153.         dir1_1();        //向上
  154.     }
  155.                 else
  156.                 {
  157.                                 dir1_0();        //向下
  158.     }
  159.                
  160.         for(step=steps;step>0;step--)       
  161.                 {
  162.                                 for(Xstep=Xsteps;Xstep>0;Xstep--)    //给X轴电机脉冲数,控制X轴电机走的距离
  163.                                  {
  164.                                                                  clk0_0();
  165.                                                                  delay(Xspeed);             //给脉冲频率,控制电机转速,频率越高速度越快,频率越低速度越慢
  166.                                                                  clk0_1();
  167.                                                                  delay(Xspeed);          
  168.                                                         for(Ystep=Ysteps;Ystep>0;Ystep--)  //给Y轴电机脉冲数,控制Y轴电机走的距离
  169.                                                                 {
  170.                                                                                  clk1_0();
  171.                                                                                  delay(Yspeed);         //给脉冲频率,控制电机转速,频率越高速度越快,频率越低速度越慢
  172.                                                                                  clk1_1();
  173.                                                                                  delay(Yspeed);
  174.                                                                 }   

  175. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整源码下载:
dianji1.rar (391.01 KB, 下载次数: 256)

评分

参与人数 1黑币 +5 收起 理由
huyin + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:164719 发表于 2017-5-28 17:29 | 显示全部楼层
不错 下载学习学习
回复

使用道具 举报

ID:163679 发表于 2017-7-3 15:28 | 显示全部楼层
没有黑币怎么办?有好人分享吗?
回复

使用道具 举报

ID:193719 发表于 2017-8-12 05:39 | 显示全部楼层
谢谢  这对电赛很有帮助
回复

使用道具 举报

ID:193324 发表于 2017-10-11 17:44 | 显示全部楼层
正好需要这个。 最近一直在找控制步进电机的程序。
回复

使用道具 举报

ID:252823 发表于 2017-11-23 20:50 | 显示全部楼层
正需要这个例程  下载下来研究下
回复

使用道具 举报

ID:229036 发表于 2018-1-23 13:49 | 显示全部楼层
没有黑币怎么办?有好人分享吗?
回复

使用道具 举报

ID:279769 发表于 2018-2-25 20:14 | 显示全部楼层
下载学习,谢谢分享!
回复

使用道具 举报

ID:35312 发表于 2018-3-2 19:36 | 显示全部楼层
非常不错
回复

使用道具 举报

ID:35312 发表于 2018-3-2 19:37 | 显示全部楼层
正在学习
回复

使用道具 举报

ID:294631 发表于 2018-3-20 17:49 | 显示全部楼层
HDX 好东西谢谢分享
回复

使用道具 举报

ID:294631 发表于 2018-3-20 17:50 | 显示全部楼层
没有黑币怎么办?有好人分享吗?
回复

使用道具 举报

ID:289956 发表于 2018-3-22 17:05 | 显示全部楼层
在学习控制步进电机,谢谢分享!收下了。
回复

使用道具 举报

ID:296441 发表于 2018-3-24 17:51 | 显示全部楼层

下载学习,谢谢分享!
回复

使用道具 举报

ID:296659 发表于 2018-3-25 11:54 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:243748 发表于 2018-4-6 12:33 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:310610 发表于 2018-4-18 09:14 | 显示全部楼层
下载学习,谢谢分享!
回复

使用道具 举报

ID:185372 发表于 2018-6-20 13:22 | 显示全部楼层
步进电机是老大难啊.参考下,谢谢
回复

使用道具 举报

ID:340339 发表于 2018-6-25 23:36 | 显示全部楼层
感谢楼主分享,好好学习一下
回复

使用道具 举报

ID:384489 发表于 2018-8-9 11:55 | 显示全部楼层
查询了一些资料,云里雾里的,学习一下。
回复

使用道具 举报

ID:228731 发表于 2018-8-9 14:52 | 显示全部楼层
真好在研究这块,谢谢分享!
回复

使用道具 举报

ID:384759 发表于 2018-8-24 23:38 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:209739 发表于 2018-9-6 21:56 | 显示全部楼层
谢谢楼主无私奉献
回复

使用道具 举报

ID:138247 发表于 2019-3-27 20:31 | 显示全部楼层

谢谢楼主分享。。。。。。。。。
回复

使用道具 举报

ID:316613 发表于 2019-10-10 16:34 | 显示全部楼层
下载程序不动弹啊...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表