首页 uln2803步进电机的控制原理电路图和源程序

uln2803步进电机的控制原理电路图和源程序

举报
开通vip

uln2803步进电机的控制原理电路图和源程序uln2803步进电机的控制原理电路图和源程序 步进电机的控制原理和程序 选自北航出版 耿德根主编《高速嵌入式单片机原理与应用》第七章7.4.2 源程序:SLAVR742.ASM         自从六十年代初期步进电机面世以来,在过去几年它的重要性大大提高了。它用来驱动时钟和其他采用指针的仪器,打印机、绘图仪、磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等的机械装置。关于马进电机工作原理请参考有关资料。        下面用单极1-2相激磁方法步进电机做实验,即1极、2极、1极、2极、....极以...

uln2803步进电机的控制原理电路图和源程序
uln2803步进电机的控制原理电路图和源程序 步进电机的控制原理和程序 选自北航出版 耿德根主编《高速嵌入式单片机原理与应用》第七章7.4.2 源程序:SLAVR742.ASM         自从六十年代初期步进电机面世以来,在过去几年它的重要性大大提高了。它用来驱动时钟和其他采用指针的仪器,打印机、绘图仪、磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等的机械装置。关于马进电机工作原理请参考有关资料。        下面用单极1-2相激磁方法步进电机做实验,即1极、2极、1极、2极、....极以次循环,如何用单极二相激该方法控制步进电机,由读者或用户自行   编制程序实验。 ;实验选用4.5V步进电机,用5V即可,实验时节省一组步进电机驱动电源; ;型号:MA82135; 相数:2相; 电压:4.5V; 电流/相:0.12A; 电阻欧姆:34Ω/相; 重量:30g ;********************************************* ;* 步进电机控制程序(单极1-2相) * ;* * ;*SLAVR742.ASM * ;*use ULN2803 ;使用PC0-PC3 驱动步进电机 * ;*use 11-17new bord * ;********************************************* .include"8515def.inc" .def temp =r16 .def dt =r19 .def np =r17 .def step =r18 .def TStep =r20 .def cnt =r21 .equ turntab=0x0200 .org $0000 rjmp RESET .cseg .org 0x010 RESET: ldi temp,low(RAMEND) ;设堆栈 out SPL,temp ldi temp,high(RAMEND) out SPL+1,temp ser TEMP ;C口设置为输出 OUT ddrc,TEMP ldi zl,low(turntab*2) ;步进电机旋转资料指针 ldi zh,high(turntab*2) ldi np,4 ldi temp,$44 out portc,temp ;初始化 ldi TStep,$25 rcall delay ldi cnt,10 clt rep: ldi step,192 ldi TStep,1 ;1--255 rcall turn dec cnt brne rep loop: nop rjmp loop ;************************************************************* ; t=1 uncircle turn ;T=1逆时针转 * ; t=0 circle turn ;T=0顺时针转 * ; 96 step a turn * ; TStep is time of a step ; * ;************************************************************* turn: brts uncircle ;判转向 inc np ;正转 cpi np,8 brne next clr np next: push zl add zl,np lpm out portc,r0 pop zl rcall delay dec step brne turn ret uncircle: ;反转 dec np cpi np,$ff brne next ldi np,$07 rjmp next delay: push TStep ;延时子程序 del1: ldi dt,70 del2: push dt del3: dec dt brne del3 pop dt dec dt brne del2 dec TStep brne del1 pop TStep ret .org turntab ; 0 1 2 3 4 5 6 7 ;步进电机旋转资料表 .db 0x11,0x99,0x88,0xcc,0x44,0x66,0x22,0x33 #i nclude #define uint   unsigned int #define uchar unsigned char #define ms *77 // f = 12 M #define LEDLen 4 #define Dj_star() {IE=0x81; pri_dj=0; } #define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; } #define Chilun_Num 8 /* 齿轮数 8 个*/ #define set_display_num() { LEDBuf[0] = tmp / 1000;      LEDBuf[1] = tmp / 100 % 10;   \                              LEDBuf[2] = tmp / 10 % 10;   LEDBuf[3] = tmp % 10;         } uchar LEDBuf[LEDLen] = {0,0,0,0}; void   read_num ();                 /* 读播码盘 到 set_round_num   * 8 */ void   display   (); void   delay(uint   delay_time) { uint   i; for (i=0; i < delay_time ; i++) ; } void   run (); void   fx_run(); uint   round_num      = 0;            /* 记录已转的 齿轮数 , 中断1次 加 1*/ uint   set_round_num = 0;            /* 播码盘设置 圈数 */ uint   set_pwm_width = 0;            /* 播码盘设置 步进电机 正向速度 */ bit    one_round_flg = 0; sbit   led_1000       = P0^7;         //use for display sbit   led_100        = P0^6;         //use for display sbit   led_10         = P0^5;         //use for display sbit   led_1          = P0^4;         //use for display sbit   key_start      = P3^0; sbit   key_puse       = P3^0; sbit   key_clear      = P3^1;                                     /*   P3^2 接齿轮传感器 中断   */ sbit   bujin_zx_stop = P3^3;         /* 接步进电机 ,正向到位传感器 ,为 0 停机 */ sbit   bujin_fx_stop = P3^4;         /* 接步进电机 ,反向到位传感器 ,为 0 停机 */ sbit   shache         = P3^5;         /* 接刹车控制继电器    0 电位有效 */ sbit   pri_dj         = P3^6;         /* 接主电机控制继电器 0 电位有效 */ void main(){          TCON = 0x01;          display();          while(1) {              IE="0x00";              round_num = 0;              display();              if ( bujin_fx_stop ) fx_run();              while ( key_start );              delay ( 8ms );              if(!key_start){                  read_num();                  //set_round_num   = 8;                  while ( !key_start );                  run ();                  fx_run();              }          } } void run () {      #define Delay_time    180      /* 转一圈 50 次循环,每循环 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */      uchar i ;      P1 = 0xff;      set_pwm_width = 15 + set_pwm_width / 10;      while ( 1 ) {              while( !shache | !key_start );              Dj_star();              for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){                  P1 =   0xf9;                  delay ( Delay_time   );         // bujin_zx_stop = P3^3;                  P1 =   0xfc;                    // bujin_fx_stop = P3^4;                  delay ( Delay_time);           // key_puse       = P3^0;                  P1 =   0xf6;                    // key_clear      = P3^1;                  delay ( Delay_time   );         // shache         = P3^5;                  P1 =   0xf3;                    // pri_dj         = P3^6;                  delay ( Delay_time );                  if( i == set_pwm_width ) { P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse );}                  if(!key_puse) { delay(4ms);   if(!key_puse) break;   }              }              P1 = 0xff;              if ( pri_dj )   break;              if ( !key_puse ) {                  delay ( 8ms );                  if ( !key_puse   ) {                      Dj_stop();                      while ( !key_puse );                      // next pree key                      while( !shache );                      while(1){                          while (   key_puse &   key_clear );                          delay ( 8ms );                          if ( !key_clear )   { round_num = 0; display(); }                          if ( !key_puse   )   break;                      }                      while( !key_puse );                      delay(8ms);                      while( !key_puse );                   }              }      } } void ext_int0(void) interrupt 0   {    /* 主电机 齿轮 中断 */      uint tmp;      EA = 0;      if( !pri_dj ){              round_num ++;              if (round_num % Chilun_Num == 0 ){                  one_round_flg = 1;                  tmp = round_num   / Chilun_Num ;                  set_display_num();                  P0 = 0xf0;                  P0 = P0 | LEDBuf[0] ;                  led_1000   = 0;                  P0 |= 0xf0;                  P0 = 0xf0;                  P0 = P0 | LEDBuf[1] ;                  led_100    = 0;                  P0 |= 0xf0;                  P0 = 0xf0;                  P0 = P0 | LEDBuf[2] ;                  led_10     = 0;                  P0 |= 0xf0;                  P0 = 0xf0;                  P0 = P0 | LEDBuf[3] ;                  led_1      = 0;                  P0 |= 0xf0;                  P0 = 0xf0;              }              if ( round_num >= set_round_num   ) Dj_stop();          }      EA = 0x81; } void display(){       uchar i;       uint tmp = 0;       tmp = round_num   / Chilun_Num ;       set_display_num();       for(i = 0; i < LEDLen ; i ++){             P0 = 0xf0;             P0 = P0 | LEDBuf[i] ;             if(i==0) led_1000   = 0;         //P0^4             if(i==1) led_100    = 0;         //P0^5             if(i==2) led_10     = 0;         //P0^6             if(i==3) led_1      = 0;         //P0^7             P0 |= 0xf0;       }       P0 = 0xf0; } void read_num(){       /* 读播码盘 到 set_round_num   ,set_pwm_width   */       uchar tmp;       P2 =   0xFF;       P2 =   0xEF;     // 1110 1111       delay ( 1ms   );       tmp =    ~(P2   | 0xF0);       P2 =   0xDF;     // 1101 1111       delay ( 1ms   );       tmp = (~(P2 | 0xF0 )) * 10    + tmp;       set_round_num = tmp;       P2 =   0xBF;     // 1011 1111       delay ( 1ms   );       tmp = (~(P2 | 0xF0));       P2 =   0x7F;     // 0111 1111       delay ( 1ms   );       tmp = (~(P2 | 0xF0)) * 10 + tmp;       set_round_num = set_round_num   + tmp * 100;       set_round_num = set_round_num   * Chilun_Num;       P2 =   0xFF;       P1 =   0xbF;     // 0111 1111       delay ( 1ms );       tmp =    ~(P2   | 0xF0) ;       P1   =   0xFF;       P2   =   0xFF;       P1 &=   0x7F;     // 1011 1111       delay ( 1ms );       tmp = (~(P2 | 0xF0)) * 10 + tmp ;       set_pwm_width = tmp ;       P1   = 0xFF;       P2   = 0xFF; } void   fx_run(){      #define f_Delay_time 180      while ( bujin_fx_stop ) {    /* 反向 回车 直到 传感器 动作*/          P1 =   0xf3;                    //0011          delay ( f_Delay_time );          P1 =   0xf6;                    //0110          delay ( f_Delay_time );          P1 =   0xfc;                    //1100          delay ( f_Delay_time );          P1 =   0xf9;                    //1001          delay ( f_Delay_time );      }      P1 = 0xff; }
本文档为【uln2803步进电机的控制原理电路图和源程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_848589
暂无简介~
格式:doc
大小:114KB
软件:Word
页数:8
分类:互联网
上传时间:2018-09-05
浏览量:113