序言
硬體部分
軟體部分
最終效果
總結總覽
教程使用的開發板為正點原子的精英版,板載晶元為stm32f103zet6,另需要10k電位器3-4個,標準舵機mg996 3-4個,機械臂支架一套,工具若干,上述舵機和機械臂支架也可用sg90舵機和冰棍杆代替。
所需材料
開發板正點原子精英
電位器10k電位器
舵機(不能是360度的舵機)
mg996,sg90舵機
工具膠槍,杜邦線若干,電烙鐵
舵機—如何控制從動部分
舵機我最開始買的是360度的sg90舵機,本想著度數越大越好的,但是360度舵機pwm控制的只是正轉、反轉和停止,不容易實現我們期望的輸入訊號直接轉到某一角度的目的,所以後又重新購置180度的sg90舵機和mg996標準舵機(用於機械臂架),上述都是模擬舵機。
首先必須明確如何控制舵機:舵機一般是由pwm訊號控制的,而我用的模擬舵機需要不斷送pwm訊號才能轉到相應的角度,個人理解這就是為什麼在調節占空比後的函式要加乙個延遲,在這裡關於pwm訊號的相關知識不做過多的討論,但是需要明確的一點,控制舵機pwm訊號的週期一般為20ms,用定時器產生pwm訊號的方法網上詳解很多,這裡也不作介紹,只要清楚上述控制用訊號的週期,根據公式便能了解設定定時器的裝載值為多少比較合適。
週期計算公式(單位為秒s):
t =(
arr+
1)∗(
psc+
1)/c
lkt=(arr+1)*(psc+1)/clk
t=(arr
+1)∗
(psc
+1)/
clk裝載值(arr)為1999,預分頻值(psc)為719,時鐘頻率(clk)為72,000,000,易得週期為0.02s也就是20ms。
控制舵機的pwm訊號為0.5ms到2.5ms,相對應的角度是0-180度,由於stm32是通過改變占空比來調整pwm訊號,不是直接改變脈寬,所以控制舵機的訊號占空比為2.5%-12.5%,結合裝載值為1999,所以在pwm模式1的情況下比較暫存器的有效數值為50-250對應0-180度。
至此如何控制舵機我們已經基本了解。
電位器—如何讀取主動部分
電位器其實就是和中學學習的滑動變阻器類似的可調電阻裝置,我們要做的就是讀取電位器的位置,把這個資訊送到晶元即可,由於直接讀取電阻數值很麻煩,所以我們選擇外接電源讀取模擬量,再把模擬量轉換成數字量(adc)的方式讀取角度值,這裡我直接用的板子上3.3v的vdd輸出連線電位器,需要注意的是io口電壓不能超過該電壓。由於是多通道採集,所以這裡採用的是dma的方式,具體adc和dma可參考其他詳細教程,這裡不作過多贅述。
在得到數字量資料後就是對映問題,我們得到的是12位二進位制資料,也就是0-4095,把這個數字量對映到上面提到的50到250即可,當然電位器是0-270度而舵機是0-180度,這也可以通過控制對映方式解決,下面的**沒在此方面進行改進。
至此我們便基本了解了如何實現同步機械臂的主要硬體,下面便是軟體部分。
與硬體部分相對應的顯示如何控制舵機
其中用到的定時器3(tim3)的通道1(pa6),通道2(pa7),通道4(pb1),通道3(pb0)也可以使用,分別接舵機即可。
timer.c
void
tim3_pwm_init
(u16 arr,u16 psc)
隨後是主動部分的adc,用到的是adc1的通道0(pa0)、通道1(pa1)、通道4(pa4),分別接電位器即可。
adc.c
#include
"adc.h"
/*基於dma的adc多通道採集*/
volatile u16 adcconvertedvalue[10]
[3];
//用來存放adc轉換結果,也是dma的目標位址,3通道,每通道採集10次後面取平均數
void
dma_init
(void
)void
adc_init
(void
)
另外新增了記憶功能,記憶功能是通過外部中斷實現的,在中斷服務函式中執行隨動的同時記錄一些點,後進行重播從而實現動作記憶。在預設同步模式下按key1進去中斷服務函式,開始記錄動作,再按key0結束動作記錄,開始重複。
exti.c
#include
"exti.h"
#include
"led.h"
#include
"key.h"
#include
"delay.h"
extern u16 adcconvertedvalue[10]
[3];
void
extix_init
(void
)//按鍵key1進入中斷服務,同步運動同時記錄位置
void
exti3_irqhandler
(void);
delay_ms(10
);//消抖
if(key1==0)
//按鍵key1
n=i;
while(1
)//重複執行記錄的動作
led0=
!led0;
delay_ms(50
);}}
exti_clearitpendingbit
(exti_line3)
;//清除line3上的中斷標誌位
}
以上**加上正點原子的led.c和key.c即可實現完整功能
快捷鏈結:micro servo-robot
提取碼:7rdx
作為初學者,上面很多話可能有不嚴謹的地方,還請各位指正。同時該裝置也有很大改進的空間,比如改變對映實現電位器和舵機的百分比同步等。
非常感謝你的閱讀,如果可以請留下你的足跡。
數字電位器理論講解及stm32實現方法
數字電位器亦稱數控可程式設計電阻器,是一種代替傳統機械電位器的新型cmos數字 模擬混合訊號處理的積體電路。工作原理 數字電位器屬於整合化的三端可變電阻器件其等效電路,如圖l所示。當數字電位器用作分壓器時,其高階 低端 滑動端分別用vh vl vw表示 而用作可調電阻器時,分別用rh rl和rw表示...
STM32之使用PWM控制多路舵機
最近在玩乙個6自由度的機械臂,我手上這台機械臂的核心控制器件就是那六個能夠180度旋轉的舵機了。想想之前在學校還沒有系統性的把舵機給玩明白,所以就索性拿手上的stm32來自己寫驅動 將6個舵機給驅動起來。舵機的控制原理還是比較簡單的,而且控制的角度和精度能夠比較好的按照開發者的意願來進行,因此經常被...
用PWM控制舵機(以是stm32為例)
因為做校創需要用到舵機,以前知道大致的理論,因此看了一些帖子,總結一下被以後檢視。pwm就是脈衝寬度調製,也就是占空比可變的脈衝波形.pwm的占空比,就是指高電平保持的時間,與該pwm時鐘週期時間之比。在應用中就是通過調節pwm占空比來控制,也就是乙個週期中高電平所佔的百分比來控制舵機的轉角的。控制...