【E2198】基于 STM32F103x系列 单片机的三轴步进电机驱动程序

2021-11-07 20:07:16      索炜达电子      2212     

项目编号:E2198

文件大小:692K

源码说明:带中文注释

开发环境:C编译器

简要概述:

基于 STM32F103x系列 单片机的三轴步进电机驱动程序


已不再做电机控制0_0


这个demo本身是很简单的,本科的时候学习用的


另外再上传另一个demo供大家学习用,类似的,使用时切换到该分支, git checkout HGRobotSimpleDemo.


HGRobotSimpleDemo, 一个简单的滑轨机器人程序, 适合初学者, 只是给出了大致的架构, 只包括上位机与机器人通信(WinForm->LwIP栈->步进电机),板子用的stm32F4.


上位机的话用了因为用了海康的网络球机,所以有网络通信/串口通信/视频监控的功能,都是用SDK开发的。


实际上真正的机器人用的是伺服电机,步进电机也就拿来入门即可。

【E2198】基于 STM32F103x系列 单片机的三轴步进电机驱动程序

1.相关的GPIO接口说明:

  • 电机用GPIOC口

     // (MotorX)A4988--> GPIOC0-GPIO1
     GPIOC0 	--> ENABLE
     GPIOA1 	--> STEP(TIM2 CH2)
     GPIOC1	--> DIR
     // (MotorY)A4988--> GPIOC2-GPIO3
     GPIOC2 	--> ENABLE
     GPIOA7 	--> STEP(TM3 CH2)
     GPIOC3	--> DIR
     // (MotorZ)A4988--> GPIOC4-GPIO5
     GPIOC4 	--> ENABLE
     GPIOB7 	--> STEP(TIM4 CH2)
     GPIOC5	--> DIR
  • 机械手(二八步进电机)控制信号使用GPIOC口

     GPIOC6	--> MotorH_A
     GPIOC7	--> MotorH_B	
     GPIOC8	--> MotorH_C
     GPIOC9	--> MotorH_D
  • 串口通信对应引脚宏定义

     #define MASTER_CTRL				GPIOA
     #define MASTER_TXD 				GPIO_Pin_9
     #define MASTER_RXD 				GPIO_Pin_10

2.如何实时控制PWM输出通道的通断?

选择有很多种,比方说定时器使能/关闭,PWM输出通道使能/关闭,占空比为0/50%,驱动器使能引脚0/1 但关键是,你要能在程序中有办法监测到电机当前是停止的,还是运行的 所以选择设置/读取定时器使能位/PWM输出通道使能位

TIM_OCENSet(TIM4,OC2_ENR);TIM_Cmd(TIM4,DISABLE);TIM_OCENReset(TIM4,OC2_ENR);			
TIM_Cmd(TIM4,ENABLE);TIM_OCENSet(TIM4,OC2_ENR,DISABLE);TIM_Cmd(TIM4,DISABLE);TIM_OCENSet(TIM4,OC2_ENR,ENABLE);TIM_Cmd(TIM4,ENABLE);

这里控制pwm通断其实就是为了启动或停止电机,然而启动和停止分别包含加速过程和减速过程,所以这里统一采用TIM_OCENReset() 其它的方式都打开使能并配合上加减速过程,实现电机的启动和停止 实际采用TIM_Cmd()更节能一些

3.如何实时改变PWM的频率以改变电机的速度?

// fpwm_psc = 1,即为1分频,该函数内部已经作减一操作,故不用再减一TIM_ChangePrescaler(TIMx,fpwm_psc);	
// 这里采用TIM_ChangePrescaler方法,因为占空比始终不变,例如可以为50%TIM_SetAutoreload(TIMx,fpwm_arr)		
  • (全步进模式)计算转速

// 一个脉冲周期T = arr/[(72*1000000)/fpwm_psc] = 72*1000000/(fpwm_psc*arr)(s) ,f = 1/T (Hz)// 转速n = (f/200)*60 (r/min),细分数1.8°,200个脉冲转一圈// 占空比			p = pulse_ccr / arr;

4.键盘相关的GPIO接口说明:

  • 相关GPIO口:

     GPIOB5	(K1) 
     GPIOB6	(K2)				
     GPIOB13 (K3)	//GPIOB7  (K3)
     GPIOB14	(K4)	//GPIOB8  (K4)	
     GPIOB9	(K5)
     GPIOB10	(K6)
     GPIOB11	(K7)
     GPIOB12	(K8)
  • 效果:

     按下K1,顺时针转
     按下K2,逆时针转;
     按下K3,加速;
     按下K4,减速 ;
     按下K5,暂停;
     按下K6,启动;
     按下K7,计时加长;
     按下K8,计时减少;

5. UC/OSII系统使用说明:

  • sys.h 文件中 SYSTEM_SUPPORT_UCOS 置1

  • stm32f10x_it.c 文件中 USE_UCOSII 置1(实际 stm32f10x_it.c 这个文件没有在我的项目中用到)

附:重构顺序:

  •  确认按键后返回相应键值
     可以在主程序中根据键值设计响应程序
    1. 键盘


    1. 计时定时器 TIM1

  •  自动重装载计数值、计数器分频系数可调
     默认pwm占空比50%
     默认关闭pwm通道输出使能
    1. PWM 生产定时器 TIM2,TIM3,TIM4

  •  启动/停止电机函数,启动过程包括电机pwm使能,和加减速过程
     改变电机速度函数
     改变电机方向函数,如果电机此时处于运行状态,应先停止在反方向启动
    1. 四二步进电机基本控制

  •  打开机械手
     关闭机械手
     保持机械手当前状态
    1. 机械手八二电机基本控制

  •  全部存储在GPIO_Motor.c文件中
     含有基础的XYZ三轴步进电机使能和反向对应GPIO端口初始化
     含有基础的XYZ三轴步进电机PWM脉冲信号对应GPIO端口初始化
     含有定时器TIM2,TIM3,TIM4的pwm输出通道对应GPIO端口初始化
     含有机械手八二马达的L289N驱动器控制对应GPIO端口引脚初始化
    1. GPIO口初始化

