找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2109|回复: 1
打印 上一主题 下一主题
收起左侧

FPGA控制马达 T型 加减速代码

[复制链接]
跳转到指定楼层
楼主
ID:35884 发表于 2019-9-11 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目上用的,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

2.2 KB, 下载次数: 14, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:257160 发表于 2019-9-27 20:02 | 只看该作者
太复杂了~~~~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表