STM32電位器控制舵機實現同步機械臂

2021-10-05 04:41:43 字數 3105 閱讀 3132

序言

硬體部分

軟體部分

最終效果

總結總覽

教程使用的開發板為正點原子的精英版,板載晶元為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占空比來控制,也就是乙個週期中高電平所佔的百分比來控制舵機的轉角的。控制...