步进电机控制程序

步进电机控制程序,第1张

AT89C51单片机,步进电机驱动器L298N驱动,实现单片机识别并输出显示键盘输入的数据信息(转角)并产生连续脉冲控制步进电机转动,电机型号是两相步进电动机42BYG121,其步进角为18度,通过半步驱动方式进行细分可获得09度的步进角;环形分配器和电机驱动器

控制器接收到上位机的命令后,首先获取需要转动的步数,然后根据相应命令打开相应定时器的计数功能。控制程序中用定时器1控制二路脉冲输出,定时器2控制一路脉冲输出,从而完成3路电机的控制。    定时器2使用CTC模式,匹配中断使能。通过匹配中断,在OCR2端口可以输出脉冲,通过设定寄存器OCR2寄存器的值可以改变输山脉冲频率。定时器1使用相位与频率修正模式

键则反向转1~9圈;左键固定正转90度,右键固定反转90;Esc 键终止转动。通过这个程序,我们也可以进一步体会到如何用按键来控制程序完成复杂的功能,以及控制和执行模块之间如何协调工作,而你的编程水平也可以在这样的实践练习中得到锻炼和提升。#include <reg52h> sbit KEY_IN_1 = P2

四相电机.驱动如下: 图1是35BY型永磁步进电机的外形图,图2是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将COM端标识为C,只要AC、 C、BC、 C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM端接正电源,那么只要用开关元件(如三极管),将A、 、B、 轮流接地。

下表列出了该电机的一些典型参数:

表1 35BY48S03型步机电机参数

型号 步距角 相数 电压 电流 电阻 最大静转距 定位转距 转动惯量

35BY48S03 75 4 12 026 47 180 65 25

有了这些参数,不难设计出控制电路,因其工作电压为12V,最大电流为026A,因此用一块开路输出达林顿驱动器(ULN2003)来作为驱动,通过P14~P17来控制各线圈的接通与切断,电路如图3所示。开机时,P14~P17均为高电平,依次将P14~P17切换为低电平即可驱动步进电机运行,注意在切换之前将前一个输出引脚变为高电平。如果要改变电机的转动速度只要改变两次接通之间的时间,而要改变电机的转动方向,只要改变各线圈接通的顺序。

图1 35BY48S03型步进电机外形图

图2 35BY48S03型步进电机的接线图

图3 单片机控制35BY48S03型步进电机的电路原理图

三、步进电机的驱动实例

要求:控制电路如图3所示,开机后,电机不转,按下启动键,电机旋转,速度为25转/分,按下加1键,速度增加,按下减1键,速度降低,最高速度为100转/分,最低转带为25转/分,按下停止键,电机停转。速度值要求在数码管上显示出来。

1.要求分析

按上面的分析,改变转速,只要改变P10~P13轮流变低电平的时间即可达到要求,这个时间不应采用延时来实现,因为会影响到其他功能的实现。这里以定时的方式来实现。下面首先计算一下定时时间。

按要求,最低转速为25转/分,而上述步进电机的步距角为75,即每48个脉冲为1周,即在最低转速时,要求为1200脉冲/分,相当于50ms/脉冲。而在最高转速时,要求为100转/分,即48000脉冲/分,相当于125ms/脉冲。可以列出下表

表1 步进电机转速与定时器定时常数关系

速度 单步时间(us) TH1 TL1 实际定时(us)

25 50000 76 0 499968

26 48077 82 236 4807418

27 46296 89 86 4629261

28 44643 95 73 44640155

… … … … …

100 12500 211 0 124992

表中不仅计算出了TH1和TL1,而且还计算出了在这个定时常数下,真实的定时时间,可以根据这个计算值来估算真实速度与理论速度的误差值。

表中TH1和TL1是根据定时时间算出来的定时初值,这里用到的晶振是110592M。有了上述表格,程序就不难实现了,使用定时/计数器T1为定时器,定时时间到后切换输出脚即可。

2.程序实现

定义DSB-1A实验板的S1为启动键,S2为停止键,S3为加1键,S4为减1键,程序如下:

StartEnd bit 01H ;起动及停止标志

MinSpd EQU 25 ;起始转动速度

MaxSpd EQU 100 ;最高转动速度

Speed DATA 23H ;流动速度计数

DjCount DATA 24H ;控制电机输出的一个值,初始为11110 111

Hidden EQU 10H ;消隐码

