赞
踩
1、步进电机
它是将电脉冲信号转变为角位移或线位移的开环控制元件。(一个脉冲信号就会使电机转动一定角度)
注:电机的转速、停止的位置仅取决于脉冲信号的频率和脉冲数;
2、步进电机工作原理
- 转子是永磁体。当电流流过绕组的时候,它会产生一个矢量磁场,该磁场会带动转子旋转一定角度,转子和定子的磁场保持一致,定子随着磁场旋转一定角度时转子也会随之转动,该角度称为步距角。(每输入一个脉冲,转子就会转动一个步距角)
- 步进电机的角位移与输入的脉冲成正比,旋转的速度脉冲的频率成正比。
- 改变电机的转动方向:改变绕组的通电顺序(改变电流方向)
- 步进电机的极性区分
- 步进电机驱动原理
(1)双极性步进电机:由于A、B其中只有一个有高低电平差得电,例如A+为高电平,A-为低电平,N极与S极会反向,两者之间会产生作用力使得转子转动一定角度,从而带动整个电机转动(单向) 。 而双向,则是改变了步距角,且A与B两组均产生高低电平差异。
(2) 单极性步进电机: 单极性的电机电流方向不可变,公共端必须一直处于通电状态,然后改变其它端的通电情况即可。
3、步进电机技术指标
1、静态技术指标 :相数(线圈数量)、拍数(完成磁场变化所需的脉冲数)(可以同时通电的组数)、步距角(一个脉冲电机旋转的角度)、定位转距(电机各相绕组不通电且处于开路状态时,由于混合式电机转子上有永磁材料产生磁场,从而产生的转距)、静转距(步进电机在通电但无转动时,定子锁住转子的力距)。
2、动态技术指标: 步距角精度、失步(负载太大或者频率过快会导致)、失调角、最大空载起动频率、最大空载运行频率、运行转矩特性、电机正反转控制。
360/5.625*64=4096
按下KEY1调节电机旋转方向,按下KEY2电机加速,按下KEY3电机减速
- #include <stdio.h>
-
- typedef unsigned char u8;
- typedef unsigned int u16;
-
- sbit IN1_D=P1^0;
- sbit IN1_C=P1^1;
- sbit IN1_B=P1^2;
- sbit IN1_A=P1^3;
-
- sbit KEY1=P3^1;
- sbit KEY2=P3^0;
- sbit KEY3=P3^2;
- sbit KEY4=P3^3;
-
- #define KEY1_PRESS 1
- #define KEY2_PRESS 2
- #define KEY3_PRESS 3
- #define KEY4_PRESS 4
- #define KEY_UNPRESS 0
-
- #define STEPMOTOR_MAXSPEED 1 //表示电机所能允许的最大速度(延时最短)
- #define STEPMOTOR_MINSPEED 5//表示电机所能允许的最小速度(延时最大)
-
- //10us级延时
- void delay_10us(u16 ten_us){
- while(ten_us--);
- }
-
- //ms级延时
- void delay_ms(u16 ms){
- u16 i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
-
- //按键扫描 mode为0表示单值扫描,为1表示连续扫描
- u8 key_scan(u8 mode){
- static u8 key=1;
- if(mode) key=1;
- if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
- {
- delay_10us(1000); //消抖
- key=0;
- //判断四个按键中哪一个按键被按下
- if(KEY1==0){
- return KEY1_PRESS;
- } else if(KEY2==0){
- return KEY2_PRESS;
- } else if(KEY3==0){
- return KEY3_PRESS;
- } else if(KEY4==0){
- return KEY4_PRESS;
- }
- } else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
- key=1;
- }
- return KEY_UNPRESS; //没有按键被按下
- }
-
- //step 表示步数 dir表示方向
- void step_motor_28BYJ48_send_pulse_(u8 step,u8 dir){
- u8 temp=step;
- //dir为0表示方向变化,通过temp中间变量让其倒过来,实现反向的功能
- if(dir==0)
- temp=7-step;
- switch(step){
- case 0: IN1_A=1;IN1_B=1;IN1_C=1;IN1_D=0; break;
- case 1: IN1_A=1;IN1_B=1;IN1_C=0;IN1_D=0; break;
- case 2: IN1_A=1;IN1_B=1;IN1_C=0;IN1_D=1; break;
- case 3: IN1_A=1;IN1_B=0;IN1_C=0;IN1_D=1; break;
- case 4: IN1_A=1;IN1_B=0;IN1_C=1;IN1_D=1; break;
- case 5: IN1_A=0;IN1_B=0;IN1_C=1;IN1_D=1; break;
- case 6: IN1_A=0;IN1_B=1;IN1_C=1;IN1_D=1; break;
- case 7: IN1_A=0;IN1_B=1;IN1_C=1;IN1_D=0; break;
- }
- }
-
- void main(){
- u8 key=0; //保存按键返回值
- u8 dir=0; //表示电机转动方向
- u8 step=0; //用于记录步骤并循环
- u8 speed=STEPMOTOR_MAXSPEED; //用于记录速度
- while(1){
- key=key_scan(0);
- if(key==KEY1_PRESS)
- dir=!dir;
- else if(key==KEY2_PRESS){
- if(speed>STEPMOTOR_MAXSPEED){ //判断速度是否已经到达最大速度(即延时时间不可再减)
- speed-=1;
- }
- } else if(key==KEY3_PRESS){
- if(speed<STEPMOTOR_MINSPEED){ //判断速度是否已经到达最小速度(即延时时间不可再加)
- speed+=1;
- }
- }
- step_motor_28BYJ48_send_pulse_(step++,dir);
- if(step==8) step=0;
- delay_ms(speed);
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。