当前位置:   article > 正文

STM32驱动步进电机(附原工程)_stm32探索者驱动步进电机

stm32探索者驱动步进电机

一、引言

本文旨在分享STM32对步进电机的驱动方法和代码工程(文末附工程连接)。初衷是我刚开始学者使用STM32驱动步进电机时,在CSDN上查阅了很多资料,好多都是只分享部分代码,有原工程的资源都需要付费!!!所以在我成功驱动步进电机后,我决定把驱动工程开源,以供和我一样的学者学习指导!

二、硬件准备 

1、单片机

这里我使用的是STM32F103C8T6,学者使用其他单片机也是可以的,关键看代码中的思路!

2、驱动模块

关于这个驱动模块的接线图,请看下图:

3、步进电机 

三、驱动的详细操作说明

这里我把搜集到的有关驱动如何使用的详细说明再列举一下,以方便大家加深理解,同时也是我对自己所学知识点的总结共享。

 四、关键代码

1、电机的初始化配置,相关引脚配置

  1. #include "sm.h"
  2. //num用于对引脚的索引,j用于计算步数,fx为电机旋转方向
  3. unsigned short int num=0,j,fx;
  4. void dj_GPIO_Init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  11. GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB
  12. GPIO_ResetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8); //PB.5/6/7/8 输出低电平
  13. }
  14. void TIM3_Int_Init(u16 arr,u16 psc)
  15. {
  16. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  17. NVIC_InitTypeDef NVIC_InitStructure;
  18. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  19. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000500ms
  20. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
  21. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  22. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  23. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  24. TIM_ITConfig( //使能或者失能指定的TIM中断
  25. TIM3, //TIM
  26. TIM_IT_Update ,
  27. ENABLE //使能
  28. );
  29. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  30. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0
  31. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3
  32. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  33. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  34. TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
  35. }
  36. static uint8_t GPIO_list[] = {0x01,0x02,0x04,0x08}; //对应驱动器4引脚,即电机4
  37. void TIM3_IRQHandler(void) //TIM3中断
  38. {
  39. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
  40. {
  41. TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
  42. if(judge == 0)
  43. {
  44. judge=0;
  45. }
  46. if(judge == 1)
  47. {
  48. if(fx == 0) //fx为电机旋转方向,fx=0时电机正转,fx=1时电机反转
  49. {
  50. dj_GPIO1 = ~(GPIO_list[num]&GPIO_list[0])>>0; //判断是否为引脚1,然后将其数值向右移动0位至第1位,得到unsigned int类型时的1或0
  51. dj_GPIO2 = ~(GPIO_list[num]&GPIO_list[1])>>1; //判断是否为引脚2,然后将其数值向右移动1位至第1位,得到unsigned int类型时的1或0
  52. dj_GPIO3 = ~(GPIO_list[num]&GPIO_list[2])>>2; //判断是否为引脚3,然后将其数值向右移动2位至第1位,得到unsigned int类型时的1或0
  53. dj_GPIO4 = ~(GPIO_list[num]&GPIO_list[3])>>3; //判断是否为引脚4,然后将其数值向右移动3位至第1位,得到unsigned int类型时的1或0
  54. }
  55. if(fx == 1)
  56. {
  57. dj_GPIO4 = ~(GPIO_list[num]&GPIO_list[0])>>0; //上述的反转
  58. dj_GPIO3 = ~(GPIO_list[num]&GPIO_list[1])>>1;
  59. dj_GPIO2 = ~(GPIO_list[num]&GPIO_list[2])>>2;
  60. dj_GPIO1 = ~(GPIO_list[num]&GPIO_list[3])>>3;
  61. }
  62. num += 1; //num用于对引脚的索引
  63. j += 1; //j用于计算步数
  64. if(num == 4) //到第4个GPIO后回到第1个GPIO
  65. {
  66. num = 0;
  67. }
  68. if(j == 2048&fx == 0) //走完一圈同时是正转结束,对参数进行修改
  69. {
  70. j = 0;
  71. fx = 1;
  72. num = 0;
  73. }
  74. if(j == 2048&fx == 1) //走完一圈同时是反转结束,对参数进行修改
  75. {
  76. j = 0;
  77. fx = 0;
  78. start = 0;
  79. num = 0;
  80. }
  81. }
  82. }
  83. }

 2、主函数

  1. /*
  2. 硬件连接方式如下:
  3. 驱动器ULN2003IN1-->PB8
  4. IN2-->PB7
  5. IN3-->PB6
  6. IN4-->PB5
  7. +、-连接电源5-12v
  8. 连接电机
  9. CH340:TXD-->PA10
  10. RXD-->PA9
  11. GND-->单片机GND
  12. 5V-->单片机5V
  13. */
  14. #include "usart.h"
  15. #include "delay.h"
  16. #include "sm.h"
  17. #include "Decode.h"
  18. u8 judge = 0; //judge为1时电机开始旋转,为0时停止
  19. u8 start = 0; //start1时启动电机程序,为0时关闭
  20. void run(void) //电机启动程序
  21. {
  22. if(start == 1) {judge = 1;}
  23. else {judge = 0;}
  24. }
  25. int main(void)
  26. {
  27. delay_init(); // 延时函数初始化
  28. dj_GPIO_Init(); // 电机初始化
  29. uart_init(115200); //串口初始化
  30. judge = 0; //电机停止运作
  31. start = 0; //电机启动程序停止运作
  32. TIM3_Int_Init(19,7199); //电机运行使用的定时器,72MHz,时间: 2ms = 20*7200/72000000s
  33. while(1)
  34. {
  35. if(USART_RX_STA&0x8000) //USART_RX_STA标志最高位置1(接收完成了)
  36. {
  37. Code_Analysis((u8*)USART_RX_BUF); //判断接收数据是否正确
  38. }
  39. run(); //电机启动程序
  40. }
  41. }

 五、工程分享

链接:https://pan.baidu.com/s/1lUbV6sZAKrkNrclyVxGXlQ?pwd=zxf1 
提取码:zxf1 
--来自百度网盘超级会员V3的分享

链接:https://pan.baidu.com/s/1_aJUMeylCoUgCcGTQBda7A?pwd=zxf1 
提取码:zxf1 
--来自百度网盘超级会员V3的分享

六、结语

如果有疑问,大家可以下方评论或者私信我,收到后我会第一时间回复大家!

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

闽ICP备14008679号