这个要看你的电机驱动是什么了,不同的驱动电路或者驱动器的编程是不一样的#include#defineunitunsignedint#defineucharunsignedcharsbitkey=P1^1;//定义键盘接线口unsignedcharcodeF_Rotation[4]={0x01,0x02,0x04,0x08};//正转表uchara;voidDelay(unsignedinti)//延时{while(--i);}voidrun()//转11圈子程序{unsignedchari,j;for(j=0;j<176;j++){for(i=0;i<4;i++)//4相{P0=F_Rotation[i];//输出对应的相可以自行换成反转表格Delay(500);//改变这个参数可以调整电机转速}}}voidmain(){while(1){if(key==0){Delay(100);if(key==0){while(!key);run();}}}}转速你自己计算一下在改一下就好了
ZHENG EQU 30H
FAN EQU 31H
NO EQU 32H
AS EQU 33H
SS EQU 34H
ORG 00H
AJMP MAIN
ORG 03H
AJMP SUB_INT0
ORG 30H
MAIN: MOV 10H,#01H
MOV 11H,#03H
MOV 12H,#02H
MOV 13H,#06H
MOV 14H,#04H
MOV 15H,#0CH
MOV 16H,#08H
MOV 17H,#09H
MOV 20H,#50
MOV 21H,#25
MOV 22H,#10
MOV 23H,#05
CLR ZHENG
CLR FAN
CLR NO
CLR AS
CLR SS
MOV R1,#20H
MOV A,@R1
MOV R5,A
MOV IE,#10000001B
SETB IT0
MOV R0,#0FH
LOOP: JNB ZHENG,LP
CALL GO
LP: JNB FAN,LOOP
CALL BACK
AJMP LOOP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(中断)
SUB_INT0:
SCAN: MOV A,P0
CPL A
ANL A,#00011111B
JNZ SCAN1
AJMP SCAN
SCAN1: CALL DELAY1
MOV A,P0
CPL A
ANL A,#00011111B
JZ SCAN
CALL RDKEY
RETI
RDKEY: MOV A,P0
JNB ACC0,STOP
JNB ACC2,REV
JNB ACC1,FOR
JNB ACC3,ADDSPEED
JNB ACC4,SUBSPEED
STOP: SETB NO
RET
FOR: SETB ZHENG
RET
REV: SETB FAN
RET
ADDSPEED:SETB AS
RET
SUBSPEED:SETB SS
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(正转)
GO: CLR ZHENG
CLR FAN
CLR NO
CLR AS
CLR SS
INC R0
MOV A,R0
CJNE A,#18H,GO2
MOV R0,#10H
GO2: MOV P2,@R0
MOV A,@R1
MOV R5,A
CALL DELAY
JB NO,RETURN
JB ZHENG,RETURN
JB FAN,RETURN
JNB SS,GO3
CALL JIAN
GO3: JNB AS,GO4
CALL JIA
GO4: AJMP GO
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(反转)
BACK: CLR ZHENG
CLR FAN
CLR NO
CLR AS
CLR SS
DEC R0
MOV A,R0
CJNE A,#0EH,TT
MOV R0,#17H
SJMP BACK2
TT: CJNE A,#0FH,BACK2
MOV R0,#17H
BACK2: MOV P2,@R0
MOV A,@R1
MOV R5,A
CALL DELAY
JB NO,RETURN
JB ZHENG,RETURN
JB FAN,RETURN
JNB AS,BACK3
CALL JIA
BACK3: JNB SS,BACK4
CALL JIAN
BACK4: AJMP BACK
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(加速)
JIA: MOV A,R1
CJNE A,#23H,JIA1
RET
JIA1: INC R1
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(减速)
JIAN: MOV A,R1
CJNE A,#20H,JIAN1
RET
JIAN1: DEC R1
RET
RETURN:RET
DELAY:
D1: MOV R6,#50
D2: MOV R7,#150
D3: DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1: MOV R6,#60
D4: MOV R7,#100
DJNZ R7,$
DJNZ R6,D4
RET
END
转速:代表发出脉冲频率。
位置:实际上就是代表脉冲个数,具体视步进电机的步距角而定(也就是每发一个脉冲,步进电机所旋转的角度)。
正反转:跟步进电机的相数有关,通过控制相位。
你还是先了解清楚你的步进电机的具体参数 还有步进电机的工作原理吧。
找你说的这种控制方案,是步进电机上还有步进驱动器,然后再通过单片机控制驱动器的。
如果是带驱动器控制,只需要了解驱动器的控制方式就可以了。
内容:1、本程序用于测试4相步进电机常规驱动
2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来
3、速度不可以调节的过快,不然就没有力矩转动了
4、按s4(设置成独立按键模式)可以控制正反转
------------------------------------------------/
#include
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按下触发一次,标志位取反
}
不清楚您具体采用的什么控制器(PLC或是单片机)和什么步进电机。
这里当着您使用的是单片机与5线4相电机
通常情况下控制单片机的4个IO口,使其都为高电平。
再按照一个方向轮流使其中一个IO口变为低电平(间隔这里先为2ms,修改间隔时间可以控制转速),就可以驱动步进电机转起。
以上就是关于c语言编写步进电机程序,正转,反转,有6档转速5转/S、2.5转/S、1.25转/S、1转/S、0.5转/S和、0.25转/S.全部的内容,包括:c语言编写步进电机程序,正转,反转,有6档转速5转/S、2.5转/S、1.25转/S、1转/S、0.5转/S和、0.25转/S.、按键控制步进电机停止启动(C程序)、单片机控制步进电机正反转、转速、位置,用C语言编写,上位机用Vc++6.0编写实现串口通信,C程序如何编写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)