Я работаю над созданием сервопривода 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 после того, как достаточно времени, чтобы полностью вращаться в одном направлении?
Спасибо!
Я запутался. Я не понимаю, как это могло бы помочь, как если бы я изменил значение напряжения на уровне 10, он никогда не установит штырь так высоко в течение достаточного количества времени, поэтому никогда не установит штырь, оставив серво неподвижным , Кроме того, почему мы устанавливаем servo = counter = voltage_percentage? Какова идея, устанавливающая все три равных? –
Нет, мы не ставим их равными. '(counter <= voltage_percentage)' - сравнение (больше или равно). Другими словами, вы можете думать, что if (counter <= voltage_percentage) –
'if (counter <= voltage_percentage) SERVOPWM <= 1; else SERVOPWM <= 0; ' –