当前位置: 首页 > news >正文

做网站自己买服务器好还是用别人的网站建设的所有权

做网站自己买服务器好还是用别人的,网站建设的所有权,站长网站seo查询,软文推广去哪个平台好FPGA驱动步进电机-Sin曲线加速 基本实现原理实际仿真的波形程序 以下由特权同学的FPGA文档摘取 Sin 曲线控制 step 脉冲信号生成的功能框图如下所示。 基本实现原理 ①判断步进电机驱动的目标频率 stepper_delay_target 与当前频率 stepper_delay_current的值是否一致#… FPGA驱动步进电机-Sin曲线加速 基本实现原理实际仿真的波形程序 以下由特权同学的FPGA文档摘取 Sin 曲线控制 step 脉冲信号生成的功能框图如下所示。 基本实现原理 ①判断步进电机驱动的目标频率 stepper_delay_target 与当前频率 stepper_delay_current的值是否一致若一致则不做任何加速、减速操作保持当前速度运行若目标频率高于当前频率则执行加速若目标频率低于当前频率则执行减速。 ②在加速或减速控制开启状态下1ms 分频计数逻辑每个 1ms 产生一个高脉冲用于切换当前的速度。 ③在每 1ms步进电机的速度都会加速或减速一定的频率值这个频率值和匀加速总是“固定”不同它是变化的。在低频时速度变化量较大而高速时速度变化量较小。这个速度到底如何变化变化多少我们现实用 matlab 产生了一个 0‐pi 的 sin 曲线并且将曲线所对应的 1024 个 16bit 数据存储到了 FPGA 的片内 ROM 里实际使用中0~0.5pi 部分的上升曲线作为步进电机加速的频率曲线而 0.5pi~pi 的下降曲线作为步进电机减速的频率曲线。如图所示X 取值为 0~511 的曲线左侧曲线取 0~0.5pi 的 512 个正弦值放大 32768倍并且挪到 0 点以上作为加速曲线X 取值为 512~1023 的曲线右侧曲线取 0.5pi~pi的 512 个正弦值放大 32768 倍作为减速曲线。 那么这两段曲线如何使用 由于加速或减速所用到的 sin 查表值都是 512 个所以我们加速或减速所需经过的中间频率都是 512 个。对于加速操作目标频率 stepper_delay_target加速起始频率stepper_delay_current 的差值需要经过 x 个中间加速频率点x 从 0 递增到 511我们可以算得当前加速的 delta_speed_pulse (stepper_delay_target ‐stepper_delay_current ) * (x 为地址对应的 ROM 数据)/32768即最终用(stepper_delay_target ‐ delta_speed_pulse/32768)作为当前频率点。换句话说就是用 sin 曲线作为整个加速过程的频率差值用目标频率减去这个差值就可以得到从其实频率逐渐靠近目标频率的加速过程并且这个加速过程和图示左侧的曲线一样越来越平滑。对于减速操作也类似只不过它是用停止频率或减速目标频率加上当前 sin 曲线算出的频率差值作为当前中间频率点。 ④实际的 FPGA coding 中必须把“频率”换算为“周期”便于计数。这个换算很简单用 1s 时间除以“频率”值即可。而由于“周期”必须换算为“时钟脉冲个数”为单位所以我们把这个除法运算中的“除数”也换算为“时钟脉冲个数”为单位因此 1s/20ns时钟周期为 20ns即除数 50_000_000。 ⑤算出了加速或减速过程中不断变化的步进电机驱动的脉冲周期stepper_delay_current_period就能够产生步进电机驱动的脉冲了。 实际仿真的波形 以上匀加速/减速操作下设定步进电机的启动频率为 500Hz可以稳定加速到 5KHz加速时间需要 512*1ms 512ms 程序 module stepper_motor_controller(input clk, //50MHzinput rst_n, //复位信号低电平有效output stepper_motor_reset_n, //步进电机复位信号低电平有效output reg stepper_motor_en_n, //步进电机驱动信号输出有效信号低电平有效output reg stepper_motor_clk, //步进电机的前进脉冲上升沿有效发起一个步进电机转动input stepper_work_en, //步进电机使能input[19:0] stepper_delay_target, //步进电机两次stpe之间的延时取值必须大于2目标延时值output reg[19:0] stepper_delay_current //步进电机两次stpe之间的延时取值必须大于2当前延时值);parameter START_FRE 20d1000; //步进电机起步频率单位Hz parameter TIMER_1MS 20d50_000; //1ms定时计数最大值时钟为50MHz(20ns) parameter CLK_NUMER_PERIORD 32d50_000_000; //除数单位20ns//--------------------------------------------------------------------------- reg speed_up_en; //加速功能开启 reg[1:0] speed_up_en_r; //加速寄存器打一拍 reg speed_down_en; //减速功能开启 reg[1:0] speed_down_en_r;//减速寄存器打一拍 reg[19:0] stepper_cnt; wire pos_speed_up_en; //speed_up_en上升沿表示开始启动加速 wire pos_speed_down_en; //speed_down_en上升沿表示开始启动减速 //--------------------------------------------------------------------------- //复位 assign stepper_motor_reset_n rst_n; //--------------------------------------------------------------------------- //1s加速/减速定时 reg[19:0] xcnt;always (posedge clk or negedge rst_n)if(!rst_n) xcnt 20d0;else if(!speed_up_en !speed_down_en) xcnt 20d0;else if(xcnt (TIMER_1MS-1)) xcnt xcnt1b1;else xcnt 20d0; wire motor_speed_change (xcnt (TIMER_1MS-1)); //ms定时信号高电平有效切换速度//--------------------------------------------------------------------------- //例化ROM存储sin输出1024个0-pi的结果放大1024倍 reg[9:0] rom_addr; wire[15:0] rom_data;blk_mem_gen_0 uut_blk_mem_gen_0 ( //IP核.address ( rom_addr ),.clock ( clk ),.q ( rom_data )); //--------------------------------------------------------------------------- //匀加速、减速控制 //加速控制使能 always (posedge clk or negedge rst_n)if(!rst_n) speed_up_en 1b0; else if(motor_speed_change (rom_addr 10d511)) speed_up_en 1b0; else if(((stepper_delay_current stepper_delay_target) stepper_work_en)) speed_up_en 1b1;else speed_up_en 1b0;always (posedge clk)speed_up_en_r {speed_up_en_r[0],speed_up_en}; //记录电平变化assign pos_speed_up_en ~speed_up_en_r[1] speed_up_en_r[0]; //speed_up_en上升沿表示开始启动加速//减速控制使能 always (posedge clk or negedge rst_n)if(!rst_n) speed_down_en 1b0; else if(motor_speed_change (rom_addr 10d1023)) speed_down_en 1b0; else if(stepper_work_en) beginif(stepper_delay_current stepper_delay_target) speed_down_en 1b1; else speed_down_en 1b0;endelse beginif(stepper_delay_current START_FRE) speed_down_en 1b1;else speed_down_en 1b0; endalways (posedge clk) speed_down_en_r {speed_down_en_r[0],speed_down_en};assign pos_speed_down_en ~speed_down_en_r[1] speed_down_en_r[0]; //speed_down_en上升沿表示开始启动减速 wire neg_speed_down_en speed_down_en_r[1] ~speed_down_en_r[0];//--------------------------------------------------------------------------- //ROM地址产生对应加速/减速参数选择控制always (posedge clk or negedge rst_n)if(!rst_n) rom_addr 10d0;else if(pos_speed_up_en) rom_addr 10d0;else if(pos_speed_down_en) rom_addr 10d512;else if(motor_speed_change (speed_up_en || speed_down_en)) rom_addr rom_addr1b1;else ; //--------------------------------------------------------------------------- //乘法运算 wire[35:0] mult_result; reg[19:0] mult_datab; reg[19:0] speed_up_start;//锁存加速起始频率 always (posedge clk or negedge rst_n)if(!rst_n) speed_up_start 20d0;else if(pos_speed_up_en) speed_up_start stepper_delay_current;//计算当前运行频率和目标频率差 always (posedge clk or negedge rst_n)if(!rst_n) mult_datab 20d0;else if(pos_speed_up_en) mult_datab stepper_delay_target - stepper_delay_current; //加速else if(pos_speed_down_en) beginif(!stepper_work_en) mult_datab stepper_delay_current - START_FRE; //停止的减速else mult_datab stepper_delay_current - stepper_delay_target; //运行中减速end//频率差*(加速频率/32768) mult_gen_0 uut_mult_gen_0 (.clock ( clk ),.dataa ( rom_data ),.datab ( mult_datab ),.result ( mult_result ));wire[19:0] delta_speed_down_pulse mult_result[34:15]; //加速或减速频率差值 wire[19:0] delta_speed_up_pulse mult_result[34:15]; //加速或减速频率差值//--------------------------------------------------------------------------- //步进电机使能控制always (posedge clk or negedge rst_n)if(!rst_n) stepper_motor_en_n 1b1;else if(stepper_work_en) stepper_motor_en_n 1b0;else if(!stepper_work_en (stepper_delay_current START_FRE)) stepper_motor_en_n 1b1;//--------------------------------------------------------------------------- //步进电机的step产生//步进电机当前频率产生 always (posedge clk or negedge rst_n)if(!rst_n) stepper_delay_current START_FRE;else if(neg_speed_down_en) beginif(stepper_work_en) stepper_delay_current stepper_delay_target;else stepper_delay_current START_FRE;endelse if(motor_speed_change) beginif(stepper_work_en) beginif(speed_up_en) stepper_delay_current speed_up_start delta_speed_up_pulse;else if(speed_down_en) stepper_delay_current stepper_delay_target delta_speed_down_pulse;else stepper_delay_current stepper_delay_target;endelse beginif(speed_down_en) stepper_delay_current START_FRE delta_speed_down_pulse;else stepper_delay_current START_FRE;endendwire[19:0] stepper_delay_current_period; wire[31:0] div_result; div_gen_0 uut_div_gen_0 (.clock ( clk ),.denom ( stepper_delay_current ),.numer ( CLK_NUMER_PERIORD ),.quotient ( div_result ),.remain ( ));assign stepper_delay_current_period div_result[19:0]; reg[19:0] r_stepper_delay_current_period; //步进电机驱动周期锁存 always (posedge clk or negedge rst_n)if(!rst_n) r_stepper_delay_current_period 1d0;else if(stepper_cnt 20d0) r_stepper_delay_current_period stepper_delay_current_period; //步进电机时钟频率的计数 always (posedge clk or negedge rst_n)if(!rst_n) stepper_cnt 20d0;else if(stepper_cnt r_stepper_delay_current_period[19:0]) stepper_cnt stepper_cnt1b1;else stepper_cnt 20d0;//步进电机时钟频率产生 always (posedge clk or negedge rst_n)if(!rst_n) stepper_motor_clk 1b0;else if(stepper_cnt {1b0,r_stepper_delay_current_period[19:1]}) stepper_motor_clk 1b0;else stepper_motor_clk 1b1;endmodule
http://www.zqtcl.cn/news/233093/

