Robofun 機器人論壇

標題: SERVO(伺服馬達) & C語法問題 [打印本頁]

作者: BOB003452002    時間: 2012-7-24 17:03
標題: SERVO(伺服馬達) & C語法問題
首先先PO上我原始自行設計的原始碼: 原始程式碼.txt (1.55 KB, 下載次數: 2900)
編輯軟體 : KeilC uV3

而目的只是暫時以等速去做左右擺動的動作
而我有先行詢問過教授可行性
而教授給的回覆則是:

XX同學你好:

一般將PWM應用於馬達的轉速控制,建議先規劃好整體動作的期望轉速時間函數,

再將轉速時間函數以PWM技術實現出來,Position(int) 中的int愈大,對應於較大的轉速,

本程式的觀念為int愈大,轉動角度愈大,這樣的作法將獲得較不確切的結果.

副程式Position(unsigned int t)中:

P1^0=1;

delay(t);

P1^0=0;

delay(200-t);

delay(200)耗掉的時間將為20*1ms=20ms=0.02s,此為一個PWM波的週期,其倒數為載波頻率,

載波頻率愈高,所得的動作將較為細膩;不夠高的話,動作將極為粗糙.

建議將delay(1)的delay時間修改到適當的小,同時200也改小.

而且將Position改為Velocity較貼切.

然後程式寫法改為每隔一個PWM週期執行一次Velocity(v),而v隨著轉速時間函數值大小在改變.



看完之後我還是有幾項疑問:

1.servo不是以20ms為一個週期去讀取看有多少比率是1而去判斷轉到的位置嗎?

   那麼教授所指的轉速又是??(原始設計是移動到指定位置後再返向旋轉)


2.請問教授的意思是20ms為一個PWM波週期,故在當中有越多重複的波形動作會越細膩?

   (原始設計在20ms中只有一個波形)


作者: nichal    時間: 2012-7-25 17:15
servo一定要給重覆波形
除非是記憶型的servo
一般來說都要每20mS內至少重覆給一次
不然會放棄鎖角度
而送了定位的對應脈波長度
也不代表當下就是停在那個角度
也是需要反應時間
但如果反應時間小於20mS的間隔
動作就會變得比較卡卡的

因此
如果需要控制的servo數量不是很多的話
可以縮短重覆波形的時間間隔
以一個servo有效的最大角度來說
假設是2.5mS
而同時需控制4個servo的話
那只要大於2.5*4=10mS的時間間隔就夠用了
因此您可以將時間縮短到12mS就重覆送一次波形
如此一來您的動作就會變得比較流暢些 (每12mS就可以更新角度一次)

但這並不是要您在20mS對一個servo重覆兩次以上的相同波形
那是沒有意義的
因為20mS以內只要發生過一次角度設定就可以了
作者: BOB003452002    時間: 2012-7-26 16:05
非常謝謝您的回答
聽了nichal解釋之後我有對我的程式碼做修正
方便再請您過目一次嗎?
(目前目標以操縱一個servo) 原始程式碼.txt (1.11 KB, 下載次數: 2661)
作者: nichal    時間: 2012-7-27 10:48
本帖最後由 nichal 於 2012-7-27 10:55 編輯

把200改成120
就差不多是我說的方式了

http://www.wretch.cc/blog/chipware/17881146
很久以前寫的
可以參考看看

我的寫法是用Timer0去調整20mS的間隔
所以只要修正SAMPLE_RATE參數
就可以加快系統的反應時間
作者: tegausu    時間: 2012-7-27 18:23
通常用 PWM 做非常簡單只有1個 SERVO , 控制 51 的PWM 工作週期(Duty Cycle)
為20ms 再隨時給 Duty 比  控制在 0.8 ms 到 2.2 ms 隨時改變Duty 比 ,servo 就
跟著轉
給另外的一種做法不用PWM 用1個主工作週期20ms的分時系統,從0-2ms時做servo輸出
從2-20ms去做要寫入轉動角度值資料的工作,再從0開使重覆這個動作,去瞭解我的說法
作者: BOB003452002    時間: 2012-7-29 15:29
我會試著去理解看看,
目前正找其相關零件以做第一步的測試中!
謝謝你們!
作者: BOB003452002    時間: 2012-8-1 17:25
不好意思我將上次寫好的程式碼給教授看過之後
(於此先再次貼上 原始程式碼.txt (1.15 KB, 下載次數: 2367) )
而教授的回覆則是:

Position(15)不代表轉到對應於15的角度,Position(5)也不代表轉到對應於5的角度,所以

