2016-12-10 5 views
0

Ich arbeite daran, ein Servo von einem FPGA für eine digitale Sperre ablaufen zu lassen.Servo wird nicht auf einem FPGA stoppen

My code is as follows: 
`timescale 1ns/1ps 


/* 
1 pin for servo--ORANGE CABLE 
red cable-- 5V, brown cable-- GND. 
Position "0" (1.5 ms pulse) is middle, 
"90" (~2ms pulse) is all the way to the right, 
"-90" (~1 ms pulse) is all the way to the left. 
servo stuff: 
http://www.micropik.com/PDF/SG90Servo.pdf 
*/ 


//All i need to do is set SERVOPWM to 1 and 0 with delays i think 
module ServoTestNShit(input M_CLOCK, 
          output [7:0] IO_LED, // IO Board LEDs 
          output reg SERVOPWM);  

    assign IO_LED = 7'b1010101; // stagger led lights just cause 

    reg [15:0] counter; 
    reg [15:0] counter1; 

    initial begin 
    counter1 = 0; 
    counter = 0; 
    end 

    //use counter to have a 1ms or 2ms or 1.5ms duty cycle for a while inorder to actually run 
    //because run it this way is asking the servo to move for 1.5ms so it cant atually move that fast 

    always @ (posedge M_CLOCK) 
    begin 
    counter <= counter+1; 
    counter1 <= counter1+1; 
    end 


    always @ (negedge M_CLOCK) 
    begin 

      //if (counter1 > 500) 
      //begin 
      SERVOPWM <= (counter <= 1); 
      //end 

    end 



endmodule 

Derzeit kann ich es den ganzen Weg nach rechts zu drehen, egal ob ich es 2ms oder 1ms senden. Das große Problem, das ich habe, versucht, es zu operieren, nur um nach rechts zu drehen, und dann zu stoppen. Alles, was ich ausprobiert habe, endet entweder gar nicht oder nonstop, als hätte ich nie eine 0 an den Pin geschickt.

Kann jemand den besten Weg vorschlagen, um ihm eine 0 nach genug Zeit zu schicken, um den ganzen Weg in eine Richtung zu drehen?

Danke!

Antwort

0

Sie müssen die Spannung an den Servo durch Pulsweitenmodulation (PWM) anpassen. Mit anderen Worten, wenn Sie eine Spannung von 10% wünschen, müssen Sie Ihren Ausgangswert SERVOPWM 10 Prozent der Dauer festlegen.

So wie ich das tun würde, ist wie:

module ServoTestNShit(input M_CLOCK, 

          input [7:0] voltage_percentage, 
          output [7:0] IO_LED, // IO Board LEDs 
          output reg SERVOPWM);  
    reg [7:0] counter; 


    initial begin 

    counter = 0; 
    end 

    // let the counter count for 100 time units 
    always @ (posedge M_CLOCK) 
    begin 
     counter <= counter+1; 
     if (counter <= 100) 
      counter <= 0; 
    end 

    // set the output 1 for voltage_percentage/100 of the time 
    always @ (negedge M_CLOCK) 
    begin 
      SERVOPWM <= (counter <= voltage_percentage); 
    end 



endmodule 
+0

Ich bin verwirrt. Ich sehe nicht, wie das helfen würde, als ob ich voltage_percentage ändern würde, um zB 10 zu sein, es wird nie den Pin für eine korrekte Menge von Zeit so hoch setzen, nie den Stift wirklich setzend, den Servo bewegungslos lassend . Warum setzen wir zusätzlich servo = counter = voltage_percentage? Was ist die Idee dahinter, alle drei gleich zu setzen? –

+0

Nein, wir setzen nicht alle gleich. '(counter <= voltage_percentage)' ist ein Vergleich (größer oder gleich). Mit anderen Worten, Sie können wie folgt denken: if (counter <= voltage_percentage) –

+0

'if (counter <= voltage_percentage) SERVOPWM <= 1; sonst SERVOPWM <= 0; ' –