相关文章:

  • 天津网站优化哪家快惠民建设局网站是哪个
  • 大连做网站绍兴厂商商城网站数据库表关系设计
  • 公司网站制作第三方彭州做网站的公司
  • 青建设厅官方网站海省包装策划与设计专业
  • 中国城投建设集团网站手机网游
  • 通过音乐做网站外链企业所得税多少钱起征
  • 哪个网站系统做的好广州电子商城网站
  • 泉州模板建站定制成都网页设计培训机构
  • 个人微信公共号可以做微网站么免费产品推广软件
  • 建设银行瓶窑支行网站阿里域名官网
  • 宿迁网站seo中原建设信息网 网站
  • 地方网站域名用全拼建设银行网站怎么登录密码忘了怎么办
  • win7 iis7 添加网站秦皇岛 网站建设
  • 手机模板网站模板下载工具Wordpress elgg
  • 宠物网站建设的目的wordpress图创
  • 网站首页图片怎么更换浙江省建设政务网站
  • 宁波有哪家公司做网站的京东联盟网站建设电脑版
  • 电商网站业务流程网站制作在哪找
  • 学校网站建设教程加盟网站制作费用
  • fqapps网站建设少儿戏曲知识 网站建设
  • 产品网站建设框架wordpress用户名密码加密方式
  • 入侵dedecms网站管理员密码青岛seo整站优化公司
  • 小网站备案南宁网站建设排名
  • 西安免费做网站wordpress 使用方法
  • 企业营销的意义优化核心系列网站
  • 微信网站设计一起做网站17广州
  • 重庆网络推广网站如何制作app演示视频
  • 网站logo是指手机上做app的软件
  • 做母婴育儿类网站好做seo排名吗深圳网站. 方维网络
  • 小型装修公司店面装修windows优化大师会员