fpgaboy 发表于 2011-7-22 10:19:06

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

各位前輩:
         大家好,小弟我為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 ClkCount;
reg ClkTick;
always @(posedge clk) ClkTick <= (ClkCount==ClkDiv-2);
always @(posedge clk) if(ClkTick) ClkCount <= 0; else ClkCount <= ClkCount + 1;

////////////////////////////////////////////////////////////////////////////
reg 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 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=>PIN_R22
R=>INPUT=>KEY=>PIN_R21
CLK=>INPUT=>CLOCK_50=>PIN_L1
RCServo_pulse=>OUTPUT=>GPIO_1=>PIN_H13
============================================
CASE2:
module PWMOUT(CLK,S,L1);
input CLK;//11.0592MHz
input S;
output L1;
reg COUNT;
reg PWM_COUNT;
reg CHG;
reg PWM_REG;
always @(posedge CLK)
begin
COUNT=COUNT+1;
if (COUNT < PWM_COUNT)
PWM_REG=1;
else
PWM_REG=0;
if (COUNT == 1'b1)
begin
if (CHG == 1'b1)
begin
CHG = 1'b0;
if (S == 1'b0) PWM_COUNT=(PWM_COUNT+10'b0000000001);
else if (S == 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=>INPUT=>KEY=>PIN_R22
S=>INPUT=>KEY=>PIN_R21
CLK=>INPUT=>CLOCK_50=>PIN_L1
L1=>OUTPUT=>GPIO_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 KEY;

output pwm;
reg pwm;

reg 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=>INPUT=>KEY=>PIN_R22
KEY=>INPUT=>KEY=>PIN_R21
KEY=>INPUT=>KEY=>PIN_T22
KEY=>INPUT=>KEY=>PIN_T21
CLK_50=>INPUT=>CLOCK_50=>PIN_L1
PWM=>OUTPUT=>GPIO_1=>PIN_H13
==========================================
希望能有前輩能夠抽空幫小弟我解決這個問題,感謝再感謝~
祝板上的各位能夠身體健康,萬事如意。

徐偉翔 发表于 2011-8-26 22:50:57

這一包你可以拿去改看看
我把PWM寫在LED上 你拿去再修改

module PWM(LED,
                           clk);

output LED;
reg    LED;

input clk;

reg state;
reg counter;
reg pwm;


   always @(posedge clk)
        begin
          if(state == 1'b0)
          begin
          state = 1'b1;
          end
          
          if(state == 1'b1)
          begin
          
          if (counter <= pwm)
          begin
           LED = 8'b1111_1111;
          end
          
          else
           LED = 8'b0000_0000;
               
    end
        end
       
        always@(posedge clk)
        begin
          if(state == 1'b1)
          begin
          
          if(counter == 32'd100000)
          begin
          pwm = pwm +32'd50;
          counter = 32'd0;
               if(pwm >= 32'd100000)
                  pwm = 32'd0;
               
          end
          else
          begin
             counter = counter + 32'd1;
          end
          
          end
          
        end
endmodule
页: [1]
查看完整版本: [問題] 求助FPGA DE1 PWM驅動舵機問題