[求助] [問題] 求助FPGA DE1 PWM驅動舵機問題

FPGABOY   2011-7-22 10:30 楼主
各位前輩:
         大家好,小弟我為FPGA的初學者,前些日子採購了Altera的DE1開發板,準備開始探索FPGA這個浩瀚大海。不料在初期真的是困難重重。還望各位前輩能為小弟我指點迷津。在此小弟就先行謝過了。首先,小弟遇到的第一個困難就是PWM訊號驅動伺服馬達(舵機)的問題!

使用設備: Corona DS-929MG Digital Servo *1
                    Altera DE1 開發板*1

功能需求:希望利用Altera DE1開發板上的KEY0~KEY3按鈕控制舵機轉動。
KEY0:快速正轉
KEY1:快速反轉
KEY2:慢速正轉
KEY3:慢速反轉

遭遇到問題:在初期,小弟把持著先求有,再求好的心態。
先打算讓KEY0和KEY1能夠單純的正轉與反轉後,再繼續精進。
可是事不如預期,以下幾次都遭遇失敗。
在此附上原始碼,希望能夠得到各位前輩的教導。
=================================================
CASE1:
module pwm(clk, L, R, RCServo_pulse);
input clk, L,R;
output RCServo_pulse;

wire L,R;
///////////////////////////////////////////////////////////////////////////
parameter ClkDiv = 195; // 50000000/1000/256 = 195

reg [7:0] ClkCount;
reg ClkTick;
always @(posedge clk) ClkTick <= (ClkCount==ClkDiv-2);
always @(posedge clk) if(ClkTick) ClkCount <= 0; else ClkCount <= ClkCount + 1;

////////////////////////////////////////////////////////////////////////////
reg [11:0] PulseCount;
always @(posedge clk) if(ClkTick) PulseCount <= PulseCount + 1;

// make sure the RCServo_position is stable while the pulse is generated
reg RCServo_pulse;
reg[9:0] pulse;

initial pulse = 400;

always @(posedge L or posedge R)
begin
if(L)
   pulse <= pulse-20;
else if(R)
   pulse <= pulse+20;
end
always @(posedge clk)
begin
if(PulseCount==0) RCServo_pulse <= 1;
if(PulseCount>pulse) RCServo_pulse <= 0;
end
endmodule

問題:按KEY0會動,但是亂動;按KEY1不會動。靜止時會不定時亂動。
Pin腳規劃:
L=>INPUT=>KEY[0]=>PIN_R22
R=>INPUT=>KEY[1]=>PIN_R21
CLK=>INPUT=>CLOCK_50=>PIN_L1
RCServo_pulse=>OUTPUT=>GPIO_1[1]=>PIN_H13
=================================================
CASE2:
module PWMOUT(CLK,S,L1);
input CLK;//11.0592MHz
input [1:0] S;
output L1;
reg [32:0] COUNT;
reg [9:0] PWM_COUNT;
reg CHG;
reg PWM_REG;
always @(posedge CLK)
begin
COUNT=COUNT+1;
if (COUNT[13:4] < PWM_COUNT)
PWM_REG=1;
else
PWM_REG=0;
if (COUNT[15] == 1'b1)
begin
if (CHG == 1'b1)
begin
CHG = 1'b0;
if (S[0] == 1'b0) PWM_COUNT=(PWM_COUNT+10'b0000000001);
else if (S[1] == 1'b0) PWM_COUNT=(PWM_COUNT-10'b0000000001);
else PWM_COUNT=PWM_COUNT;
end
end
else
CHG = 1'b1;
end
assign L1=PWM_REG;
endmodule

問題:按KEY0、KEY1會微微轉動,但轉動角度沒線性,忽大忽小。
但已經使用50MHZ PIN,不知位何還會變慢。
Pin腳規劃:
S[1]=>INPUT=>KEY[0]=>PIN_R22
S[0]=>INPUT=>KEY[1]=>PIN_R21
CLK=>INPUT=>CLOCK_50=>PIN_L1
L1=>OUTPUT=>GPIO_1[1]=>PIN_H13
=====================================================
CASE3:
module pwm (CLOCK_50, KEY, pwm);
parameter sd = 3125;
// p = t * FPGA clock,p = .001 seconds * 50MHz = 50000
//sd = p / 16 = 3125
//servo / motor, so 2^4 = 16.
input CLOCK_50;
input [3:0] KEY;

output pwm;
reg pwm;

reg [15:0] counter = 0;

always @ (posedge CLOCK_50)
begin
        counter = counter+1;
        if (counter<= KEY*sd) pwm = 1;
        else pwm = 0;
        if (counter >= 50000) counter = 0;
        end
endmodule

問題:key0~key4 可以轉動~但是無法連續轉動!只轉動一次
Pin腳規劃:
KEY[0]=>INPUT=>KEY[0]=>PIN_R22
KEY[1]=>INPUT=>KEY[1]=>PIN_R21
KEY[2]=>INPUT=>KEY[2]=>PIN_T22
KEY[3]=>INPUT=>KEY[3]=>PIN_T21
CLK_50=>INPUT=>CLOCK_50=>PIN_L1
PWM=>OUTPUT=>GPIO_1[1]=>PIN_H13
=========================================
還請板上的各位前輩抽空幫小弟我解決這個問題,小弟銘感五內!
在此祝板上的各位,身體健康,萬事如意!

回复评论 (2)

请问楼主是哪里的,还用繁体字,你一下贴出来这么多程序,都搞蒙了

一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2011-7-22 13:08

您好~我是台灣的朋友~初來這邊~還請大家多多指教!

謝謝

点赞  2011-7-22 13:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复