伺服不会在 FPGA 上停止
Servo won't stop on a 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 发送到 pin 一样。
任何人都可以建议在足够的时间一直旋转到一个方向后向其发送 0 的最佳方法吗?
谢谢!
您需要通过脉宽调制 (PWM) 来调整伺服电压。换句话说,如果你想要 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
我正在研究用 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 发送到 pin 一样。
任何人都可以建议在足够的时间一直旋转到一个方向后向其发送 0 的最佳方法吗?
谢谢!
您需要通过脉宽调制 (PWM) 来调整伺服电压。换句话说,如果你想要 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