步进电机

28BYJ-48步进电机

将脉冲信号转变为角度信号

​ 1. 反应式步进电机:结构简单成本低,发热大可靠性低。

​ 2. 永磁式步进电机:动态性能好、力矩较大,误差相对大一些,价格低,广泛用在消费性产品。

​ 3. 混合式步进电机:力矩大、动态性能好、步距角小、精度高,但是结构复杂价格高,广泛用在工业。

28——步进电机的有效最大外径是28毫米

B——表示是步进电机

Y——表示是永磁式

J——表示是减速型

48——表示四相八拍

步进电机

​ A、B、C、D 为四相,八个定子
​ 内部转子上含有永磁铁(0-5)

8个节拍转一个定子角度,则转一圈需要64个节拍

步进角度为:360 / 32 = 11.25度

​ 每次开关只合上一个,即为单四拍模式

步进电机

步进电机

由启动频率知道,我们相邻两个低电平的导通时间要小于启动频率,即 1/550=1.8ms,即导通时间间隔大于1。8ms即可。

​ 代码中: 参数(angle)中总共需要转动的角度,beats 为总共转动的节拍数,因为减速比是1:64,所以转一圈节拍数为 64*64=4096个节拍,那么总共的节拍数为:(angle / 360) * 4096

void TrunMotor(unsigned long angle)
{
	unsigned char tmp;
	unsigned char index = 0;
	unsigned long beats = 0;
	unsigned char code BeatCode[8] = {
	0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};

	beats = (angle*4076)/360;
	while(beats--)
	{
		tmp = P1;
		tmp = tmp & 0xF0;
		tmp = tmp | BeatCode[index];			 
		P1 = tmp;
		index++;
		index = index & 0x07;
		delay();
	}
}

使用定时器中断的控制函数:

void main()
{
	EA = 1;
	TMOD = 0x01;
	TH0 = 0xF8;//定时2ms
	TL0 = 0xCD;
	ET0 = 1;
	TR0 =1;

	StartMotor(360*2 + 180);
	while(1);
}

void StartMotor(unsigned long angle)
{
    /*
    	处理long型的数据,为消除中断对程序的影响,在处理之前 应该先关掉中断
    */
	EA = 0;
	beats = (angle*4076)/360;
	EA = 1;
}

void InterruptTimer0() interrupt 1
{
	unsigned char tmp;
	static unsigned char index = 0;//次变量需要进出中断处理,应定义成静态的
	unsigned char code BeatCode[8] = {
	0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};

	TH0 = 0xF8;//重新赋值
	TL0 = 0xCD;

	if(beats != 0)
	{
		tmp = P1;
		tmp = tmp & 0xF0;
		tmp = tmp | BeatCode[index];			 
		P1 = tmp;
		index++;
		index = index & 0x07;
		beats--;
	}
	else
	{
		P1 = P1 | 0x0F;//当节拍数没了之后,对P1口进行赋值以使电机停止转动
	}

}
上一篇:Linux下的虚拟Bridge实现


下一篇:一个大佬的算法刷题笔记(无套路分享)