⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 step.c

📁 用M16驱动步进电机 ,实现三种驱动方式: 单四拍驱动、双四拍驱动、单双八拍驱动
💻 C
字号:
/************************************
*        步进电机的M16驱动程序        *
* 功   能:用M16驱动步进电机        *
*            实现三种驱动方式        *
*            单四拍驱动、双四拍驱动    *
*            单双八拍驱动            *
* 驱动芯片:ULN2803                    *
* 联接方式:PC0-3分别通过2803接A-D    *
*            步进电机公共端接+5V电源    *
* 建立日期:2008年04月10日            *
* 作   者:ywh                   *
* 版   本:V1.0                    *
* 修改日期:2008年04月15日            *
* 主控芯片:M16                        *
* 时钟频率:外部晶体 7.3728MHZ        *
* 编 译 器:ICCAVR 6.31A            *
************************************/
#include <iom16v.h>
#include <macros.h>
//#include "delay.h"

#define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7

unsigned char i=0;            //转动计数
unsigned char m=1;            //驱动方式参数
unsigned char n=0;            //转动方向参数
unsigned int zhuansu=61500;    //转速数据

/****************************
*        端口配置函数        *
****************************/
void port_init(void)
   {
   PORTA = 0x40;
   DDRA = 0x40;
   PORTB = 0x00;
   DDRB = 0x00;
   PORTC = 0xF0;
   DDRC = 0x0F;
   PORTD = 0x00;
   DDRD = 0x00;
   }

/****************************
*        正转操作函数        *
* 入   口:a 三种工作方式    *
****************************/
void bj_fs(unsigned char a)
   {
   switch(a)
       {
       case 1:                //单四拍方式驱动
           PORTC |= 1<<i;    //A、B、C、D驱动
           i++;
           if(i>=4)i=0;
           break;
       case 2:                //双四拍方式驱动
           if(i!=4)        //AB、BC、CD、DA驱动
               PORTC |= (1<<i)|(1<<(i-1));
           else
               PORTC |= (1<<(i-1))|1;
           i++;
           if(i>=5)i=1;
           break;
       case 3:                //单双八拍方式驱动
           if(i%2)            //A、AB、B、BC、C、CD、D、DA驱动
               {
               if(i!=7)
                   PORTC |= (1<<(i/2))|(1<<(i/2+1));
               else
                   PORTC |= (1<<(i/2))|1;
               }
           else
               {
               PORTC |= 1<<(i/2);
               }
           i++;
           if(i>=8)i=0;
           break;
       default:break;
       }
   }

/****************************
*        反转操作函数        *
* 入   口:a 三种工作方式    *
****************************/
void bj_fsf(unsigned char a)
   {
   switch(a)
       {
       case 1:                    //单四拍方式驱动
           PORTC |= 1<<(3-i);    //D、C、B、A驱动
           i++;
           if(i>=4)i=0;
           break;
       case 2:                    //双四拍方式驱动
           if(i!=4)            //AD、CD、BC、AB驱动
               PORTC |= (1<<(3-i))|(1<<(4-i));
           else
               PORTC |= (1<<(i-1))|1;
           i++;
           if(i>=5)i=1;
           break;
       case 3:                    //单双八拍方式驱动
           if(i%2)                //DA、D、CD、C、BC、B、AB、A驱动
               {
               PORTC |= 1<<(3-i/2);
               }
           else
               {
               if(i)
                   PORTC |= (1<<(3-i/2))|(1<<(4-i/2));
               else
                   PORTC |= (1<<(3-i/2))|1;
               }
           i++;
           if(i>=8)i=0;
           break;
       case 4:
       
       default:break;
       }
   }

/****************************
*        定时器1配置函数        *
* 工作模式:普通模式        *
* 工作方式:溢出中断        *
* 预 分 频:64                *
* 时钟频率:外部7.3728MHZ    *
****************************/
void timer1_init(void)
   {
   TCCR1B = 0x00;
   TCNT1H = zhuansu>>8;
   TCNT1L = zhuansu&0xFF;
   TCCR1A = 0x00;
   TCCR1B = 0x02;
   }
/****************************
*        定时器1中断函数        *
****************************/
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
   {
   TCNT1H = zhuansu>>8;
   TCNT1L = zhuansu&0xFF;
   PORTC &= 0xF0;
   if(n)
       bj_fsf(m);            //反转
   else
       bj_fs(m);            //正转
   }

/****************************
*        器件初始化函数        *
****************************/
void init_devices(void)
   {
   CLI();
   port_init();
   timer1_init();

   MCUCR = 0x00;
   GICR = 0x00;
   TIMSK = 0x04;
   SEI();
   }

/****************************
*            主函数            *
****************************/
void main(void)
   {
   unsigned char key,key1;
   init_devices();
   
   while(1)
       {
       key=RD_KEY();        //按键扫描
       if(key)
           {
           delay_nms(200);
           key1=RD_KEY();
           if(key==key1)
               {
               switch(key)        //按键有效,相应处理
                   {
                   case 0x01:    //S1键处理:转速增加
                       zhuansu += 100;
                       if(zhuansu>62000)zhuansu=62000;
                       break;
                   case 0x02:    //S2键处理:转速降低
                       zhuansu -= 100;
                       if(zhuansu<5000)zhuansu=5000;
                       break;
                   case 0x04:    //S3键处理:转换驱动方式
                       m++;
                       if(m>=4)m=1;
                       break;
                   case 0x08:    //S4键处理:正反转控制
                       if(n)
                           n=0;
                       else
                           n=1;
                       break;
                   default:break;
                   }
               }
           while(key)            //等待按键释放
               {
               delay_nms(100);
               key=RD_KEY();
               }
           }
       }
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -