创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十载时间我们累计服务了上千家以及全国政企客户,如玻璃隔断等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞美。
看看步进电机的转角v,在根据轮子的半径R,得出步进电机的转一圈走的路程L。用10MM除以L得到转动的周期乘以360在除以v,得到转动的脉冲数,使用数字电路搭建
步进电机主要按一定的给电规律,给对应的绕组响应的电信号,电机将按一定的方向运行,而且每改变一次电信号电机将运行一步,如果连续给出响应电信号,电机将连续运行,只要改变电信号的频率,将获得不同的运行速度。如果用步进电机调速时,只要改变控制器的输出脉冲的频率,就可以实现步进电机的调速。也有厂家推出了内部集成有脉冲发生器的步进驱动器,用户只需输入模拟电信号或通过电位器即可实现步进电机的调速,如白山步进驱动器DQ系列
可以设置的。步进电机没有转速设置,通过调节输入驱动器的脉冲频率以及驱动器的细分参数来达到调节步进电机转速。以下几种方法也可以调节步进电机的转速:1. 改变极对数变数2. 变频调速3. 换向器电机调速4. 串子调速5. 定子调压调速6. 电磁转离合器调速7. 转子串电阻调速
用步进电机是低成本、有效的解决方案,设计合理的话不会有累积误差。最大的问题就是噪音和振动。如果钱不是问题,可以用交流伺服电机,速度和精度都不是问题,但要伺服电机特性偏软,注意位置过冲。
多大功率的电机?用单片机可以实现。关键是你不懂呀…不好说…
使用电脑控制,通常都是运动控制卡,但是目前的运动控制卡价格一般都太贵,插入主板卡槽也不便于操作。给你推荐一个我用过的东东,串口运动控制器,我当时用的八轴步进电机,你自己搜索下吧,价格会让你惊讶!当然,你还需要步进电机驱动器,开关电源。
可以采用专用的步进电机驱动器。电脑只需向驱动器输出两个信号:脉冲和调向信号。脉冲信号的频率控制步进电机的转速,脉冲的个数控制步进电机的转角;调向信号控制步进电机的转向。步进电机驱动器的型号很多,例如MS-2H057M(常州微电机总厂生产)。如果是控制微型步进电机,可以采用该厂的SMD-401型驱动器,65元一个(批量供货价格)。
需要4种硬件,除了电脑。
1、一块基于PC的运动控制卡,多轴控制的;
2、步进电机驱动器;
3、步进电机;
4、驱动器需要的开关电源。
通过plc编写带定时器的程序,这样就可以按照你的需要控制步进电机的驱动的脉冲宽度(驱动时间),plc可以发出脉冲驱动也可以发出长驱,按照需要,最好做成电机块(fc或者fb),这样以后就可以直接调用
这个针对不同规格型号步进电机,以及负载惯量和运行速度,时间等,以及加速模式,等,一般为0~1500毫秒,电机越大,负载越重,速度越快,所需加速时间越长,反之则越校
main.c文件内容:#include"stm32f10x_lib.h"#include"main.h"tim_timebaseinittypedef tim_timebasestructure;gpio_inittypedef gpio_initstructure;errorstatus hsestartupstatus;tim_timebaseinittypedef tim_timebasestructure;int pulse;int stepcount;int pulse1;int pulse2;int t1;int t2;int r1;int r2;void rcc_configuration(void);void nvic_configuration(void);void gpio_configuration(void);void tim2_configuration(void);void f(int vt,int a,int d,int s);#define vect_tab_ramint main(void) #ifdef debug debug();/*[初始化外围设备指针]*/ #endif rcc_configuration(); //初始化时钟与复位 nvic_configuration();//初始化中断嵌套 tim2_configuration();//初始化定时器 gpio_configuration(); gpio_writebit(gpiod, gpio_pin_7, (bitaction)(0)); gpio_writebit(gpiod, gpio_pin_6, (bitaction)(0)); //dcy1 dcy2为00,即normal %0 decay gpio_writebit(gpioe, gpio_pin_7, (bitaction)(1)); gpio_writebit(gpiob, gpio_pin_1, (bitaction)(0)); //m1m2为10,即1-2-phase //gpio_writebit(gpioa, gpio_pin_4, (bitaction)(1)); //正向旋转 //gpio_writebit(gpioa,gpio_pin_4,(bitaction)(1-gpio_readoutputdatabit(gpioa,gpio_pin_4)));正、反向旋转控制 gpio_writebit(gpiob, gpio_pin_0, (bitaction)(0)); gpio_writebit(gpioc, gpio_pin_5, (bitaction)(1)); //tq1 tq2为01,即current ratio为50% gpio_writebit(gpioa, gpio_pin_7, (bitaction)(1)); //stepreset位 gpio_writebit(gpioc, gpio_pin_4, (bitaction)(1)); //stepen 使能位 while(1) r1=0; r2=10; stepcount=0; gpio_writebit(gpioa,gpio_pin_4,(bitaction)(1-gpio_readoutputdatabit(gpioa,gpio_pin_4))); tim2_configuration(); do }while(r2); tim_cmd(tim2, disable); delay(7000000); }}void gpio_configuration(void) gpio_inittypedef gpio_initstructure; gpio_initstructure.gpio_pin=gpio_pin_3 | gpio_pin_4 | gpio_pin_7; //pa的3.4.7接clk,cw/ccw,stepreset gpio_initstructure.gpio_mode=gpio_mode_out_pp; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpioa,&gpio_initstructure); gpio_initstructure.gpio_pin= gpio_pin_5 | gpio_pin_6; //pa的6.7接protect和mo gpio_initstructure.gpio_mode=gpio_mode_ipu; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpioa,&gpio_initstructure); gpio_initstructure.gpio_pin=gpio_pin_4 | gpio_pin_5; //pc的4.5接stepen和tq2 gpio_initstructure.gpio_mode=gpio_mode_out_pp; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpioc,&gpio_initstructure); gpio_initstructure.gpio_pin=gpio_pin_0 | gpio_pin_1; //pb的0.1接tq1和m2 gpio_initstructure.gpio_mode=gpio_mode_out_pp; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpiob,&gpio_initstructure); gpio_initstructure.gpio_pin=gpio_pin_7; //pe7接m1 gpio_initstructure.gpio_mode=gpio_mode_out_pp; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpioe,&gpio_initstructure); gpio_initstructure.gpio_pin=gpio_pin_6 | gpio_pin_7; //pd的67接dcy2和dcy1 gpio_initstructure.gpio_mode=gpio_mode_out_pp; gpio_initstructure.gpio_speed=gpio_speed_50mhz; gpio_init(gpiod,&gpio_initstructure);} void nvic_configuration(void) nvic_inittypedef nvic_initstructure;#ifdef vect_tab_ram nvic_setvectortable(nvic_vecttab_ram, 0x0); #else nvic_setvectortable(nvic_vecttab_flash, 0x0); #endif nvic_initstructure.nvic_irqchannel = tim2_irqchannel; //设置tim2通道输入中断 nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; /*配置优先级组*/ nvic_initstructure.nvic_irqchannelsubpriority = 0; nvic_initstructure.nvic_irqchannelcmd = enable; /*允许tim2全局中断*/ nvic_init(&nvic_initstructure);}void tim2_configuration(void) tim_setcounter( tim2, 0x0000); tim_clearflag(tim2, tim_flag_update); /*清除更新标志位*/ tim_clearitpendingbit(tim2, tim_flag_update); //清除tim2等待中断更新中断标志位 tim_arrpreloadconfig(tim2, enable); /*预装载寄存器的内容被立即传送到影子寄存器 */ tim_itconfig(tim2, tim_it_update, enable); //使能tim2的更新 tim_timebaseinittypedef tim_timebasestructure; tim_timebasestructure.tim_period = 2000; //设定的最大计数值2000,最大计数值是0xffff tim_timebasestructure.tim_prescaler = 72; //分频72 tim_timebasestructure.tim_clockdivision = 0; // 时钟分割 tim_timebasestructure.tim_countermode = tim_countermode_up; //计数方向向上计数 tim_timebaseinit(tim2, &tim_timebasestructure); tim_cmd(tim2, enable); //tim2 enable counter}void rcc_configuration(void) rcc_deinit(); rcc_hseconfig(rcc_hse_on); hsestartupstatus = rcc_waitforhsestartup(); if(hsestartupstatus == success) flash_prefetchbuffercmd(flash_prefetchbuffer_enable); flash_setlatency(flash_latency_2); rcc_hclkconfig(rcc_sysclk_div1); rcc_pclk2config(rcc_hclk_div1); rcc_pclk1config(rcc_hclk_div2); rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9); rcc_pllcmd(enable); while(rcc_getflagstatus(rcc_flag_pllrdy) == reset) } rcc_sysclkconfig(rcc_sysclksource_pllclk); while(rcc_getsysclksource() != 0x08) } } rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_gpiob | rcc_apb2periph_gpioc | rcc_apb2periph_gpiod | rcc_apb2periph_gpioe,enable); rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable); //打开tim2的时钟} void delay(u32 ncount) do } while(ncount--);}void f(int vt,int a,int d,int s) int pulse1; int pulse2; t1=vt/a; if(stepcount{ r1++; pulse1=(150000*t1)/(r1*vt); tim_setautoreload(tim2,pulse1); } if(t1<=stepcount<=4*s) //匀速阶段运行要求的步数或者距离 { pulse=150000/vt; tim_setautoreload(tim2,pulse); } if(stepcount>4*s) //减速阶段,走完s步后开始减速,分t2-1级减速 { r2--; if(t2>=1) { pulse2=(150000*t2)/(r2*vt); tim_setautoreload(tim2,pulse2); } } } main.h文件内容: #define stepenpin gpio_pin_4 extern int s; extern int t1; extern int r2; extern int pulse1; extern int pulse2; extern int stepcount; extern tim_timebaseinittypedef tim_timebasestructure; void delay(u32 ncount); void f(int vt,int a,int d,int s); tim2中断函数程序: void tim2_irqhandler(void) { if (tim_getitstatus(tim2, tim_it_update) == set) { tim_clearflag(tim2, tim_flag_update); gpio_writebit(gpioa,gpio_pin_3,(bitaction)(1-gpio_readoutputdatabit(gpioa,gpio_pin_3))); stepcount=stepcount+1; f(300,10,10,4000); } }