2021-11-07 20:07:16 索炜达电子 2212
项目编号:E2198
文件大小:692K
源码说明:带中文注释
开发环境:C编译器
简要概述:
基于 STM32F103x系列 单片机的三轴步进电机驱动程序
已不再做电机控制0_0
这个demo本身是很简单的,本科的时候学习用的
另外再上传另一个demo供大家学习用,类似的,使用时切换到该分支, git checkout HGRobotSimpleDemo.
HGRobotSimpleDemo, 一个简单的滑轨机器人程序, 适合初学者, 只是给出了大致的架构, 只包括上位机与机器人通信(WinForm->LwIP栈->步进电机),板子用的stm32F4.
上位机的话用了因为用了海康的网络球机,所以有网络通信/串口通信/视频监控的功能,都是用SDK开发的。
实际上真正的机器人用的是伺服电机,步进电机也就拿来入门即可。
电机用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
选择有很多种,比方说定时器使能/关闭,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()更节能一些
// 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;
相关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,计时减少;
sys.h 文件中 SYSTEM_SUPPORT_UCOS 置1
stm32f10x_it.c 文件中 USE_UCOSII 置1(实际 stm32f10x_it.c 这个文件没有在我的项目中用到)
确认按键后返回相应键值 可以在主程序中根据键值设计响应程序
键盘
计时定时器 TIM1
自动重装载计数值、计数器分频系数可调 默认pwm占空比50% 默认关闭pwm通道输出使能
PWM 生产定时器 TIM2,TIM3,TIM4
启动/停止电机函数,启动过程包括电机pwm使能,和加减速过程 改变电机速度函数 改变电机方向函数,如果电机此时处于运行状态,应先停止在反方向启动
四二步进电机基本控制
打开机械手 关闭机械手 保持机械手当前状态
机械手八二电机基本控制
全部存储在GPIO_Motor.c文件中 含有基础的XYZ三轴步进电机使能和反向对应GPIO端口初始化 含有基础的XYZ三轴步进电机PWM脉冲信号对应GPIO端口初始化 含有定时器TIM2,TIM3,TIM4的pwm输出通道对应GPIO端口初始化 含有机械手八二马达的L289N驱动器控制对应GPIO端口引脚初始化
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