步进电机驱动程序(汇编)

合集下载

四相步进电机驱动程序及工作原理

四相步进电机驱动程序及工作原理

四相步进电机驱动程序及工作原理1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。

只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。

图1是该四相反应式步进电机工作原理示意图。

开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。

而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。

依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。

单四拍与双四拍的步距角相等,但单四拍的转动力矩小。

八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:驱动电路:程序:大家对照一下程序就知道,本程序采用了八拍工作方式/***********************************************项目:步进电机正反转(EE01学习板演示程序)**作者:一线工人**网站:电子工程师之家*********************************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};/********************************************************/ /*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/********************************************************/ void delay(uint t){uint k;while(t--){for(k=0; k<123; k++){ }}}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(uint n){uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈{for (i=0; i<8; i++) //一个周期转30度{P0 = FFW; //取数据delay(15); //调节转速}}}/********************************************************/ /*/*步进电机反转/*/********************************************************/ void motor_rev(uint n){uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈{for (i=0; i<8; i++) //一个周期转30度{P0 = REV; //取数据delay(15); //调节转速}}}/******************************************************** ** 主程序**********************************************************/main(){while(1){motor_ffw(5); //电机正转delay(1000); //换向延时motor_rev(5); //电机反转delay(1000); //换向延时}}本文来自: 电子工程师之家。

四相步进电机驱动程序及工作原理

四相步进电机驱动程序及工作原理

四相步进电机驱动程序及工作原理1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。

只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。

图1是该四相反应式步进电机工作原理示意图。

开始时,开关SB接通电源,SA、SC、SD断开,B相磁极与转子0、3号齿对齐,同时,转子的1、4号齿就与C、D相绕组磁极产生错齿,2、5号齿就与D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线与1、4号齿之间磁力线的作用,使转子转动,1、4号齿与C相绕组的磁极对齐。

而0、3号齿与A、B相绕组产生错齿,2、5号齿就与A、D相绕组磁极产生错齿。

依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。

单四拍与双四拍的步距角相等,但单四拍的转动力矩小。

八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:驱动电路:程序:大家对照一下程序就知道,本程序采用了八拍工作方式**项目:步进电机正反转(EE01学习板演示程序)**一线工人**网站:电子工程师之家#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar codeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};/* 延时t毫秒/* 11.0592MHz时钟,延时约1msvoid delay(uint t)uint k;while(t--)for(k=0; k<123; k++)/*步进电机正转void motor_ffw(uint n)uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈for (i=0; i<8; i++) //一个周期转30度P0 = FFW; //取数据delay(15); //调节转速/*步进电机反转void motor_rev(uint n)uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈for (i=0; i<8; i++) //一个周期转30度P0 = REV; //取数据delay(15); //调节转速* 主程序main()while(1)motor_ffw(5); //电机正转delay(1000); //换向延时motor_rev(5); //电机反转delay(1000); //换向延时。

C51汇编中断控制步进电机程序

C51汇编中断控制步进电机程序

C51汇编初学功能:使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。

电路:设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。

②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。

③步进电机的转动控制由外部中断的服务程序来实现。

④当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。

设计参考:①主程序需要设置的中断控制位如下:IT0和IT1 外部中断触发方式控制0=电平1=边沿(下降沿)EX0和EX1 外部中断允许控制0=屏蔽1=允许PX0和PX1 中断优先级级别控制0=低级1=高级在同级别(PX0=PX1)时INT0的优先级高于INT1EA 中断允许总控制0=屏蔽1=允许②外部中断服务程序的入口地址:0003H 外部中断00013H 外部中断1程序:PHASE_OUT EQU 30H ;步进电机相位通电状态VAR_END EQU 31H ;转动次数STACK_INI EQU VAR_END+1ORG 0000H ;复位入口LJMP RESETORG 0003H ;外部中断0 服务程序入口LJMP INT_EX0ORG 000BH ;定时器/计数器0 溢出中断服务程序入口RETIORG 0013H ;外部中断1 服务程序入口LJMP INT_EX1ORG 001BH ;定时器/计数器1 溢出中断服务程序入口RETIORG 0023H ;串行口中断服务程序入口RETIORG 040H ;复位处理程序RESET: MOV SP,#STACK_INI ;设置栈底指针MAIN: SETB IT0SETB IT1SETB EX0SETB EX1SETB PX0SETB PX1MOV PHASE_OUT,#01HMOV VAR_END,#03H ;转动次数为3SETB EASJMP $INT_EX0:MOV R0,VAR_END ;转动次数INTX0: MOV A,PHASE_OUTRR ACJNE A,#80H,I0MOV A,#08HI0: MOV PHASE_OUT,AMOV P1,ADELAY0: MOV R1,#5LP10: MOV R2,#255LP20: MOV R3,#255DJNZ R3,$DJNZ R2,LP20DJNZ R1,LP10DJNZ R0,INTX0RETIINT_EX1:MOV R0,VAR_END ;转动次数INTX1: MOV A,PHASE_OUTRL ACJNE A,#10H,I1MOV A,#01HI1: MOV PHASE_OUT,AMOV P1,ADELAY1: MOV R1,#5LP11: MOV R2,#255LP21: MOV R3,#255DJNZ R3,$DJNZ R2,LP21DJNZ R1,LP11DJNZ R0,INTX1RETIEND。

步进电机启动停止正反转控制程序的汇编语言的实现

步进电机启动停止正反转控制程序的汇编语言的实现

DELAY 1MS MACRO TIME ;延时宏命令LOCAL AALOCAL BBPUSH CXMOV CX,TIMEAA: PUSH CXMOV CX,1000BB: NOPLOOP BBPOP CXLOOP AAPOP CXENDMDA TA SEGMENTTABA DB 01H,03H,02H,06H,04H,05H;正转的模型TABB DB 05H,04H,06H,02H,03H,01H;反转的模型DA TA ENDSCODE SEGMENTZZ PROC NEARPUSH DSMOV AX,DA TAMOV DS,AXMOV AX,0PUSH AXMOV DX,203HMOV AL,80HOUT DX,AL ;8255的控制字设定MOV DX,200HMOV AL,0OUT DX,AL ;先输出制动命令MOV CX,360 ;设定正转步数DD:MOV BL,6 ;六拍MOV DX,200HLEA DI,TABA ;指针指向正转的数字模型CC: MOV AL,[DI]OUT DX,ALDELAY 1MS 10INC DI ;指针加1,指向下一步的数字模型DEC BL ;拍数减1JNZ CC ;六拍未结束,则继续循环LOOP DD;360个周期的六拍未结束,继续循环ZZ ENDPFZ PROC NEARMOV CX,400 ;设定反转步数FF: MOV BL,6MOV DX,200HLEA DI,TABB ;指针指向反转的数字模型EE: MOV AL,[DI]OUT DX,ALDELAY 1MS 10DEC DI ;指针减1,指向反转下一步数字模型DEC BLJNZ EELOOP FFFZ ENDPMOV DX,200HMOV AL,0OUT DX,AL ;结束后,输出制动命令RETMAIN ENDPCODE ENDSEND START。

L298N驱动步进电机程序(带PWM)

L298N驱动步进电机程序(带PWM)

MCU选择的是stm32F103RBT6,步进电机选择4相5线5V步进电机马达减速电机28BYJ-48-5V,驱动选择的是L298N模块,模块供电选择12V供电(5V可能带不起来),模块的OUT1、OUT2接小型步进电机的一个线圈,OUT3、OUT4接另一个线圈,注意L298N模块的GND和MCU 的GND相连。

*******************************************************************************步进电机头文件Stepmotor.h#ifndef __MOTOR_H#define __MOTOR_Hvoid Motor_Init(void);void Motor_Go(void);#endif源文件Stepmotor.c#include "stepmotor.h"#include "sys.h"void Motor_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_8;//PB3接IN1 PB5接IN2 PB7接IN3 PB8接IN4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);//GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_8);******************************************************************************* PWM调制头文件mypwm.h#ifndef __TIMER_H#define __TIMER_H#include "sys.h"void MYTIMER3_Init(u16 arr,u16 psc);void TIM3_PWM_Init(u16 arr,u16 psc);#endif源文件mypwm.c#include " mypwm.h#include "stm32f10x.h"void TIM3_PWM_Init(u16 arr,u16 psc){TIM_OCInitTypeDef TIM_OCInitTypestucture;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstucture;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);//使能PC端口,复用时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PC6接ENA PC7接ENB GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure);//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//TIM_TimeBaseInitstucture.TIM_Period=arr;//自动装载值TIM_TimeBaseInitstucture.TIM_Prescaler=psc;//预分频值TIM_TimeBaseInitstucture.TIM_CounterMode=TIM_CounterMode_Up;//计数模式向上TIM_TimeBaseInitstucture.TIM_ClockDivision=0 ;//TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstucture);TIM_OCInitTypestucture.TIM_OCMode=TIM_OCMode_PWM1 ;//模式1TIM_OCInitTypestucture.TIM_OCPolarity=TIM_OCPolarity_High;//高电平TIM_OCInitTypestucture.TIM_Pulse=599;//改变数值调节占空比TIM_OCInitTypestucture.TIM_OutputState=TIM_OutputState_Enable;//使能TIM_OC1Init(TIM3,&TIM_OCInitTypestucture);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载TIM_OCInitTypestucture.TIM_OCMode=TIM_OCMode_PWM1 ;//模式1TIM_OCInitTypestucture.TIM_OCPolarity=TIM_OCPolarity_High;//高电平TIM_OCInitTypestucture.TIM_Pulse=599;TIM_OCInitTypestucture.TIM_OutputState=TIM_OutputState_Enable;//使能TIM_OC2Init(TIM3,&TIM_OCInitTypestucture);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载TIM_Cmd(TIM3,ENABLE);//使能定时器}*******************************************************************************主函数#include "stepmotor.h"#include "stm32f10x.h"#include "delay.h"#include "timer.h"int main(){delay_init();Motor_Init();TIM3_PWM_Init(999,71);// 72M/(71+1)(999+1)=1K hzwhile(1) //正转{GPIO_SetBits(GPIOB,GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_8);//0111GPIO_ResetBits(GPIOB,GPIO_Pin_3);delay_ms(4);GPIO_SetBits(GPIOB,GPIO_Pin_3| GPIO_Pin_7| GPIO_Pin_8);//1011GPIO_ResetBits(GPIOB,GPIO_Pin_5);delay_ms(4);GPIO_SetBits(GPIOB,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_8);//1101GPIO_ResetBits(GPIOB,GPIO_Pin_7);delay_ms(4);GPIO_SetBits(GPIOB,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_7);//1110GPIO_ResetBits(GPIOB,GPIO_Pin_8);delay_ms(4);}}。

步进电机驱动程序(二相四线可使用4、8节拍)

步进电机驱动程序(二相四线可使用4、8节拍)

以下是STM32F1的代码部分(我是按照8拍的方式写的)
硬件的连线方式单片机IO口PB12 电机A+
PB13 电机A-
PB14 电机B+
PB14 电机B-
#define AA_H GPIO_SetBits(GPIOB, GPIO_Pin_12 ); #define AA_L GPIO_ResetBits(GPIOB, GPIO_Pin_12 ); #define AD_H GPIO_SetBits(GPIOB, GPIO_Pin_13 ); #define AD_L GPIO_ResetBits(GPIOB, GPIO_Pin_13 ); #define BA_H GPIO_SetBits(GPIOB, GPIO_Pin_14 ); #define BA_L GPIO_ResetBits(GPIOB, GPIO_Pin_14 ); #define BD_H GPIO_SetBits(GPIOB, GPIO_Pin_15 ); #define BD_L GPIO_ResetBits(GPIOB, GPIO_Pin_15 );
void motor_run(void) { AA_H; AD_L; BA_L; BD_L; delay_ms(5); AA_H; AD_L; BA_H; BD_L; delay_ms(5); AA_L; AD_L; BA_H; BD_L; delay_ms(5); AA_L; AD_H; BA_H; BD_L; delay_ms(5); AA_L; AD_H; BA_L; BD_L; delay_ms(5); AA_L; AD_H; BA_L; BD_H; delay_ms(5); AA_L; AD_L; BA_L; BD_H; delay_ms(5); AA_H; AD_L; BA_L; BD_H; delay_ms(5); }

步进电机内部结构、驱动原理图和汇编程序

步进电机内部结构、驱动原理图和汇编程序

步进电机在控制系统中具有广泛的应用。

它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器、或角位移发生器等。

有时从一些旧设备上拆下的步进电机(这种电机一般没有损坏)要改作它用,一般需自己设计驱动器。

本文介绍的就是为从一日本产旧式打印机上拆下的步进电机而设计的驱动器。

本文先介绍该步进电机的工作原理,然后介绍了其驱动器的软、硬件设计。

1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。

只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。

图1是该四相反应式步进电机工作原理示意图。

图1 四相步进电机步进示意图开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。

而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。

依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。

单四拍与双四拍的步距角相等,但单四拍的转动力矩小。

八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:a. 单四拍b. 双四拍c八拍图2.步进电机工作时序波形图2.基于AT89C2051的步进电机驱动器系统电路原理步进电机驱动器系统电路原理如图3:图3 步进电机驱动器系统电路原理图AT89C2051将控制脉冲从P1口的P1.4~P1.7输出,经74LS14反相后进入9014,经9014放大后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。

(整理)51单片机驱动步进电机电路及程序1.

(整理)51单片机驱动步进电机电路及程序1.

在这里介绍一下用51单片机驱动步进电机的方法。

这款步进电机的驱动电压12V,步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、 5:黄色、6:黑色。

采用51驱动ULN2003的方法进行驱动。

ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。

;******************************************************************** *************;**************************** 步进电机的驱动***************************************; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19;---------------------------------------------------------------------------------; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ; 本步进电机步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!;---------------------------------------------------------------------------------; A组线圈对应 P2.4; B组线圈对应 P2.5; C组线圈对应 P2.6; D组线圈对应 P2.7; 正转次序: AB组--BC组--CD组--DA组 (即一个脉冲,正转 7.5 度);----------------------------------------------------------------------------------;---------------------------- 正转--------------------------ORG 0000HLJMP MAINORG 0100HMAIN:MOV R3,#144 正转 3 圈共 144 脉冲START:MOV R0,#00HSTART1:MOV P2,#00HMOV A,R0MOV DPTR,#TABLEMOVC A,@A+DPTRJZ START 对 A 的判断,当 A = 0 时则转到 STARTMOV P2,ALCALL DELAYINC R0DJNZ R3,START1MOV P2,#00HLCALL DELAY1;-----------------------------反转------------------------MOV R3,#144 反转一圈共 144 个脉冲START2:MOV P2,#00HMOV R0,#05START3:MOV A,R0MOV DPTR,#TABLEMOVC A,@A+DPTRJZ START2MOV P2,ACALL DELAYINC R0DJNZ R3,START3MOV P2,#00HLCALL DELAY1LJMP MAINDELAY: MOV R7,#40 步进电机的转速M3: MOV R6,#248DJNZ R6,$DJNZ R7,M3RETDELAY1: MOV R4,#20 2S 延时子程序DEL2: MOV R3,#200DEL3: MOV R2,#250DJNZ R2,$DJNZ R3,DEL3DJNZ R4,DEL2RETTABLE:DB 30H,60H,0C0H,90H 正转表DB 00 正转结束DB 30H,90H,0C0H,60H 反转表DB 00 反转结束END。

42步进电机驱动程序.doc

42步进电机驱动程序.doc

42步进电机驱动程序#include < reg51. H >#define uint unsigned int#clefine uchar unsigned char#define ms * 77/ / f = 12 M#define LEDLen 4#define Dj star () Pri dj = 0; }#define Dj_stop () {IE = 0x00; Pri_clj = 1; Pl = 0 XFF; =〃0〃. Delay (800 ms) : Delay (800 ms) ; Delay (400 ms); =1; }#define Chilun Num 8/ * the gear number 8 * /#define set display num () {LEDBuf [0] = TMP / 1000; [1]二TMP / 100%10; \LEDBuf [2]二TMP / 10 %; LEDBuf [3]二TMP % 10 }Uchar LEDBuf [LEDLen]二{0, 0, 0, 0} Shache ShacheLEDBufVoid read num () : / * read the sowing code to set round num *Void display ();Void delay (uint delay_time) {uint I; For (1 = 0; I < delay_time;I + +); }Void run ();Void fx_run ();Uint round_num 二0; / * record the number of gears that have been turned, interrupted 1 times plus 1 * /Uint set_round_num 二0; / * sowing platter sets the winding number * /Uint set_pwm_width = 0; / * sowing platter sets the step motor to the speed * /Bit one_round_flg 二0;Sbit led_1000 二P0 八7; / / use for the displaySbit led_100 = P0 6; / / use for the displaySbit led_10 = P0 5: / / use for the displaySbit led_l = P0 4; / / use for the displaySbit key_start 二P3 八0;Sbit key_puse 二P3 八 0;Sbit key_clear = P3 1;/ * * / P3 八 2 pick up gear sensor interruptSbit bujin_zx_stop 二P3 八3; / * take the step into the motor, the sensor is in place, 0 stop * /Sbit bujin_fx_stop = P3 4; / * take the step into the motor, the reverse position sensor, 0 down * /Sbit shache 二P3 八5; / * the brake control relays 0 potential effective * /Sbit pri_dj = P3 6; /* the main motor control relays 0 potential effective * /Void main () {TCON = 0 xOl;The display ();While (1) {IE 二〃0 x00〃;Round num 二0;The display ();If (bujin_fx stop) fx run ();While (key_start);Delay (8ms);If (! Key_start) {Read_num ();/ / set_round_num 二8;While (! Key_start);The run ();Fx_run ();Void run () {Pound sign define Delay_time 180 / * turn around 50 cycles, 4 steps per cycle, 50 * 4 二200, 200* 1. 8 二360 * /Uchar I;Pl 二0 XFF;Set_pwm_width 二15 + set_pwm_width / 10;While (1)While (!)Dj_star ();For (I 二〃0〃;)Pl 二0 xf9;延迟(延迟时间);//bujinzxstop=P3 3;Pl=0xfc://bujinfxstop=P3 4;延迟(延迟时间);//keypuse=P3 0;Pl=0xf6;//keyclear=P3 1;延迟(延迟时间);//shache=P3 5;Pl=0xf3;//pridj=P3 6;如果(i==setpwmwidth)Pl=Oxff; i=0;—圆fig二0;while (! one_round flg &key_puse);}如果(!keypuse)延迟(4ms);如果(!keypuse)中断;}Pl 二0 xff;如果(pridj)中断;如果(!key_puse) {延迟女士(8);如果(!key_puse) {Dj_stop();而(!key_puse);/ /下一个试验的关键而(Ishache);而⑴{(keypuse&keycleat);延迟女士(8);如果(! keyclear)圆形二0;显示();如果(!key_puse)休息;}而(!key_puse);延迟女士(8);而(!key_puse);}}}}空白ext_intO(void)中断0 { / *主电机齿轮中断* /使用uint tmp;EA 二0;如果(!pri_dj) { round num + +;i f (圆-%ch il unnum=O) one_round_flg 二1; 小圆/奇纳姆;set_display_num();P0 二0 xfO;POPO;POPO;PO 二0 xfO; POPO;P0 二0 xfO; POPO;led_l 二0; PO | 二0 xfO; PO = 0 xfO;}if (圆二setnum) djstop();}EA = 0 x81;}空白显不0{uchar 我;使用uint tmp = 0;小圆/奇纳姆;set display num();for (i=0; i 小于;i++)PO 二0 xfO;POPO;如果(i=0)二0, //P0 4如果(i=l)莱德100二0;//P0 5如果(i=2)莱德10=0;//P0 6如果(i=3)莱德l=0;//P0 7P0 | = 0 xfO;}P0 = 0 xfO;}空白read_num () {/ *读播码盘到set_round_num, set_pwm_width * / uchar tmp; P2 二0 xff;P2=0xEF;//1110 1111 延迟(1 ms);tmp=(P2 OxFO);P2=0xDF;//1101 1111延迟(1 ms);tmp=((P2 OxFO))10+tmp; set_round_num 二tmp:P2二OxBF;//lOll 1111延迟(1 ms);tmp=((P2 OxFO));P2二0x7F;//0111 1111延迟(1 ms);tmp=((P2 OxFO))10+tmp; setnum 二setnum+tnip 100; setnum=setnuni・chilunnum;P2 二0 xff;Pl二0xbF;//0111 1111延迟(1 ms);tmp=(P2 OxFO);Pl 二0 xff;P2 二0 xff;Pl/=0x7F;//1011 1111延迟(1 ms);tmp=((P2 OxFO))10+tmp;set_pwm_width 二tmp:Pl 二0 xff;P2 二0 xff;}空白fx_run() {#定义f_Delay_time 180而(bujin_fx_stop) { / *反向回车直到传感器动作* /P1 二0 xf3;/ / 0011 延迟(f_Del3y_time); Pl 二0 xf6;/ / 0110 延迟(f_Delay_time);Pl 二0 xfc;/ / 1100 延迟(f_Delay_time);Pl 二0 xf9;/ / 1001 延迟(f_Delay_time);Pl = 0 xff;。

步进电机驱动汇编程序及调试总结

步进电机驱动汇编程序及调试总结

步进电机驱动汇编程序及调试总结;*************步进电机驱动*****************;设计者小苏FOSC=12MHz 2013.11.05;------------------------------------------------; 步进角为7.5 度一圈360 度,需要48 个脉冲完成;A 组线圈P2.4;B 组线圈P2.5;C 组线圈P2.6;D 组线圈P2.7;正传次序:AB 组-BC 组-CD 组-DA 组(即一个脉冲,正转7.5 度);--------------------------------------------;调试平台i51 最小系统;调试结果:步进电机,速度参数40,正反转正常;;30 以下速度加快,正转正常反转不动,原因不明,卡死丢步猜测为卡死;;继续加速,参数为5,正转平稳,反转跳动,怀疑丢步。

;继续加速,电机震动,但正反转都不动,改进方案尚无(R6=248,R7 为修改量);--------------------------------------------;总结:对步进电机运行、驱动原理还不够理解、;任务,尽快学习,并写出c 程序,加入速度,正反转,停机控制;--------------------------------------------;---------正转-----------ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV R3,#255 ;正转3 圈共114 脉冲START: MOV R0,#00HSTART1:MOV P2,#00H MOV A,R0 MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START ;当A=0 时转到START(一个脉冲,正转7.5 度)MOV P2,A LCALL DELAY INC R0 DJNZ R3,START1 MOV P2,00H LCALL DELAY1;----------------反转------------------------- MOVR3,#255 ;正转3 圈共114 脉冲START2:MOV P2,#00H MOV R0,#05HSTART3:MOV A,R0 MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START2 ;当A=0 时转到START(一个脉冲,反转7.5 度)MOV P2,A CALL DELAY INC R0 DJNZ R3,START3 MOV P2,00H LCALL DELAY1 LJMP MAINDELAY: MOV R7,#10 ;步进电机的转速M3: MOV R6,#248 DJNZ R6,$ DJNZ R7,M3 RETDELAY1:MOV R4,#20 ;2S 延时子程序DEL2: MOV。

四线双型步进电机驱动程序汇编语言

四线双型步进电机驱动程序汇编语言

四线双型步进电机驱动程序汇编语言一、概述四线双型步进电机是一种常用的电机类型,其驱动程序可以使用汇编语言实现。

本文将介绍四线双型步进电机驱动程序的汇编语言实现方法。

二、步进电机工作原理步进电机是一种将输入脉冲信号转换为旋转运动的电机。

其工作原理是通过改变电磁场的方向和大小来控制转子的位置。

常见的步进电机有两种类型:单相和双相。

其中,双相步进电机分为四线单型和四线双型两种。

三、四线双型步进电机驱动程序实现1. 硬件连接四线双型步进电机需要连接到控制器上,其中,A相、B相、C相和D 相分别连接到控制器上的对应引脚。

此外,还需要一个使能信号引脚和一个方向信号引脚。

2. 程序实现(1)初始化在程序开始时,需要对控制器进行初始化设置。

具体包括设置引脚方向和模式等参数。

(2)驱动函数驱动函数是实现步进电机旋转运动的核心代码。

其主要思路是根据输入的脉冲信号来改变输出端口引脚的状态,从而控制电机转动。

具体实现方法如下:a. 根据输入的脉冲信号确定下一步的方向和步数;b. 根据当前位置和下一步位置之间的差值,确定需要改变的引脚状态;c. 将需要改变的引脚状态写入输出端口。

(3)延时函数为了保证电机转动的稳定性,需要在每次驱动后加入适当的延时。

延时函数可以使用计时器或者循环等方式实现。

四、总结本文介绍了四线双型步进电机驱动程序汇编语言实现方法。

通过对硬件连接和程序实现进行详细说明,读者可以更好地理解步进电机工作原理和驱动程序实现方法,从而更好地应用于实际项目中。

(完整word版)步进电机驱动程序(用定时的方式来控制步进电机)

(完整word版)步进电机驱动程序(用定时的方式来控制步进电机)

(完整word版)步进电机驱动程序(用定时的方式来控制步进电机) #include <REG52.H>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit PUL = P1^0; //脉冲输入端sbit DIR = P1^1; //方向控制端sbit ENBL = P1^2; //使能端uint num;/*xms*1ms毫秒延时函数*/void delay(uint xms){ uint a,b;for(a=xms;a>0;a--)for(b=110;b>0;b--);}void init(){TMOD|= 0x01; //设置定时器0为工作方式1,16为定时器/计数器TL0 = (65535-10)%256; //设置定时初值TH0 = (65535-10)/256; //设置定时初值ET0 = 1; //开启定时器0中断TR0 = 1; //关闭定时器0EA = 1;}void main()(完整word版)步进电机驱动程序(用定时的方式来控制步进电机) {init();DIR = 1;ENBL = 1;while(1){if(num==12800){DIR=~DIR;num=0;TR0=0;delay(1000);TR0=1;}}}/*定时器0中断服务函数*/void T0_timer() interrupt 1{TL0 = (65535-10)%256; //设置定时初值TH0 = (65535-10)/256; //设置定时初值// TL0 = 0xEE; //设置定时初值// TH0 = 0xFF;PUL = ~PUL;(完整word版)步进电机驱动程序(用定时的方式来控制步进电机) num++;}使能端打开,电机处于工作状态输出的脉冲数计数//使能端关闭,电机处于停止工作状态初始化定时器1禁止所有中断预加时间timer256分频启用定时器溢出中断允许所有中断常规中断服务预加载timer异或运算计算方式65536-16000000/256/20HZ=62411。

步进电机驱动程序19页word文档

步进电机驱动程序19页word文档

步进电机驱动程序采用热转印制作 PCB ,电路采用2相推挽全桥驱动,单片机采用 STC54C12C5404学生的设计要求:具体的模式如下:五种模式选择一:停止。

二:顺时针转2分钟,停6分钟,循环;三:逆时针转2分钟,停6分钟,循环;四:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;五:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。

请将模式四和五放在首选。

用数字码显示模式步进电机39BYG250品牌:北斗型号: 39BYG 技术参数步距角: 1.8 电流: 0.4 A 电阻: 27 Ω重量: 0.130 kg 驱动电压: 12 V相电流: 0.4 A 相数: 2 环境温度:130 ℃1代表程式1,2代表程式2。

1位数码管,1个按钮8圈/分,每圈要分4步跳//2019.8.26/**************************************************具体的模式如下:五种模式选择0:停止。

1:顺时针转2分钟,停6分钟,循环;2:逆时针转2分钟,停6分钟,循环;3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。

模式四和五放在首选。

用数字码显示模式1代表程式1,2代表程式2。

1位数码管,1个按钮8圈/分,68每圈要分4步跳;***************************************************************/#include "STC12C5410AD.H"//头文件#include "intrins.h"//头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义#define DPDR P2//并行数据接口定义sbit key=P3^2;//按键sbit AB=P3^5;sbit CP=P3^3;//sbit HHH=P1^6;sbit CLL=P3^4;bit Forward_Inversion_bit;//正转,//反转,标志bit bit_bit;//1:正转//0:反转bit Start_Stop_bit;//启动,停止,标志//1:启动//0:停止//uchar count_2;uint counter_3;uchar counter_4;uchar Forward_Tolerance_Counter;//正转容错记数器,保持步进电机不跳步uchar Inversion_Tolerance_Counter;//反转容错记数器,保持步进电机不跳步uchar Mode_Selection;//模式选择////数码管显示值//0:停止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附件:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP Speed_Up
ORG 0013H
LJMP Speed_Down
ORG 0100H
MAIN:
;打开外部中断IT0/IT1
SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1
;扫描键盘,无键按下显示0,并继续扫描
MAKEY:
MOV DPTR,#TAB
MOV A,#0
MOVC A,@A+DPTR
MOV P0,A
MOV P3,#0FFH
MOV A,P3
CPL A
JZ MAKEY
LCALL D10MS
JZ MAKEY
;当有键按下时,启动步行电机转动
Speed EQU 20H
Num EQU 21H
MOV Speed,#60 ;Speed初始化,Speed控制延时的时间,即脉冲的频率
MOV Num,#1 ;Num初始化,Num存放数码管显示的转速数值
JNB ACC.4,TO_TWO ;默认设置为正向转动,转速为1,当有反向键按下,按反向转动
;------------------------ 1号程序:控制步行电机正转--------------------------------
TO_ONE:
MOV R7,#4
MOV A,#01H
MOV P3,#0FFH
LP1:
MOV P1,A
LCALL DELAY
LCALL DISPLAY
RL A ; 正向输入脉冲信号
DJNZ R7,LP1
JNB P3.4,TO_TWO ; 有反向键按下,跳转到2号程序
LJMP TO_ONE
;------------------------2号程序:控制步行电机反转---------------------------------- TO_TWO:
MOV R7,#4
MOV A,#08H
MOV P3,#0FFH
LP2:
MOV P1,A
LCALL DELAY
LCALL DISPLAY
RR A ; 反向输入脉冲信号
DJNZ R7,LP2
JNB P3.5,TO_ONE ;有正向键按下,跳转到1号程序
LJMP TO_TWO
;----------------------------中断服务程序----------------------------------------------- Speed_Up: ; 外部中断IT0,控制加速
PUSH ACC
LCALL D10MS
MOV A,Speed
CJNE A,#12,L1 ; 最大速度时,速度不再增加
LJMP L2
L1: ; 速度加1(减小脉冲周期)
SUBB A,#12
MOV Speed,A
INC Num
L2: POP ACC
RETI
Speed_Down: ;外部中断IT1,控制减速
PUSH ACC
LCALL D10MS
MOV A,Speed
CJNE A,#60,L3 ;最小速度时,速度不再减小
LJMP L4
L3: ;速度减1(增大脉冲周期)
ADD A,#12
MOV Speed,A
DEC Num
L4: POP ACC
RETI
;----------------------------------延时、显示子程序--------------------------------------------- DISPLAY: ;显示子程序,显示步行电机的转速
PUSH ACC
MOV A,Num
MOVC A,@A+DPTR
MOV P0,A
POP ACC
RET
DELAY: ;延时子程序,用于产生脉冲信号,并可通过改变延时来改变脉冲的频率PUSH ACC
MOV R6,Speed
d1:
MOV R5,#100
DJNZ R5,$
DJNZ R6,d1
POP ACC
RET
D10MS: ;延时10ms,软件去抖动
MOV R4,#10
D1MS:
MOV R3,#249
DL: NOP
NOP
DJNZ R3,DL
DJNZ R4,D1MS
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;速度显示:0~5
END。

相关文档
最新文档