工具
1.Proteus 8 仿真器
2.keil 5 编辑器
原理图
讲解
简介
步进电机是一种将电脉冲转换为角位移的开环控制元步进电机。当步进驱动器接收到脉冲信号时,它将根据设定方向(即步进角)驱动步进电机旋转一定角度。 可以通过控制脉冲量来控制角位移量,从而达到精确定位的目的,同时还可以通过控制脉冲频率来控制电机的转速和加速度,从而达到速度控制的目的。
分类
永磁体(PM):一般为两相,扭矩和体积均较低,步进角为 7.5 度或 15 度.
反应式(VR):一般为三相,可实现大扭矩输出,步进角度一般为 1.5 度,但噪音和振动相当大.
混合式(HB) : 它结合了永磁体和反应的优点,分为两相和五相:两相步进角为 1.8 度,五相步进角一般为 0.72 度。 这种步进电机使用更广泛。
静态指标
步距角
在每次控制系统发出一个步进脉冲信号,某个永磁步进电机的固定角度为3.75°/ 7.5°(半步驱动值为 3.75°,整步驱动为 7.5°)。步进角可以称为“步进电机的固定角度”,它不一定是工作电机的实际角度,实际角度与驱动器有关。
相数
它指的是电机内部的线圈组数。 目前,常用的步进电机是两相,三相,四相和五相电机。 电动机的步进角随相数而变化。通常,两相电动机的步进角为 0.9°/ 1.8°,三相为 0.75°/ 1.5°,五相为 0.36°/ 0.72°。 当没有细分驱动器时,用户主要通过选择不同的相数电机来满足步进角的要求。 如果使用细分驱动程序,相位数的“数字”将变得毫无意义,用户只需要更改细分数量的驱动器,然后可以移动步进角度。
拍数
它指的是完成磁场周期性变化所需的脉冲数或导通状态,也可以定义为电机转动一定步进角的脉冲数。让我们以四相电机为例,四相和四拍运行模式,即: AB-BC-CD-DA-AB,四相和八拍运行模式为: A - AB - B - BC - C - CD - D - DA - A。
动态指标
步进脚精度
它指的是当电动机转动一定步进角时,实际值与理论值之间的误差。 表示为百分比:角度误差/步进角* 100%。 此值随节拍数量的变化而变化,当电机运行 4 次,应该在 5%以内,8 次在 15%以内
失步
电机运转时运转的步数,不等于理论上的步数。称之为失步。
失调角
转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。
驱动方式
步进电机的驱动模式也称为激励模式,分为全步激励和半步激励。 前者也可分为全步单相和全步双相激励(全步驱动); 后者也指单相双相激励(半步驱动)
驱动模式 | 步距角 | 功率 | 优点和缺点 |
---|---|---|---|
全步(单相) | 5.625 | 1P | 控制简单,耗电量低,但输出扭矩最小,振动较大,步进时易疏离 |
全步(双相) | 5.625 | 2P | 功耗最大,输出扭矩大,振动小,步进稳定 |
半步(单双相) | 2.8125 | 1.5P | 在单驱动和驱动步骤之间采取的性能,只有步进角的一半,运行平稳,应用最为广泛 |
全步(单相)
全步(双相)
半步(单双相)
注意
具体的驱动模式可能因步进电机的设计、控制器的功能以及应用需求而有所不同。在实际应用中,可能还需要考虑电流控制、速度控制以及可能的定位精度要求。
代码
#include <reg52.h>
#include "Delay.H"
#include "LCD1602.H"
unsigned int type=0;//键值 1=开始 2=停止
unsigned int time = 300; //PWM高电平持续时间
unsigned int run = 0; //0 正转(顺时针) 1 反转(逆时针)
//半步驱动
unsigned char arr[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned int i=7;
void PWM();
void Int0Init() //中断初始化
{
//设置 INT0
IT0=1;//触发方式(下降沿)
EX0=1;//INT0 的中断允许。 1关闭
EA=1;//打开总中断
}
//当触发中断后即会进入中断服务函数,外部中断 0 中断服务函数如下:
void Int0() interrupt 0 //外部中断 0 的中断函数
{
//中断进入
switch (P3){
//开始按下
case 0xF3:
if(!i)
{
i=0;
}
type=1;
break;
//停止按下
case 0xEB:
type=2;
break;
//反转按下
case 0xDB:
run=!run;
break;
//加速按下
case 0xBB:
if(time>100)
{
time=time-100;
}
break;
//减速按下
case 0x7B:
if(time<300)
{
time=time+100;
}
break;
default:
break;
}
LCD_ShowNum(2,6,time,3);
}
//PWM 调制
void PWM()
{
switch(type){
case 0:
break;
case 1:
delay_ms(time);
P1=arr[i];
if(!run)
{
if(i==0)
{
i=7;
}else{
i--;
}
}else{
if(i==7)
{
i=0;
}else{
i++;
}
}
break;
default:
break;
}
}
main(void)
{
LCD_Init(); //初始化液晶
Int0Init();
LCD_ShowString(1,1,"Old_man");
LCD_ShowString(2,1,"time=");
LCD_ShowNum(2,6,0,3);
P1=0;
while(1)
{
if(type)
{
PWM();
}
}
}
实现
🚀本欧也处于学习阶段,所学所识将以笔记发布。
笔记会根据相关知识的接触而随时更新!
如果文章对你有帮助,请留下你宝贵的点赞吧👍
V:Werluo 本欧也很喜欢交朋友的哦!