Counter DATA 57H ;显示计数器

DISPBUF DATA 58H ;显示缓冲区

ORG 0000H

AJMP MAIN

ORG 000BH

JMP DISP

ORG 001BH

JMP DJZD

ORG 30H

MAIN:

MOV SP,#5FH

MOV P1,#0FFH

MOV A,#Hidden

MOV DispBuf,A

MOV DispBuf+1,A

MOV DispBuf+2,A

MOV DjCount,#11110111B

MOV SPEED,#MinSpd ;起始转动速度送入计数器

CLR StartEnd ;停转状态

MOV TMOD,#00010001B ;

MOV TH0,#HIGH(65536-3000)

MOV TL0,#LOW(65536-3000)

MOV TH1,#0FFH;

MOV TL1,#0FFH

SETB TR0

SETB EA

SETB ET0

SETB ET1

LOOP: ACALL KEY ;键盘程序

JNB F0,m_NEXT1 ;无键继续

ACALL KEYPROC ;否则调用键盘处理程序

m_NEXT1:

MOV A,Speed

MOV B,#10

DIV AB

MOV DispBuf+5,B ;最低位

MOV B,#10

DIV AB

MOV DispBuf+4,B

MOV DispBuf+3,A

JB StartEnd,m_Next2

CLR TR1 ;关闭电机

JMP LOOP

ORL P1,#11110000B

m_Next2:

SETB TR1 ;启动电机

AJMP LOOP ;主程序结束

;---------------------------------------

D10ms:

……

;---------延时程序,键盘处理中调用

KEYPROC:

MOV A,B ;获取键值

JB ACC2,StartStop ;分析键的代码,某位被按下,则该位为1

JB ACC3,KeySty

JB ACC4,UpSpd

JB ACC5,DowSpd

AJMP KEY_RET

StartStop:

SETB StartEnd ;启动

AJMP KEY_RET

KeySty:

CLR StartEnd; ;停止

AJMP KEY_RET

UpSpd:

INC SPEED;

MOV A,SPEED

CJNE A,#MaxSpd,K1 ;到了最多的次数?

DEC SPEED ;是则减去1,保证下次仍为该值

K1:

AJMP KEY_RET

DowSpd:

DEC SPEED

MOV A,SPEED

CJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回

MOV SPEED,#MinSpd;

KEY_RET:

RET

KEY:

……获取键值的程序

RET

DjZd: ;定时器T1用于电机转速控制

PUSH ACC

PUSH PSW

MOV A,Speed

SUBB A,#MinSpd ;减基准数

MOV DPTR,#DjH

MOVC A,@A+DPTR

MOV TH1,A

MOV A,Speed

SUBB A,#MinSpd

MOV DPTR,#DjL

MOVC A,@A+DPTR

MOV TL1,A

MOV A,DjCount

CPL A

ORL P1,A

MOV A,DjCount

JNB ACC7,d_Next1

JMP d_Next2

d_Next1:

MOV DjCount,#11110111B

d_Next2:

MOV A,DjCount

RL A

MOV DjCount,A ;回存

ANL P1,A

POP PSW

POP ACC

RETI

DjH: DB 76,82,89,95,100,106,110,115,119,123,12……

DjL: DB 0,236,86,73,212,0,214,96,163,165

……

DISP: ;显示程序

POP PSW

POP ACC

……

RETI

BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH

DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH

END

3.程序分析

本程序主要由键盘程序、显示器程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,将显示器的高3位消隐,步进电机驱动的各引脚均输出高电平,然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序,否则直接转下一步。下一步是将当前的转速值转换为BCD码,送入显示缓冲区;接着判断StartEnd这个位变量,是“1”还是“0”,如果是“1”,则开启定时器T1,否则关闭定时器T1,为防止关闭时某一相线圈长期通电,因此,在关闭定时器T1时,将P10~P13均置高。至此,主程序的工作即结束。这里为简便起见,这里没有做高位“0”消隐的工作,即如果速度为10转/分,则显示值“010”,读者可以自行加入相关的代码来处理这一工作。

