遠程控制伺服馬達
FPGA也適合用來控制“遠程控制伺服馬達”( R/C Servos)
什麼是遠程伺服馬達?
“遠程控制伺服馬達”由有電動機和一系列安裝在盒子里的齒輪組成。此設備有一根轉動軸,你可以通過使用PWM(脈寬調製)脈衝來精確控制它的轉向。下面是一副它的圖片(雖然又舊又破,但是完成了我們的設計目的)。
(圖中句子的意思:你可以通過發送脈衝信號到白線上來控制這個輪子的轉角)
從下面的連接,可以找到一些有用的參考資料:
他們用在哪裡?
伺服系統的連接
伺服馬達有三根線,它們是:
PWM脈衝
控制脈衝的寬度需要調整在1-2毫秒之間。1.5毫秒寬度的脈衝使得轉軸轉到其轉動範圍的中間位置。脈衝信號需要以固定時間間隔(10-20毫秒)發送,即使不需要調整轉軸的轉向,否則的話,伺服馬達將不會再維持轉軸原有的轉向。
FPGA產生PWM脈衝
讓我們以8位(0-255)的精度來控制這個伺服馬達。 這意味著我們需要以3.9微秒(1mS/256)的精度控制產生寬度在1-2毫秒之間的PWM脈衝.
時鐘分頻
考慮使用25MHz的時鐘信號(每周期40nS),首先要做的就是將時鐘分頻產生周期為3.9uS的時鐘信號。
parameter ClkDiv = 98; // 25000000/1000/256 = 97.56
reg [6:0] ClkCount;
reg ClkTick;
always @(posedge clk) ClkTick <= (ClkCount==ClkDiv-2);
always @(posedge clk) if(ClkTick) ClkCount <= 0; else ClkCount <= ClkCount + 1;
我們引入一個12位的計數器,用“ClkTick”作為其技術節拍。
reg [11:0] PulseCount;
always @(posedge clk) if(ClkTick) PulseCount <= PulseCount + 1;
每拍的時間間隔為3.9uS,所以 256 拍一共持續1mS的時間,並且12位的“PulseCount”計數器每16mS會回到初值。正好是我們需要產生新的PWM信號的時間間隔。
產生PWM脈衝
我們在"PulseCount"等於0的時候開始發出脈衝信號,在其等於256到511之間的某個值時停止該脈衝,這樣就可以產生寬度在1到2mS之間的脈衝信號。假設"RCServo_position"是一個8位的位置值(0到255),我們在其前補上"0001"得到一個12位的值在256到511之間的新變數。最後,我們將這個12位的變數與“PulseCount”比較來產生脈衝信號。
reg RCServo_pulse;
always @(posedge clk) RCServo_pulse = (PulseCount < {4'b0001, RCServo_position});
完整的代碼在
這裡 |
[admin via 研發互助社區 ] FPGA控制遠程控制伺服馬達已經有5342次圍觀
http://cocdig.com/docs/show-post-43145.html