MyFPGA Forum

 找回密码
 注册
搜索
查看: 5665|回复: 1
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2011-7-22 10:19:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位前輩:
         大家好,小弟我為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#
发表于 2011-8-26 22:50:57 | 只看该作者
這一包你可以拿去改看看
我把PWM寫在LED上 你拿去再修改  

module PWM(LED,
                           clk);
  
  output [15:0]LED;
  reg    [15:0]LED;
  
  input clk;
  
  reg state;
  reg [31:0]counter;
  reg [31:0]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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-5 18:55 , Processed in 0.045860 second(s), 14 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表