2021-11-07 20:07:16 索煒達電子 2210
項目編號:E2198
文件大?。?92K
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
基于 STM32F103x系列 單片機的三軸步進電機驅(qū)動程序
已不再做電機控制0_0
這個demo本身是很簡單的,本科的時候?qū)W習(xí)用的
另外再上傳另一個demo供大家學(xué)習(xí)用,類似的,使用時切換到該分支, git checkout HGRobotSimpleDemo.
HGRobotSimpleDemo, 一個簡單的滑軌機器人程序, 適合初學(xué)者, 只是給出了大致的架構(gòu), 只包括上位機與機器人通信(WinForm->LwIP棧->步進電機),板子用的stm32F4.
上位機的話用了因為用了??档木W(wǎng)絡(luò)球機,所以有網(wǎng)絡(luò)通信/串口通信/視頻監(jiān)控的功能,都是用SDK開發(fā)的。
實際上真正的機器人用的是伺服電機,步進電機也就拿來入門即可。
電機用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
串口通信對應(yīng)引腳宏定義
#define MASTER_CTRL GPIOA #define MASTER_TXD GPIO_Pin_9 #define MASTER_RXD GPIO_Pin_10
選擇有很多種,比方說定時器使能/關(guān)閉,PWM輸出通道使能/關(guān)閉,占空比為0/50%,驅(qū)動器使能引腳0/1 但關(guān)鍵是,你要能在程序中有辦法監(jiān)測到電機當(dāng)前是停止的,還是運行的 所以選擇設(shè)置/讀取定時器使能位/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通斷其實就是為了啟動或停止電機,然而啟動和停止分別包含加速過程和減速過程,所以這里統(tǒng)一采用TIM_OCENReset() 其它的方式都打開使能并配合上加減速過程,實現(xiàn)電機的啟動和停止 實際采用TIM_Cmd()更節(jié)能一些
// fpwm_psc = 1,即為1分頻,該函數(shù)內(nèi)部已經(jīng)作減一操作,故不用再減一TIM_ChangePrescaler(TIMx,fpwm_psc); // 這里采用TIM_ChangePrescaler方法,因為占空比始終不變,例如可以為50%TIM_SetAutoreload(TIMx,fpwm_arr)
(全步進模式)計算轉(zhuǎn)速
// 一個脈沖周期T = arr/[(72*1000000)/fpwm_psc] = 72*1000000/(fpwm_psc*arr)(s) ,f = 1/T (Hz)// 轉(zhuǎn)速n = (f/200)*60 (r/min),細(xì)分?jǐn)?shù)1.8°,200個脈沖轉(zhuǎn)一圈// 占空比 p = pulse_ccr / arr;
相關(guān)GPIO口:
GPIOB5 (K1) GPIOB6 (K2) GPIOB13 (K3) //GPIOB7 (K3) GPIOB14 (K4) //GPIOB8 (K4) GPIOB9 (K5) GPIOB10 (K6) GPIOB11 (K7) GPIOB12 (K8)
效果:
按下K1,順時針轉(zhuǎn) 按下K2,逆時針轉(zhuǎn); 按下K3,加速; 按下K4,減速 ; 按下K5,暫停; 按下K6,啟動; 按下K7,計時加長; 按下K8,計時減少;
sys.h 文件中 SYSTEM_SUPPORT_UCOS 置1
stm32f10x_it.c 文件中 USE_UCOSII 置1(實際 stm32f10x_it.c 這個文件沒有在我的項目中用到)
確認(rèn)按鍵后返回相應(yīng)鍵值 可以在主程序中根據(jù)鍵值設(shè)計響應(yīng)程序
鍵盤
計時定時器 TIM1
自動重裝載計數(shù)值、計數(shù)器分頻系數(shù)可調(diào) 默認(rèn)pwm占空比50% 默認(rèn)關(guān)閉pwm通道輸出使能
PWM 生產(chǎn)定時器 TIM2,TIM3,TIM4
啟動/停止電機函數(shù),啟動過程包括電機pwm使能,和加減速過程 改變電機速度函數(shù) 改變電機方向函數(shù),如果電機此時處于運行狀態(tài),應(yīng)先停止在反方向啟動
四二步進電機基本控制
打開機械手 關(guān)閉機械手 保持機械手當(dāng)前狀態(tài)
機械手八二電機基本控制
全部存儲在GPIO_Motor.c文件中 含有基礎(chǔ)的XYZ三軸步進電機使能和反向?qū)?yīng)GPIO端口初始化 含有基礎(chǔ)的XYZ三軸步進電機PWM脈沖信號對應(yīng)GPIO端口初始化 含有定時器TIM2,TIM3,TIM4的pwm輸出通道對應(yīng)GPIO端口初始化 含有機械手八二馬達的L289N驅(qū)動器控制對應(yīng)GPIO端口引腳初始化
GPIO口初始化
目錄│文件列表:
└ 4StepperMotorsDriveBySTM32F103x
├ BUGLIST
│ │ 20180710第一次調(diào)試.txt
│ │ A4988驅(qū)動步進電機調(diào)試.txt
│ │ DMA操作.txt
│ │ SG90舵機控制,垃圾舵機.txt
│ │ stm32KEil設(shè)置.txt
│ │ stm32與樹莓派通信.txt
│ │ stm32與樹莓派通信串口控制指令測試.txt
│ │ stm32開發(fā)需要.txt
│ │ stm32脈寬調(diào)制PWM產(chǎn)生.txt
│ │ stm32通用定時器筆記.txt
│ │ TFT2.2彩色顯示屏,換我得用4.5的.txt
│ │ TIM3+DMA1=三路不同頻率PWM.txt
│ │ ucosII移植文件詳細(xì)內(nèi)容.txt
│ │ ucosII講義1-任務(wù)管理.txt
│ │ ucosII講義2-任務(wù)管理的系統(tǒng)服務(wù)函數(shù).txt
│ │ ucosII講義3-中斷和時間管理.txt
│ │ ucosII講義4-任務(wù)間通信與同步基本概念.txt
│ │ ucosII講義5-的存儲管理.txt
│ │ UCOS移植到stm32,相關(guān)文件配置.txt
│ │ 三電機調(diào)試20170703.txt
│ │ 絲桿有效行程內(nèi)相關(guān)計算.txt
│ │ 為什么要學(xué)習(xí)ucos(用操作系統(tǒng)的編程思維來解決硬件開發(fā)).txt
│ │ 呵呵,虛擬串口模擬stm32雙機通信.png
│ │ 多路步進電機電源選型.txt
│ │ 整個流程(個人理解).png
│ │ 步進電機加減速算法.txt
│ │ 硬件編程C語言,含位操作,extern用法,頭文件總結(jié).txt
│ │ 程序重構(gòu),感覺自己之前的架構(gòu)有問題.txt
│ │ 虛擬串口調(diào)試.txt
│ │ 解決最開始第一張紙第一次蓋章一定會有取印章的操作.txt
│ │ 輸出比較模式輸出PWM波.txt
│ └ 鍵盤調(diào)試記錄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