2016-12-10 11 views
0

Я работаю над созданием сервопривода FPGA для цифрового замка.Серво не остановится на FPGA

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 

В настоящее время я могу получить его, чтобы превратить весь путь направо, независимо от того, отправить ли мне это 2ms или 1ms. Большая проблема, с которой я столкнулась, заключается в том, чтобы заставить ее работать ТОЛЬКО, чтобы повернуть направо, а затем остановиться. Все, что я пробовал, заканчивается тем, что он вообще не работает, или работает безостановочно, как будто у меня никогда не было 0, отправленного на булавку.

Может ли кто-нибудь предложить лучший способ отправить его 0 после того, как достаточно времени, чтобы полностью вращаться в одном направлении?

Спасибо!

ответ

0

Вам необходимо настроить напряжение на серво с широтно-импульсной модуляцией (ШИМ). Другими словами, если вам нужно напряжение 10%, вам нужно установить свою вынос SERVOPWM 10 процентов от продолжительности.

Как я хотел бы сделать это как:

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

Я запутался. Я не понимаю, как это могло бы помочь, как если бы я изменил значение напряжения на уровне 10, он никогда не установит штырь так высоко в течение достаточного количества времени, поэтому никогда не установит штырь, оставив серво неподвижным , Кроме того, почему мы устанавливаем servo = counter = voltage_percentage? Какова идея, устанавливающая все три равных? –

+0

Нет, мы не ставим их равными. '(counter <= voltage_percentage)' - сравнение (больше или равно). Другими словами, вы можете думать, что if (counter <= voltage_percentage) –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^