|
項目上用的,FPGA 控制馬達 T型 加減速代碼,加減速時間 速度可調。
module Motor_test(
input wire rst_n,
input wire clk10m,
output wire motor_pul,
output wire motor_done, // Execute Finish
output wire motor_busy,
output wire motor_invalid,
input wire iMotor_en, // Begin Execute
(* MARK_DEBUG="true" *) input wire [7:0] test_Moto
//output reg[9:0] i
);
//`include "MOTOR_Param.h"
//---- Motor Parameter----
//parameter Mid_Thr = 20'b0100_0000_0000_0000; // Max_Speed - Init_Speed
//parameter Acc_Time = 2; //Speed up the time
//parameter Inc_value = 20'd10; // Incress parameter
//parameter Total_Define = 20'd40000; //Total running number of rotation
//parameter Slow_Set = 20'd1500; // Set Turns of End
//////////////////////////////////////////////////////////////
// parameter Speed_Time = 20'd1000;//20'd2000; //Speed Up Turns Number
// parameter Slow_Time = 20'd1000;//20'd2000; //Slow Down Start Turns (Total_Circle - Slow_Set)
// parameter Init_Speed = 20'd500;//20'd1000; //initial velocity Constant Speed or Velocity
// parameter Max_Speed = 20'd2000;//20'd3000; //Maxiam Speed Start Spped ,launch velocity
///////////////////////////////////////////////////////////////////////////////////
parameter Speed_Time = 20'd2000;//20'd2000; //Speed Up Turns Number
parameter Slow_Time = 20'd2000;//20'd2000; //Slow Down Start Turns (Total_Circle - Slow_Set)
parameter Init_Speed = 20'd800;//20'd1000; //initial velocity Constant Speed or Velocity
parameter Max_Speed = 20'd2800;//20'd3000; //Maxiam Speed Start Spped ,launch velocity
// Motor Clock
reg motor_en;
reg [19:0] time_cnt;
reg [1:0] key_en_reg;
reg [19:0] cnt;
reg [19:0] cnt_time;
reg motor_dir_reg;
reg motor_pul_reg;
//motor pulse period
reg [19:0] pul_value_temp;
//r
reg [15:0] motor_cmd;
reg motor_done_reg;
reg motor_en1;
reg [19:0] Total_Circle;
//************************************************************
// Motor Output
assign motor_pul = motor_pul_reg;
assign motor_done = motor_done_reg;
//************************************************************
// enable period
//************************************************************
parameter subdivide = 6400*2;//6400細分 6400個脈沖驅動器旋轉360庿 6400*2 叿6400個脈冿
//160/12=40/3=13.333 為傳動比 電機轎13.33 轉盤轉一圿
//步進角度1.8庿 毿1.8度要32個脈冿
//轉鿿 計算
//頻率=10_000_000(10mhz)/1600(分頻系數)=6250 hz
//旋轉丿個細劌 時間=1/6250=0.00016 s
//電機旋轉丿圿 時間 =6400*0.00016 = 1.024 秿
//轉盤丿圿 時間 = 1.024*13.33(傳動比)= 13.64992 秿
//電機轉鿟:1/1.024 = 0.9765625圿/秿
//轉盤轉鿟:1/13.64992 = 0.0732605026256564圿/秿
//傳動毿 13.333 步進觿1.8 細分6400
parameter ALL360_1= (subdivide*40)/(3*1);//170666 160/12=40/3
parameter ALL180_2= (subdivide*40)/(3*2);
parameter ALL120_3= (subdivide*40)/(3*3);
parameter ALL90_4= (subdivide*40)/(3*4);
parameter ALL72_5= (subdivide*40)/(3*5);
parameter ALL60_6= (subdivide*40)/(3*6);
parameter ALL51_7= (subdivide*40)/(3*7);
parameter ALL45_8= (subdivide*40)/(3*8);
parameter ALL30_12= (subdivide*40)/(3*12);
//parameter ALL15_13= (subdivide*40)/(3*18);//9457 change to 20 °c 360/20=18
//parameter ALL40_14= (subdivide*40)/(3*9);//9457 change to 40 °c 360/20=18
//parameter ALL15_13= (subdivide*40)/(3*36);//9457 change to 10 °c 360/10=36 usd this value mark
//parameter ALL40_14= (subdivide*40)/(3*18);//9457 change to 20 °c 360/20=18
parameter ALL15_13= (subdivide*40)/(3*15);//9457 change to 24 °c 360/24=15 usd this value mark
parameter ALL40_14= (subdivide*40)/(3*7);//9457 change to 48 °c 360/48=7
//parameter ALL15_13= (subdivide*40)/(3*24);//42666//42666
always @(posedge clk10m or negedge rst_n)
begin
if(!rst_n)
Total_Circle <= 20'b0; //Total_Define
else
begin
case(test_Moto)
8'h00:
Total_Circle <= ALL360_1;
8'h01:
//Total_Circle <= 20'd288000; //20'd320000; // 1600*180
Total_Circle <= ALL360_1; //20'd320000; // 1600*180
8'h02:
Total_Circle <= ALL180_2; //20'd160000; // 1600*200
//Total_Circle <= ALL90_4; //20'd160000; // 1600*200
8'h03:
Total_Circle <= ALL120_3; //20'd106700; // 1600*200
8'h04:
Total_Circle <= ALL90_4; //80000; // 1600*200
8'h05:
Total_Circle <= ALL72_5; //64000; // 1600*200
8'h06:
Total_Circle <= ALL60_6; //53400; // 1600*200
8'h07:
Total_Circle <= ALL51_7; //45720; // 1600*200
8'h08:
Total_Circle <= ALL45_8; //40000; // 1600*200
8'h0C:
Total_Circle <= ALL30_12;
8'h0D:
Total_Circle <= ALL15_13;
8'h0E:
Total_Circle <= ALL40_14;
/*
8'h01:
Total_Circle <= 20'd288000; //20'd320000; // 1600*180
8'h02:
Total_Circle <= 20'd144000; //20'd160000; // 1600*200
8'h03:
Total_Circle <= 20'd96000; //20'd106700; // 1600*200
8'h04:
Total_Circle <= 20'd72000; //80000; // 1600*200
8'h05:
Total_Circle <= 20'd57600; //64000; // 1600*200
8'h06:
Total_Circle <= 20'd48000; //53400; // 1600*200
8'h07:
Total_Circle <= 20'd41142; //45720; // 1600*200
8'h08:
Total_Circle <= 20'd36000; //40000; // 1600*200
8'h0C:
Total_Circle <= 20'd24000;
8'h0D:
Total_Circle <= 20'd12000;
*/
default:
Total_Circle <= 20'd24000;
endcase
end
end
//************************************************************
// enable signal
// Attition:must dected motor_done_reg falling is sent next motor command
always @(posedge clk10m or negedge rst_n)
begin
if(!rst_n)
motor_done_reg <= 1'b0;
else if(cnt_time >= Total_Circle - 1)//before notice
motor_done_reg <= 1'b1;
else
motor_done_reg <= 1'b0;
end
always @(posedge clk10m or negedge rst_n)//clk125
begin
if(!rst_n)
motor_en1 <= 1'b0;
else
begin
if(cnt_time == Total_Circle)
motor_en1 <= 1'b0;
else
motor_en1 <= iMotor_en;
end
end
// Operation Siganl
// pwm width count
always @(posedge clk10m or negedge rst_n)
if(!rst_n)
motor_en <= 0;
else
motor_en <= motor_en1;
always @(posedge clk10m or negedge rst_n)
begin
if(!rst_n)
cnt <= 20'd0;
else if(motor_en)
begin
if(cnt == pul_value_temp)
cnt <= 20'd0;
else
cnt <= cnt + 1'b1;
end
else
cnt <= 20'd0;
end
//pwm circle count
always @(posedge clk10m or negedge rst_n)
begin
if(!rst_n)
cnt_time <= 20'd0;
else if(motor_en)
begin
if(cnt == pul_value_temp)
begin
if(cnt_time == Total_Circle)
cnt_time <= 20'd0;
else
cnt_time <= cnt_time + 1'b1;
end
else;
end
else
cnt_time <= 20'd0;
end
// Test Speed up _____/-------\_____
always @(posedge clk10m or negedge rst_n)
begin
if(!rst_n)
pul_value_temp <= Max_Speed;
else if(motor_en)
begin
if(cnt_time < Speed_Time) // Speed up time 2000
pul_value_temp <= Max_Speed - cnt_time;//3000 - 1900*10 = 5000 *Inc_value Speed_Time +
else if(cnt_time > (Total_Circle - Slow_Time)) // Slow down time
pul_value_temp <= Init_Speed + (cnt_time - (Total_Circle - Slow_Time));//(cnt_time - Slow_Time) *10 2000
else
pul_value_temp <= Init_Speed;//pul_value_temp; //Constant Speed
end
else
pul_value_temp <= Max_Speed;
end
// pwm out
always @(posedge clk10m or negedge rst_n)
begin
if(!rst_n)
motor_pul_reg <= 1'b0;
else if(cnt == pul_value_temp)
motor_pul_reg <= ~motor_pul_reg;
else;
end
endmodule
// parameter Speed_Time = 20'd2000;//20'd2000; //Speed Up Turns Number
// parameter Slow_Time = 20'd2000;//20'd2000; //Slow Down Start Turns (Total_Circle - Slow_Set)
// parameter Init_Speed = 20'd800;//20'd1000; //initial velocity Constant Speed or Velocity
// parameter Max_Speed = 20'd2800;//20'd3000; //Maxiam Speed Start Spped ,launch velocity
|
-
-
Motor_test.rar
2019-9-11 11:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2.2 KB, 下載次數: 14, 下載積分: 黑幣 -5
評分
-
查看全部評分
|