目录│文件列表:

 └ 4StepperMotorsDriveBySTM32F103x

    ├ BUGLIST

    │  │ 20180710第一次调试.txt

    │  │ A4988驱动步进电机调试.txt

    │  │ DMA操作.txt

    │  │ SG90舵机控制,垃圾舵机.txt

    │  │ stm32KEil设置.txt

    │  │ stm32与树莓派通信.txt

    │  │ stm32与树莓派通信串口控制指令测试.txt

    │  │ stm32开发需要.txt

    │  │ stm32脉宽调制PWM产生.txt

    │  │ stm32通用定时器笔记.txt

    │  │ TFT2.2彩色显示屏,换我得用4.5的.txt

    │  │ TIM3+DMA1=三路不同频率PWM.txt

    │  │ ucosII移植文件详细内容.txt

    │  │ ucosII讲义1-任务管理.txt

    │  │ ucosII讲义2-任务管理的系统服务函数.txt

    │  │ ucosII讲义3-中断和时间管理.txt

    │  │ ucosII讲义4-任务间通信与同步基本概念.txt

    │  │ ucosII讲义5-的存储管理.txt

    │  │ UCOS移植到stm32,相关文件配置.txt

    │  │ 三电机调试20170703.txt

    │  │ 丝杆有效行程内相关计算.txt

    │  │ 为什么要学习ucos(用操作系统的编程思维来解决硬件开发).txt

    │  │ 呵呵,虚拟串口模拟stm32双机通信.png

    │  │ 多路步进电机电源选型.txt

    │  │ 整个流程(个人理解).png

    │  │ 步进电机加减速算法.txt

    │  │ 硬件编程C语言,含位操作,extern用法,头文件总结.txt

    │  │ 程序重构,感觉自己之前的架构有问题.txt

    │  │ 虚拟串口调试.txt

    │  │ 解决最开始第一张纸第一次盖章一定会有取印章的操作.txt

    │  │ 输出比较模式输出PWM波.txt

    │  └ 键盘调试记录20170702.txt

    ├ CORE

    │  │ core_cm3.c

    │  │ core_cm3.h

    │  └ startup_stm32f10x_md.s

    ├ HARDWARE

    │  ├ EXTI

    │  │  │ exti.c

    │  │  └ exti.h

    │  ├ GPIO_Motor

    │  │  │ GPIO_Motor.c

    │  │  └ GPIO_Motor.h

    │  ├ IronHand

    │  │  │ IronHand.c

    │  │  └ IronHand.h

    │  ├ KEY

    │  │  │ key8.c

    │  │  └ key8.h

    │  ├ MOTOR_CTRL

    │  │  │ motor.c

    │  │  │ motor.h

    │  │  │ motor_ctrl.c

    │  │  └ motor_ctrl.h

    │  ├ PWM

    │  │  │ pwm.c

    │  │  └ pwm.h

    │  ├ TIMER

    │  │  │ timer1.c

    │  │  │ timer1.h

    │  │  │ timer3.c

    │  │  └ timer3.h

    │  └ USART

    │     │ usart_master.c

    │     └ usart_master.h

    ├ STM32F10x_FWLib

    │  ├ inc

    │  │  │ misc.h

    │  │  │ stm32f10x_adc.h

    │  │  │ stm32f10x_bkp.h

    │  │  │ stm32f10x_can.h

    │  │  │ stm32f10x_cec.h

    │  │  │ stm32f10x_crc.h

    │  │  │ stm32f10x_dac.h

    │  │  │ stm32f10x_dbgmcu.h

    │  │  │ stm32f10x_dma.h

    │  │  │ stm32f10x_exti.h

    │  │  │ stm32f10x_flash.h

    │  │  │ stm32f10x_fsmc.h

    │  │  │ stm32f10x_gpio.h

    │  │  │ stm32f10x_gpio.h~RF29b2e08.TMP

    │  │  │ stm32f10x_gpio.h~RF29b86e6.TMP

    │  │  │ stm32f10x_gpio.h~RF29d6fcb.TMP

    │  │  │ stm32f10x_i2c.h

    │  │  │ stm32f10x_iwdg.h

    │  │  │ stm32f10x_pwr.h

    │  │  │ stm32f10x_rcc.h

    │  │  │ stm32f10x_rtc.h

    │  │  │ stm32f10x_sdio.h

    │  │  │ stm32f10x_spi.h

    │  │  │ stm32f10x_tim.h

    │  │  │ stm32f10x_usart.h

    │  │  └ stm32f10x_wwdg.h

    │  └ src

    │     │ misc.c

    │     │ stm32f10x_adc.c

    │     │ stm32f10x_bkp.c

    │     │ stm32f10x_can.c

    │     │ stm32f10x_cec.c

    │     │ stm32f10x_crc.c

    │     │ stm32f10x_dac.c

    │     │ stm32f10x_dbgmcu.c

    │     │ stm32f10x_dma.c

    │     │ stm32f10x_exti.c

    │     │ stm32f10x_flash.c

    │     │ stm32f10x_fsmc.c

    │     │ stm32f10x_gpio.c

    │     │ stm32f10x_i2c.c

    │     │ stm32f10x_iwdg.c

    │     │ stm32f10x_pwr.c

    │     │ stm32f10x_rcc.c

    │     │ stm32f10x_rtc.c

    │     │ stm32f10x_sdio.c

    │     │ stm32f10x_spi.c

    │     │ stm32f10x_tim.c

    │     │ stm32f10x_usart.c

    │     └ stm32f10x_wwdg.c

    ├ SYSTEM

    │  ├ delay

    │  │  │ delay.c

    │  │  └ delay.h

    │  ├ sys

    │  │  │ sys.c

    │  │  └ sys.h

    │  └ usart

    │     │ usart.c

    │     └ usart.h

    ├ UCOSII

    │  ├ CONFIG

    │  │  │ includes.h

    │  │  └ os_cfg.h

    │  ├ CORE

    │  │  │ os_core.c

    │  │  │ os_flag.c

    │  │  │ os_mbox.c

    │  │  │ os_mem.c

    │  │  │ os_mutex.c

    │  │  │ os_q.c

    │  │  │ os_sem.c

    │  │  │ os_task.c

    │  │  │ os_time.c

    │  │  │ os_tmr.c

    │  │  │ ucos_ii.c

    │  │  └ ucos_ii.h

    │  └ PORT

    │     │ os_cpu.h

    │     │ os_cpu_a.asm

    │     │ os_cpu_c.c

    │     │ os_dbg.c

    │     └ os_dbg_r.c

    └ USER

       │ 4StepperMotorsDriveBySTM32F103x.uvguix.Seven

       │ 4StepperMotorsDriveBySTM32F103x.uvoptx

       │ 4StepperMotorsDriveBySTM32F103x.uvprojx

       │ JLinkLog.txt

       │ JLinkSettings.ini

       │ main.c

       │ stm32f10x.h

       │ stm32f10x_conf.h

       │ stm32f10x_it.c

       │ stm32f10x_it.h

       │ system_stm32f10x.c

       │ system_stm32f10x.h

       └ Listings

          │ 4StepperMotorsDriveBySTM32F103x.map

          │ os_cpu_a.lst

          │ startup_stm32f10x_md.lst

          └ Test_v1_oneMotor.map

TAG三轴步进电机
  • 20 次
  • 1 分