sTC单片机 用定时器定时 来控制步进电机 驱动器L298求 源码 可调速

sTC单片机 用定时器定时 来控制步进电机 驱动器L298求 源码 可调速,第1张

/-----------------------------------------------

名称:步进电机实验

编写:shifang

日期:201312

修改:无

内容:本程序用于测试两个4相步进电机常规驱动 用矩阵键盘 调节速度

      红外传感器 测速

1602液晶显示 1-30速度等级,数字越大,速度越大

------------------------------------------------/

#include <reg52h>

#include"LCD1602h"

#include "jzhjph"

sbit cesu1=P3^2;

sbit cesu2=P3^3;

unsigned char code table[11]="0123456789";// 显示段码值0~9

unsigned char code table1[]="A:";   //电机1正转加减速等级

unsigned char code table2[]="B:";   //电机1反转加减速等级

uint count=0;   //外部中断0计脉冲定义变量

uchar temp1=0;   //定时器1计数定义变量

long int v1;   //电机1的速度

void Init_Timer0(void);   //定时器中断初始化函数

/------------------------------------------------

                  主函数

------------------------------------------------/

void main()

{

unsigned char num1,num2;

Init_Timer0();   //定时器中断初始化

LCD_init();   //LCD1602初始化

write_com(0x80);   //显示A:

for(num1=0;num1<2;num1++)

{

write_data(table1[num1]);

delay(5);

}

write_com(0x80+0x40);   //显示B:

for(num2=0;num2<2;num2++)

{

write_data(table2[num2]);

delay(5);

}

Coil_OFF //初始化全部断电

while(1)

{

write_com(0x82); //显示电机1正转加速值

write_data(table[Speed/10]);

write_data(table[Speed%10]);

write_com(0x80+0x42); //显示电机1反转加速值

write_data(table[Speed1/10]);

write_data(table[Speed1%10]);

write_com(0x80+11); //显示电机1速度值

write_data(table[v1/100]);

write_data(table[v1%100/10]);

write_data(table[10]);

write_data(table[v1%10]);

keyscan();   //矩阵键盘扫描

}

}

/------------------------------------------------

                  定时器初始化子程序

------------------------------------------------/

void Init_Timer0(void)

{

TMOD |= 0x11;            //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响  

//TH0=0x00;            //给定初值

//TL0=0x00;

TH1=(65536-100000)/256;    //给定初值50ms

TL1=(65536-100000)%256;

ET1=1;                     //定时器1中断打开

PT0=1;                     //优先级打开

EA=1;                      //总中断打开

IT0=1;                     //1表示边沿触发

IT1=1;                     //1表示边沿触发

}

/------------------------------------------------

               定时器0中断子程序

------------------------------------------------/

void Timer0_isr(void) interrupt 1

{

static unsigned char times,i;

static unsigned char times1,j;

TH0=(65536-500)/256;  //重新赋值 05ms

TL0=(65536-500)%256;

if(flag==1)  //电机1正转

{

if(times==(50-Speed))

{

times=0;

switch(i)

{

case 0:Coil_a1;i++;break;

case 1:Coil_ab1;i++;break;

case 2:Coil_b1;i++;break;

case 3:Coil_bc1;i++;break;

case 4:Coil_c1;i++;break;

case 5:Coil_cd1;i++;break;

case 6:Coil_d1;i++;break;

case 7:Coil_da1;i++;break;

case 8:i=0;break;

default:break;

}  

}

else

times++;

}

if(flag1==1) //电机1反转

{

if(times1==(50-Speed1))

{

times1=0;

switch(j)

{

case 0:Coil_da1;j++;break;

case 1:Coil_d1;j++;break;

case 2:Coil_cd1;j++;break;

case 3:Coil_c1;j++;break;

case 4:Coil_bc1;j++;break;

case 5:Coil_b1;j++;break;

case 6:Coil_ab1;j++;break;

case 7:Coil_a1;j++;break;

case 8:j=0;break;

default:break;

}

}

else

times1++;

}

}

/------------------------------------------------

               定时器0中断子程序

------------------------------------------------/

void time1() interrupt 3

{

TH1=(65536-10000)/256; //重装初值10ms

TL1=(65536-10000)%256;

temp1++;

if(temp1==100)   //1s采样1次

{

temp1=0;

v1=count3;      //速度单位:转/min

count=0;  //v=(count/20/1)60=count3;

}

}

/--------------------------------------------------

