步进电机转速控制.docx
《步进电机转速控制.docx》由会员分享,可在线阅读,更多相关《步进电机转速控制.docx(28页珍藏版)》请在冰豆网上搜索。
![步进电机转速控制.docx](https://file1.bdocx.com/fileroot1/2023-2/3/7b7430bc-85a9-4c02-b613-27f501add64b/7b7430bc-85a9-4c02-b613-27f501add64b1.gif)
步进电机转速控制
步进电机转速控制求助!
小弟学步进电机,哪位大虾可以发给我一个步进电机转速控制的程序,最好有注解的,C语言的更好,定时器控制的要!
/**********************************************************
步进电机正转(转n*30度)
**********************************************************/
voidmotor_ffw(unsignedinttime)
{
unsignedinti,j;
ms30_count=time;
TR1=1;
for(j=0;j<12;j++)
//转n*30度
{
for(i=0;i<8;i++)
//一个周期转30度
{
if(ms30_count<=0)
{
P3=Ffw_Change;//取数据
ms30_count=time;
TR1=0;
}
elseP3=Ffw_Change;
//delayms(time);//调节转速
}
}
//P3=0xf0;//使步进电机掉电
}
/**********************************************************
步进电机反转(转n*30度)
**********************************************************/
voidmotor_rev(unsignedinttime)
{
unsignedinti,j;
ms30_count=time;
TR1=1;
for(j=0;j<12;j++)
//转n*30度
{
for(i=0;i<8;i++)
//一个周期转30度
{
if(ms30_count<=0)
{
P3=Rev_Change;//取数据
ms30_count=time;
TR1=0;
}
elseP3=Ffw_Change;
//delayms(time);//调节转速
}
}
//P3=0xf0;//使步进电机掉电
}
voidMotor_Control()
{
ad_display();
if(receivebuf[0]>receivebuf[1])
{
if(sub<1)
motor_rev(10);
elseif((sub>=1)&&(sub<=3))
motor_rev(5);
elseif((sub>3)&&(sub<=5))
motor_rev
(1);
}
elseif(receivebuf[0] {
if(sub<1)
motor_ffw(10);
elseif((sub>=1)&&(sub<=3))
motor_ffw(5);
elseif((sub>3)&&(sub<=5))
motor_ffw
(1);
}
elseP3=0xf0;
}
/*********************************************
定时中断服务程序
**********************************************/
voidtimer1_int(void)interrupt3
{
TH1=0xdc;
TL1=0x00;
ms10_count++;
ms30_count--;
}
其中sub=abs(receivebuf[0]-receivebuf[1]);
ad_display函数得出AD两个通道receivebuf[0]和receivebuf[1]的值,根据这两个值的差去控制步进电机转速。
用定时器1控制转速,可是电压值在LCD上显示是有差的,但步进电机就是不转!
这是为啥呢?
UID
129693
帖子
3
精华
0
积分
0
阅读权限
10
在线时间
1小时
注册时间
2010-11-27
最后登录
2011-3-18
查看详细资料
TOP
8051
管理员
版主
∙个人空间
∙发短消息
∙加为好友
∙当前离线
2#大中小发表于2011-3-210:
22 只看该作者
;/********************************************************************************
;* 标题:
xl系列单片机实验仪演示程序LCD1602显示步进电机控制器速度方向圈数可调*
;* 文件:
lcd1602dj.asm *
;* 日期:
2006-1-5 *
;* 版本:
3.0(试验通过版)可用xl600-xl1000单片机综合试验仪试验 *
;* 邮箱:
sxj1974@ *
;* 网站:
*
;********************************************************************************
;* 描述:
LCD1602显示步进电机控制器速度方向圈数可调 *
;K1-启动与停止步进电机运行;K2-设定步进电机运行圈数(1-20圈) *
;K3-设定步进电机转动方向;K4-设定步进电机运行速度 *
;步进电机的转速控制分16档,数字越小,转速越快。
*
;7.5度步进电机;周期7.5×4=30度,电机转动一圈需12个周期?
*
;资源:
p1.0-p1.3接反向器74ls14,输出后接步进电机p3.7接小喇叭提供按键音 *
;p1.4-p1.7接端口按键:
lcd1602插入实验仪 *
;********************************************************************************
;*【版权】Copyright(C)深圳市学林电子有限公司 *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*
;* 【技术支持】请访问 官方论坛 *
;********************************************************************************/
K1 EQU P1.4 ;K1键
K2 EQU P1.5 ;K2键
K3 EQU P1.6 ;K3键
K4 EQU P1.7 ;K4键
BA EQU P1.0 ;步进电机A端
BB EQU P1.1 ;步进电机B端
BC EQU P1.2 ;步进电机C端
BD EQU P1.3 ;步进电机D端
BEEP EQU P3.7 ;蜂鸣器
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
LCD_X EQU 2FH
RATE EQU 32H ;转速档次
D_BUF1 EQU 33H ;显示缓存1
D_BUF2 EQU 34H ;显示缓存2
TEMP EQU 35H ;临时过渡
TURN_NUM EQU 36H ;存放运行圈数
CYCLE EQU 37H ;存放周期数
;--------------------------------------------
ORG 0000H
JMP MAIN
ORG 000BH
JMP INTT0
ORG 0080H
;---------------------------------------------
MAIN:
MOV SP,#60H
ACALL SET_LCD ;显示启动画面
MOV R4,#0FH
MAIN1:
MOV R5,#25 ;延时5S
CALL DELAY2
DJNZ R4,MAIN1
ACALL SET_LCD0
CLR 20H.0 ;转速设置加减标记
SETB 20H.1 ;正转、逆转标记
SETB 20H.2 ;圈数设置加减标记
SETB 20H.3 ;运行与停止标记
SETB 20H.4
MOV R0,#00H
MOV R1,#00H
MAIN2:
MOV TURN_NUM,#5 ;默认转5圈
MOV A,TURN_NUM
MOV LCD_X,#04H
ACALL DATA_CONV ;显示圈数
ACALL SET_LCD1 ;显示STOP
MOV R2,TURN_NUM
MOV CYCLE,#12 ;12个周期,电机转一圈。
MOV RATE,#08H ;预设为中速
MOV A,RATE
MOV LCD_X,#0DH
ACALLDATA_CONV ;显示转速比例
MOV P1,#0F0H
MOV TMOD,#01H
MOV TL0,#33H
MOV TH0,#0F5H
SETB EA
SETB ET0
M_LOOP:
MOV A,CYCLE ;12个周期,电机转一圈。
CJNEA,#00H,LOOP0
MOV CYCLE,#12
DEC R2
MOV A,R2
MOV LCD_X,#04H ;显示剩余圈数
ACALL DATA_CONV
CJNE R2,#00H,LOOP0
CLR TR0
MOV P1,#0F0H
MOV R2,TURN_NUM ;重新送圈数
SETB20H.3 ;STOP
MOV A,R2
MOV LCD_X,#04H ;显示圈数
ACALL DATA_CONV
ACALL SET_LCD1
LOOP0:
JB 20H.1,LOOP0A
ACALL SET_LCDR ;<<
JMP LOOP0B
LOOP0A:
ACALL SET_LCDF ;>>
LOOP0B:
JB K1,LOOP1
JNB 20H.3,LOOP0C
ACALL SET_LCD2 ;RUNNING
SETB TR0 ;启动步进电机运行
CLR 20H.3 ;停止运行标记
CALL BEEP_BL
JMP LOOP1
LOOP0C:
CLR TR0 ;停止步进电机运行
SETB 20H.3 ;启动运行标记
MOV P1,#0F0H
MOV CYCLE,#12
MOV R2,TURN_NUM
ACALL SET_LCD1 ;STOP
CALL BEEP_BL
JMP M_LOOP
LOOP1:
JB K2,LOOP2
CALL BEEP_BL
JNB 20H.2,LOOP1B
MOV A,TURN_NUM ;增加圈数
INCA
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#20,LOOP1A
CLR 20H.2
LOOP1A:
JMP LOOP2
LOOP1B:
MOV A,TURN_NUM ;减少圈数
DECA
MOV TURN_NUM,A
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
MOV R2,TURN_NUM
MOV A,TURN_NUM
CJNE A,#01H,LOOP2
SETB20H.2
LOOP2:
JB K3,LOOP3 ;换向
CLR TR0
MOV P1,#0F0H
SETB20H.3 ;STOP标志
ACALL SET_LCD1
CPL 20H.1 ;换向标志
JB 20H.1,LOOP2A ;根据换向标志来显示转动方向
ACALL SET_LCDR
JMP LOOP2B
LOOP2A:
ACALL SET_LCDF
LOOP2B:
CALLBEEP_BL
MOV R2,TURN_NUM ;换向后,从设定值开始运行
MOV A,R2
MOV LCD_X,#04H ;显示设定圈数
ACALL DATA_CONV
LOOP3:
JB K4,LOOP4
CLR 20H.4 ;在运行过程调整速率时,要使步进电机先停止转动
CALL BEEP_BL
JNB 20H.0,LOOP5
mov temp,CYCLE
MOV A,RATE ;减速过程
INCA
MOV RATE,A
MOV LCD_X,#0DH
ACALLDATA_CONV
MOV A,RATE
CJNE A,#10H,LOOP4
CLR 20H.0
LOOP4:
SETB 20H.4
JMP M_LOOP
LOOP5:
MOV A,RATE ;加速过程
DECA
MOV RATE,A
MOV LCD_X,#0DH
ACALLDATA_CONV
MOV A,RATE
CJNE A,#01H,LOOP6
SETB20H.0
LOOP6:
SETB 20H.4
JMP M_LOOP
;---------------------------------------------
;步进电机正转走一步子程序
;---------------------------------------------
FFW:
MOV A,R0
MOV DPTR,#TABLE_F
MOVC A,@A+DPTR
CJNE A,#00H,FFW1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP FFW2
FFW1:
MOV P1,A
INC R0
FFW2:
RET
;---------------------------------------------
;步进电机逆转走一步子程序
;---------------------------------------------
REV:
MOV A,R0
MOV DPTR,#TABLE_R
MOVC A,@A+DPTR
CJNE A,#00H,REV1
MOV R0,#00H
DEC CYCLE ;每8步为一个周期
JMP REV2
REV1:
MOV P1,A
INC R0
REV2:
RET
;---------------------------------------------
;中断服务子程序
;中断定时2ms
;20H.1=1正转,20H.1=0反转
;---------------------------------------------
INTT0:
PUSH ACC
CLR TR0
MOV TL0,#33H
MOV TH0,#0F5H
SETB TR0
JNB 20H.4,INTT0B ;K4键按下时,停止步进电机运行
INC R3
MOV B,R3
MOV A,RATE ;中断次数来调整延时时间的长短
CJNE A,B,INTT0