2020-07-23 21:56:05 +08:00
2020-07-23 21:28:21 +08:00
2018-07-31 16:03:59 +08:00
2020-07-23 21:28:21 +08:00
2018-07-31 16:03:59 +08:00
2018-08-07 13:50:57 +08:00
2020-07-23 21:28:21 +08:00
2018-07-31 16:03:59 +08:00
2018-07-31 16:06:53 +08:00
2020-07-23 21:56:05 +08:00

4StepperMotorsDriveBySTM32F103x

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

已不再做电机控制0_0

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

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

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

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

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

avatar


4StepperMotorsDriveBySTM32F103x

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
    1. PWM 生产定时器 TIM2,TIM3,TIM4
    自动重装载计数值、计数器分频系数可调
    默认pwm占空比50%
    默认关闭pwm通道输出使能
    
    1. 四二步进电机基本控制
    启动/停止电机函数,启动过程包括电机pwm使能,和加减速过程
    改变电机速度函数
    改变电机方向函数,如果电机此时处于运行状态,应先停止在反方向启动
    
    1. 机械手八二电机基本控制
    打开机械手
    关闭机械手
    保持机械手当前状态
    
    1. GPIO口初始化
    全部存储在GPIO_Motor.c文件中
    含有基础的XYZ三轴步进电机使能和反向对应GPIO端口初始化
    含有基础的XYZ三轴步进电机PWM脉冲信号对应GPIO端口初始化
    含有定时器TIM2TIM3TIM4的pwm输出通道对应GPIO端口初始化
    含有机械手八二马达的L289N驱动器控制对应GPIO端口引脚初始化
    
Description
No description provided
Readme 1.9 MiB
Languages
C 99.2%
Assembly 0.8%