觀念上還不是很正確.

Reset(10)Reset(5)也是同樣的問題.

要注意的是,PWM控制是轉速控制,而不是角度控制.

建議規劃一個完整動作,轉速從零開始逐步加速到最大轉速,

然後再減速到零為止,由積分可知轉了多少角度.


此問題好像又回復到我PO文所問的問題了...

而我在看了一次資料後,

就我的理解:

以我的程式碼為例 Position(5)指的是把馬達轉到-90度的位置,

而並不是使馬達以X的角速度逆(或順)時針旋轉呀!?

請問在理解上以及程式馬上有錯誤嗎?

勞煩指正~~


作者: marbol    時間: 2012-8-2 07:29
同學好:
先確定一下您跟教授所認知的伺服馬達是否是一樣的東西?
標的不同,運思的結果是沒有交集的~~
作者: nichal    時間: 2012-8-2 08:35
回復 8# marbol

marbol大~~

剛開始我也跟你的想法一樣
不過後來想想
我覺得應該servo是一樣的
只是控制法則存在很大的問題
教授想做的跟實際servo所能呈現的
效果其實沒辦法很吻合
但如果單純只是訓練"概念"的話
其實還是有解的

讓你猜猜我是怎麼想的?


提示一下:
轉速控制需要"角度參數"與"時間參數"兩者同時存在才能達成
作者: mzw2008    時間: 2012-8-2 13:25
可是教授的回答裡面有一句:要注意的是,PWM控制是轉速控制,而不是角度控制.
這看起來真的很像在講DC或步進<---尤其重看教授第一次回應以後
哈哈
同學, 要不要先把你的馬達照片放上來!!
感覺不是搞錯了就是該教授根本沒用過標準PWM規格的馬達
直接以控制DC的想法在跟你講話

話說回來, 教授要是看你把問題放來這裡大概要氣炸了XDDD
作者: nichal    時間: 2012-8-2 16:36
本帖最後由 nichal 於 2012-8-2 21:26 編輯

回復 10# mzw2008


第一次看我也覺得搞不好是在做servo裡面那塊板子
不過既然教授已經看過程式也跟同學討論過了

應該不會繼續把RC servo認定為DC馬達的伺服控制吧?
反正就是有"雞同鴨講"的感覺
只是不曉得到底是哪一邊搞錯了.....
作者: mzw2008    時間: 2012-8-3 12:41
我覺得看到電路和馬達就能真相大白
有些時候學校用的硬體並不是我們常討論的那些哩....
作者: BOB003452002    時間: 2012-8-3 15:20
謝謝各位前輩的回覆,
在此先為因小弟自身的知識不足而有問初一些太過於淺層的問題道歉  OTZ

首先先PO上當初欲購買的servo
http://goods.ruten.com.tw/item/show?21201070220175
但在"當時"我並不知道servo有分角度型以及旋轉型,
而在次看過物品資訊之後我還是沒看到哪邊有寫 @"@

再來關於教授的部分我想就是因為上面所說的,
教授跟我說的是兩種不同形式的servo因此造成誤解!
(教授給予我的建議是若毫無經驗可先從無回授的寫法下手)

至於拿來網路上發問我覺得教授是不會覺得怎麼樣XD
因為這不太算是作業
但還是謝謝各位前輩的指教
我會持續補充相關知識
作者: mzw2008    時間: 2012-8-4 00:30
若你講的SERVO是網頁中那種
那常見有以下兩種:
1. 限制角度旋轉,給PWM就是對應到某角度 <--不特別標示就幾乎一定是這種
2. 無限旋轉,給PWM距離1.5越遠轉越快
以上都是玩具應用領域的

工業應用領域就真的千奇百怪了
我覺得, 乾脆要你教授給張參考圖吧, 至少先搞清楚他講的是什麼
總覺得教授講的和你在網路看的似乎不一樣耶
作者: BOB003452002    時間: 2012-8-6 13:35
to:mzw2008大
我想我要用的就是您說的第一種的servo,也就是一般稱角度型的servo
經過詢問之後也的確是教授跟我所想問的是不一樣的,
非常不好意思造成你們的誤會。

但我想在學期過程中也有一知半解的情況,也會再找找有無適當的教學網站或者書籍,再次複習。
(在此也請問是否有比較推薦給新手的相關書籍或者網站呢?)

nichal大 有貼了一份他以前寫的,
但我很慚愧的說我發現我很多都不太懂  OTZ
作者: mzw2008    時間: 2012-8-9 17:56
那首先得先確認你到底是想學哪一種哩XD




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2