51单片机,步进电机怎么实现循环正反转

发布网友 发布时间:2022-04-25 20:58

我来回答

5个回答

热心网友 时间:2022-06-17 08:23

以下程序是我在实验中自己编写的,几乎全部都有详细注释,相信学过单片机的同学完全可以轻易读懂。
读者可进行一些修改,比如我使用的都是跳转指令,在进入加减速循环中读者完全可以改成调用指令。电机速度也可修改为无上下限。
并且判断按键过程也可有自己的方法,我的判断按下松开可能会比较麻烦。
数表中我设置的是每个脉冲转过9°,大家也可按照实际需要修改自己的数表。
这个程序我是参考了《单片机实用系统设计与仿真经典实例》(主编:周景润 刘晓霞)的P25,读者有兴趣可以去图书馆借阅此书。

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV 30H,#05H;加减速速度控制,控制延时循环次数(初值)
MOV DPTR,#TAB1;查表法对P2赋值
MOV R0,#03H;P2初值
MOV R4,#00H;查表指针值
MOV P2,R0;赋值
WAIT: MOV P0,#0FFH;P0需先输出一个1才可输入
JNB P0.0,SONG3;检测按键是否按下,SONG的意思是按键是否松开,否则程序会混乱
JNB P0.1,SONG4;程序中SONG均是上述意思
SJMP WAIT;如果不按键就不启动
SONG3:JB P0.0,ZHENG;进入正转
SJMP SONG3;
SONG4:JB P0.1,FAN;进入反转
SJMP SONG4;
ZHENG:MOV R4,#01H;开始查表
LOOP1:JB P0.1,YUNXING1;检测是否要反转,如果未按反转键就正常运行
SONG1:JNB P0.1,FAN;按下反转松开后进入反转
SJMP SONG1;
YUNXING1:MOV A,R4;查表
MOVC A,@A+DPTR;
MOV P2,A;
ACALL DELAY;进入延时程序控制电机速度
JB P0.3,COOL1;检测是否按下减速按键,如果未按下再检测是否按下加速按键
SONG5:JNB P0.3,DOWN1;按下后进入延时程序中修改循环次数
SJMP SONG5;
COOL1:JB P0.2,NOMAL1;检测是否按下加速按键,未按下就正常运行
SONG6:JNB P0.2,UP1;按下加速键进入延时程序中修改循环次数
SJMP SONG6;
NOMAL1: INC R4;查下一个数据
CJNE R4,#09H ,LOOP1;表中数据查完一遍后将R4值复位,如未查完就不复位R4
SJMP ZHENG;使正转循环
FAN: MOV R4,#07H;反转R4初值
LOOP2:JB P0.0,YUNXING2;检测是否按下正转按键,如未按下正常运行反转程序
SONG2:JNB P0.0,ZHENG;按下正转后松开按键进入正转程序
SJMP SONG2;
YUNXING2:MOV A,R4;开始查表
MOVC A,@A+DPTR;
MOV P2,A;
ACALL DELAY;进入延时程序控制电机速度
JB P0.3,COOL2;检测是否按下减速按键如未按下就检测是否按下加速按键
SONG7:JNB P0.3,DOWN2;按下后进入延时程序中修改循环次数
SJMP SONG7;
COOL2:JB P0.2,NOMAL2;检测是否按下加速按键,未按下就正常运行
SONG8:JNB P0.2,UP2;按下后进入延时程序中修改循环次数
SJMP SONG8;
NOMAL2:DEC R4;循环查表
CJNE R4,#00H,LOOP2;数据查完一遍后复位重新查
SJMP FAN;反转循环
DELAY: MOV R6,#05H;
DD1: MOV R5,#080H;
DD2:MOV R7,#05H;
DD3:DJNZ R7,DD3;
DJNZ R5,DD2;
DJNZ R6,DD1;固定延时
DJNZ R1,DELAY;通过改变延时程序的循环次数来控制电机速度
SPEED:MOV R1,30H;每次循环都将速度值放在R1中
SJMP BACK;
DOWN1:INC 30H;速度减,因为循环次数+1
CJNE R1,#10H,NOMAL1;速度下限10,如果不到10可继续减速
MOV 30H,#10H;如果达到下限,无法减速,始终是10
SJMP NOMAL1;返回正转循环中
UP1:DEC 30H ;速度加,因为循环次数-1
CJNE R1,#01H,NOMAL1;速度上限1,如果不到1可继续加速
MOV 30H,#01H;如果速度到达上限,不可再加速,始终是1
SJMP NOMAL1;返回正转循环
DOWN2:INC 30H;速度减,因为循环次数+1
CJNE R1,#10H,NOMAL2;速度下限10,如果不到10可继续减速
MOV 30H,#10H;如果达到下限,无法减速,始终是10
SJMP NOMAL2;返回反转循环中
UP2: DEC 30H ;速度加,因为循环次数-1
CJNE R1,#01H,NOMAL2;速度上限1,如果不到1可继续加速
MOV 30H,#01H;如果速度到达上限,不可再加速,始终是1
SJMP NOMAL2;返回反转循环中
BACK: RET;延时子程序返回
TAB1:DB 00H,02H,06H,04H
DB 0CH,08H,09H,01H,03H ;控制各项通电顺序的数值表
END ;结束

热心网友 时间:2022-06-17 08:23

单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制:
while(1)
{
for(i=0;i<4;i++)
{
if(fx==1)P0=step[i]; //正向
else P0=step[3-i]; //反向
delay(x); //x大小决定电机速度

热心网友 时间:2022-06-17 08:24

单片机控制步进电机,我想你说的是两相步进电机,一般是控制其相序分配的顺逆从而控制正反转,一般而言,步进电机相序分配你可以做成一个数组比如step[]={0x03,0x06,0x0c,0x09},这样来说可以假设P0口是步进电机控制口,那么可以按如下方式来控制:
while(1)
{
for(i=0;i<4;i++)
{
if(fx==1)P0=step[i]; //正向
else P0=step[3-i]; //反向
delay(x); //x大小决定电机速度
}
}

热心网友 时间:2022-06-17 08:24

弄一个WHILE循环 按键正反转去掉 改成延时控制或者其他方式控制就可以一直循环了啊,加减速改变方波频率就可以,也有可能你是用延时来输出的,那就改下延时时间。

热心网友 时间:2022-06-17 08:25

一段时间正传,一段时间反转,不断循环就是 不断正反转了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com