步进电机的驱动工作是在定时器T1的中断服务程序中实现的,由前述分析,每次的定时时间到达以后,需要将P10~P13依次接通,程度中用了一个变量DjCntr来实现这一功能,在主程序初始化时,该变量被赋予初值11110111B,进入到定时中断以后,将该变量取出送ACC累加器,并在累加器中进行左移,这样,该数值就变为1110 1111,然后将该数与P1相“与”,此时,P14即输出低电平,第二次进入中断时,先将该数取反,成为 0001 0000,然后将该数与P1相“或”,这样,P14即输出高电平,关断了相应的线圈,然后将该数重新取出,并作左移,即 1110,1111右移成为1101 1111,将该数与P1相“与”,这样P15即输出低电平,依次类推,P17~P14即循环输出低电平。当这一数据变为0111 1111后,需要作适当的改动,将数据重新变回 1111 0111,进行第二次循环,相关代码,请读者自行分析。

定时时间又是如何确定的呢?这里用的是查表的方法,首先用Excel计算得出在每一种转速下的TH值和TL值,然后,分别放入DjH和DjL表中,在进入T1中断程序之后,将速度值变量Speed送入累加器ACC,然后减去基数25,使其基数从0开始计数,然后分别查表,送入TH1和TL1,实现重置定时初值的目的。

看完这一部份内容以后,请读者自行完成以下工作:

1. 更改程序,将S1定义为“启动/停止”,而S2定义为“方向”,按下S2,切换电机旋转方向。

2. 更改程序,要求转速从1到100。

3. 更改程序,实现首位无效零消隐。

你这个问题要写好多代码。

给你个思路吧。

1/打开通讯端口,

2赋值给PLC

3,/ PLC取值,然后判断各种条件

4,PLC发出指令。

完事了。

步进电机编程一般有几点。细分数,结构比例,加速度,减速度。最大频率限值,最小起跳频率。

1:原点。

2:速度,距离(相对位置,绝对位置)。速度模式

3:停止。等待

如果多轴的或开关,传感器比较多的位置控制就比较复杂了。有很多变量和跳转。这取决于控制器功能和底层程序开发和运用。

根据你问的情况,应该是写上层程序。中层都已经做好了,写程序需要对使用的芯片和代码非常熟悉,逻辑关系比较了解,运动结构也有一定的认知。

我没有写过PLC的,只写过单片机的哦你网上搜下,蛮多的,主要是理解了就好步进嘛,就是你给它一个突变的信号,它就走一步的,不然就不叫步进撒也就是你触发它一下,它跑一步,且只跑一步的哦懂了吧?

内容:1、本程序用于测试4相步进电机常规驱动

2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来

3、速度不可以调节的过快,不然就没有力矩转动了

4、按s4(设置成独立按键模式)可以控制正反转

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

#include <reg52h>

bit Flag;//定义正反转标志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格

//

/ 延时函数 /

//

void Delay(unsigned int i)//延时

{

while(--i);

}

//

/ 主函数 /

//

main()

{

unsigned char i;

EX1=1; //外部中断0开

IT1=1; //边沿触发

EA=1; //全局中断开

while(!Flag)

{

P0=0x71;//显示 F 标示正转

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

{

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

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

}

}

while(Flag)

{

P0=0x7C;//显示 b 标示反转

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

{

P1=B_Rotation[i]; //输出对应的相

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

}

}

}

//

/ 中断入口函数 /

//

void ISR_Key(void) interrupt 2 using 1

{

Delay(300);

Flag=!Flag; //s3按下触发一次,标志位取反

}

汇川am600编写控制步进电机程序步骤。

1、在程序中定义步进电机的引脚,如定义4个控制引脚:A,B,C,D,用来控制步进电机转向。

2、定义步进电机的类型,如定义为双向旋转的全步进电机。

3、确定步进电机的转动速度,如定义每一步的时间为100毫秒,也可以设置较快的速度。

4、根据步进电机的转动特点,编写对电机运行的控制程序,编程控制A,B,C,D引脚的电平变化,从而实现步进电机的转动。

5、编写定时器中断程序,以实现步进电机精确的控制,定时器中断程序可以控制步进电机的速度和方向,并可以根据设定的时间来控制转动的步数。

6、实现步进电机的停止控制,在程序中定义停止控制的端口,当电平变化时,步进电机会停止转动。

7、最后,需要编写程序的测试程序,以检查程序的正确性和完整性。

以上就是关于步进电机控制程序全部的内容,包括:步进电机控制程序、步进电机高手请进!!、通过VB中的TEXT输入数据,把数据送到arduino单片机,用于步进电机的调速等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10215482.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存