Arduino三輪全向小車(二) 編碼馬達的使用

2021-10-23 11:47:52 字數 4684 閱讀 2980

觀察以下編碼馬達的介面:(原諒我這樣拍照,實在懶得把馬達拆下來了)

總共六根線,其中兩根是控制馬達轉速以及轉向的,也就是說和普通馬達完全相同,你需要找到這兩根線,應該會有註明,例如我的馬達上標註為:馬達線1馬達線2。將這兩根線接入馬達驅動板,這裡我推薦tb6612模組,小巧又強大,也不算很貴,但是使用時一定要小心,我買回來的第乙個,剛一接線就燒了(不怪人家,是我把12v接上了5v的口)。

關於tb6612的使用,這裡簡單介紹一下,馬達的兩根線應該接入ao1和ao2(或bo1和bo2),pwma(或pwmb)接入arduino的某乙個pwm埠,這個是管馬達速度的。uno的pwm口其實蠻少的,做三輪車很吃緊,我直接用了mega。ain1和ain2(或bin1和bin2)分別接入arduino的非pwm的數字口,這兩個是管馬達轉向的。剩下的口一定要注意,千萬別接錯,否則就像我一樣,vm和隨便乙個gnd分別接大電源的正負極,大電源電壓盡量不要高於12v,不要低於8v,最好用個穩壓模組。vcc和另外乙個gnd口分別接入arduino的+5v和gnd口。stby可以直接接乙個+5v口,也可以接入數字口然後給高電平,這是使能端。

ok,終於把這個複雜的介面講完了,其實這一部分普通馬達和編碼馬達都是一樣的,**也都一樣,下面是我的習慣寫法:

void

motorcontrol

(float sp)

else

if(sp <0)

else

}

其中motor_sp是pwm口,而其他兩個則為控制轉向的介面。這些都和普通馬達一樣,也很好理解,這裡不再詳細解釋。

推薦你把它寫成個頭檔案放庫里,反正只要是做小車,都會用到它。

接下來這部分才是使用編碼馬達的「重頭戲」:讀取碼盤的資料。根據之前我們理解的碼盤的原理,我們只需要測量a相和b相的頻率以及相位差,即可測算出馬達的轉速和轉向。馬達的另外四根線,一根是a相,一根是b相,分別接入arduino的中斷埠(mega的中斷口有2, 3, 18, 19, 20, 21;uno只有2,3,如果是三輪車,看上去只能用mega了)和其他數字口,另外兩根則是編碼器的5v和gnd,接arduino的5v和gnd即可。

實際上碼盤返回的是計數,頻率需要自己測算,這就涉及到arduino的乙個功能:中斷。就好比你正在你家看電影,做著自己的事情,突然你朋友敲門來找你玩,於是你暫停電影,去給朋友開門並把他打發走,又回來繼續看電影。這就是中斷。arduino可以執行中,因為某些觸發時間而暫停,然後去執行其他任務,執行結束後在回來繼續當前的程式。

arduino中有乙個函式是

attachinterrupt

(digitalpintointerrupt

(pin)

,isr,mode)

;

其中各引數分別為:

如果學過數電,可以結合觸發器觸發條件的知識理解一下上面的觸發是怎麼個原理。

這裡有個很狗的一點是,中斷埠號並不是真正的引腳編號,也就是你插了mega的19引腳,實際上你應該寫4號,對應關係如下:

或者也可以直接寫digitalpintointerrupt(19),但無形中多寫了好多哇…(狗頭)

當a相上行時可以看到b相是高電平,我們定義這時電機為正轉,反轉時,它們的相位差是原來的相反數,也就是負九十度。這時,a相上行時b相為低電平,這樣即可簡單地判斷出電機轉動方向。

也就是說,要判斷此時電機的轉向,我們需要先判斷a相是上行還是下行,之後在判斷此時b相是高電平還是低電平,這個其實很好判斷,幾個if完事。當我們判斷出電機是正轉時,我們就讓計數變數加1,證明碼盤掃過一格,否則減1,即反轉掃過一格。**如下:

void

count()

else

}

其中pps即為計數變數,它的含義其實就是碼盤轉過的格數,如果你知道碼盤一圈有幾格(比如我的電機是390,一般這個引數會被稱為精度),那你就可以算出目前電機轉過的角度。