外部中断0子程序

---------------------------------------------------/

void ISR_INT0(void) interrupt 0

{

if(cesu1==0)  //电机1码盘脉冲计数

{

delay(5);

if(cesu1==0)

{

count++;

}

while(!cesu1);

}

}

显示部分你自己弄一下

M206:正转

M207:反转

Y0:脉冲输出

Y1:反转信号

D4200:频率(用于控制速度,数据来源于触摸屏)

K99999999:脉冲数量

K100:加速时间

如果调速要求不高,建议你使用S7-200 的PID指令,在输出方式中选择“数字量输出”

是一个固定周期的PWM 信号,需要在输出参数中设定 周期。

0~5V作为PID指令的输入参数

这样PID的输出 就是一个高速脉冲输出信号

将这个PID高速脉冲信号 映射到 Q00 或 Q01就可以了。

不过这个方式,脉冲频率不会很高。

比较理想的方式:

1)变频器+异步变频电机

2)直流调速器+直流电机

3)伺服驱动器+伺服电机

51单片步进电机控制原理与控制设计程序

51单片步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称vr)、永磁式步进电机(简称pm)和混合式步进电机(简称hb)。

51单片步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。

51单片步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。其基本原理作用如下:

(1)控制换相顺序

通电换相这一过程称为脉冲分配。例如:三相步进电机的三拍工作方式,其各相通电顺序为a-b-c-d,通电控制脉冲必须严格按照这一顺序分别控制a,b,c,d相的通断。

(2)控制步51单片进电机的转向

如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。

(3)控制51单片步进电机的速度

如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。两个脉冲的间隔越短,步进电机就转得越快。调整单片机发出的脉冲频率,就可以对步进电机进行调速。步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

步进电机控制程序设计三要素速度、方向、加速度。

步进电机控制程序是一个电脑的控制程序,用来控制电机的运行。

很多人都认为步进电机是不能精密分度的,把伺服电机的驱动方法过于的神化。就本人用步进电机做分度盘的经验来看,其实你只要懂得怎么去用步进电机,懂得怎么去写程序,正常情况下的分度精度还是可以保证的。

步进电机不管在什么场所应用,有一点是必须要保证就是有足够的扭矩。步进电机就是一个大马拉小车的东西。

正常情况下的启动时间,一般来说应尽可能的拉长一些。启动的速度也不可以太快。启停过快都可能会引起过冲的现象。在使用过程中,如果分度不完整,也就是正常要走一圈的,但是发现怎么弄都差那么一点点,也就是有一个接缝,这种情况就是有传说中的失步。解决失步的方法不外乎如下几点:

增加电机扭矩,加大驱动器的电流;

降低运行的最大转速;

拉长启动时间;

减小启动转速。

如果以上都没有问题,那么就有可能是程序里面带有无法分完的余数脉冲所产生的累计误差了。

众所周知,脉冲是以整数来计算,没有哪里会出现半个脉冲的说法。但是往往就是这半个脉冲出了问题,如果一个圆分10等份,每个等份差半个脉冲不算个什么。20个等份,每个等份差半个脉冲可能也不是特别明显。但是要分到50个,100个,500个,nnn个等份时,这样每个等份差半个脉冲可就不是一个小数目了。在等份数越多时,就算是每个等份差01个脉冲,都是一个天文数字。这就是很多人都认为步进电机无法做出精密的分度盘的原因了。这不仅仅是进步电机,就算是伺服电机,同样也存在这个问题----余数。

sbit K1=P1^0;

sbit K2=P1^1;

char y=0;

while(1)

{

pangduan();

for(i=0;i<4;i++) //4相

{

/P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格

Delay(500); //改变这个参数可以调整电机转速

Delay(5000);/

P1=B_Rotation[i];

Delay(265+y);

P1=F_Rotation[i];

Delay(265+y);

}

}

void pangduan()

{

if(K1==0)

{ y++; //加

while(~k1)

}

if(K2==0)

{ y--;

while(~k2); //减

}

}

}

没有下上限 要是调的话 需要判断显示延时时间

以上就是关于sTC单片机 用定时器定时 来控制步进电机 驱动器L298求 源码 可调速全部的内容,包括:sTC单片机 用定时器定时 来控制步进电机 驱动器L298求 源码 可调速、PLC 控制步进电机的加速程序怎么写、如何用S7-200PLC的模拟量输入控制步进电机调速等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10124435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存