注意把attachinterrupt()放在setup裡,比如我的a相接了19,對應的中斷口號為4,則我就在setup裡這麼寫:

attachinterrupt(4

, count1, change)

;

好了,至此你就已經可以順利讀出碼盤資料了,不過不知道你有沒有發現這個問題,有了碼盤轉動的資料,我們也只能算出位移,如何計算速度

mstimer2::

set(t, speeddetection)

;

其中,t為時間間隔,也就是每隔這麼多時間中斷一次,第二個引數為中斷函式名,也就是中斷後去執行該函式的內容。看名字我已經取好了:speeddetection,速度檢測,顧名思義這個函式就是測速度的。

測速度的方法也很簡單,我們先用兩次間隔的pss之差計算出電機轉角,再用該轉角除以時間間隔t,即可求出角速度。

float

speeddetection()

pps =0;

//每次該函式最後將pps清零。

attachinterrupt(4

, count1, change)

;//不要忘了再開啟另一種中斷。

}

該函式中的速度和轉角計算公式正是考驗你數學功底的時候,值得注意的是,雖然我的電機精度為390(也就是碼盤一周有390個豁),但是我們在每次a相電平狀態改變時,不管上行還是下行都會記一次數,相當於乙個豁**們計兩次數,因此真正的精度其實是780。這是在計算時應該注意的。其他沒有什麼難理解的地方了。

當然之後還需要在setup裡寫:

mstimer2::

set(t, speeddetection)

;mstimer2::

start()

;//計時開始的意思

下面附上整個原始碼(三輪版本)

#include

//這是我自己寫的,在github上

#include

//引腳中斷庫

#include

//-------------埠定義---------------

#define pina_1 19

//a相

#define pinb_1 29

//b相

#define motor1_sp 13

//pwm埠

#define motor1_pin1 27

//in1

#define motor1_pin2 28

//in2

#define pina_2 2

#define pinb_2 23

#define motor2_sp 11

#define motor2_pin1 24

#define motor2_pin2 25

#define pina_3 3

#define pinb_3 26

#define motor3_sp 12

#define motor3_pin1 30

#define motor3_pin2 31

//------------------------------------

motor motor1

(pina_1, pinb_1, motor1_sp, motor1_pin1, motor1_pin2)

;motor motor2

(pina_2, pinb_2, motor2_sp, motor2_pin1, motor2_pin2)

;motor motor3

(pina_3, pinb_3, motor3_sp, motor3_pin1, motor3_pin2)

;//motor類是我自己在motor.h中定義的類,引數均為埠。

volatile

long m[3]

=;int pps[3]

=;float velocity[3]

=;int t =50;

intadjust

(int sp)

float

speeddetection()

for(

int i =

0; i <

3; i++

) pps[i]=0

;attachinterrupt(4

, count1, change)

;attachinterrupt(0

, count2, change)

;attachinterrupt(1

, count3, change);}

void

setup()

void

loop()

void

motorcontroltri

(float sp1,

float sp2,

float sp3)

void

count1()

else

}void

count2()

else

}void

count3()

else

}

三輪全向輪底盤SLAM挖坑系列 虛擬牆

虛擬牆是在turtlebot2那裡調包出來修改的,主要在rviz上面布置一些虛擬的牆體,並加進去虛擬的雷射,好讓虛擬的牆體也擁有膨脹區域,機械人到達虛擬牆體能夠進行避障。1 安裝好yocs virtual sensor的包,這個包需要安裝比較多的依賴檔案 git clone sudo apt get...

我曾是三輪車伕

我曾經是一名三輪車伕,對於這個事實,我毫不諱言。兩年前的時候,我帶著六百塊錢和一張從阜陽到長沙的火車票隻身來到了湖南師大。我當時腦海裡面考慮的只有一件事情,就是找到學校的領導,申請緩交學費,雖然這個願望最終沒有實現,但是已經無關緊要了。下火車之後的所有場景,我都那麼清晰的記得,就好像剛剛發生過的事情...

GDOI第三輪模擬總結

t1沒有想到乙個性質 插入點的父親是它的前驅和後繼中深度較大的那個。然後感覺十分不可做啊,於是就是打了個模擬spaly,結果有個地方忘記update。t2思路再在一次陷在莫隊中,以為資料會有梯度,就直接上了,一番卡常之後,還是只有暴力分。t3沒有什麼思路,就棄了。t4,30分暴力也需要計算幾何基礎,...