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

📄 driver86.c

📁 两相混合式步进电机驱动
💻 C
字号:
#include<avr/io.h>


#include<avr/pgmspace.h>


#include <compat/ina90.h>

#include<avr/signal.h>

uint8_t dirstate,xfnum;
uint8_t buf[4];
 

 prog_char  A[21]={255,254,250,242,232,219,203,186,168,148,128,108,88,70,53,24,14,6,2,0};    
 prog_char   bb[9]={0x08,0x0A,0x02,0x06,0x04,0x05,0x01,0x09,0xff};


uint16_t stage_drop,space_drop;
                      
uint8_t  phasea,phaseb,space,table;

volatile uint16_t stage,stage1;

void delay(uint8_t k)  //;16m -0.5s
{
  uint8_t i,j,m,n;
  for(i=0;i<k;i++)
   {
    for(j=0;j<20;j++)
	{
	 for(m=0;m<200;m++)
	 {
	  for(n=0;n<200;n++)
	  ;
	  }
    }
 }
}



//电流初始化
  
 void initialcurrent(void) 
 { 
    
	 phasea=pgm_read_byte(&A[0]); 
     phaseb=pgm_read_byte(&A[19]);
	  
     PORTC=phasea;
     asm volatile("sbi 0x18,2"::);//daca
     asm volatile("cbi 0x18,1"::);//wr                                                                                                
     asm volatile("sbi 0x18,1"::);//wr 
     PORTC=phaseb;
     asm volatile("cbi 0x18,2"::);//daca
     asm volatile("cbi 0x18,1"::);//wr
     asm volatile("sbi 0x18,1"::);//wr 
  }  
void loadbm(void)
{
  xfnum=PIND;
  xfnum&=0x0f;
  switch(xfnum)
  {
   case 0x00: space=150;table=0;break;
   case 0x01: space=120;table=0;break;
   case 0x02: space=100;table=0;break;
   case 0x03: space=10; table=0;break;
   default:   space=0;  table=0;break;
   }
 }

void loaddropdata(void)
{
 uint8_t i;

  while(!eeprom_is_ready());
  eeprom_read_block(buf,(uint8_t *)0x10,4);
   
  for(i=0;i<4;i++)
  {
     if(buf[i]>0x20)
     buf[i]=0;
  }
   
 
  stage_drop=buf[0];
 space_drop=buf[1];
  dirstate=buf[2];
  stage=buf[3];
}

 int main(void)
{

   PORTA=0X20;//PA1-wr,PA2-daca
   DDRA=0XFF;
   
   PORTC=0X02; 
   DDRC=0Xff;  //
               //delay(10);
   PORTD=0X00;
   DDRD=0XE0;   //PD6  -OFFCURRENT.PD5-FREE
   
   
   table=0;
   loadbm();
   while(bit_is_set(PORTE,0));  //若过热,则停止
     
   initialcurrent(); //向tlc7528发出电流台阶信号.
   GICR|=0XE0; //INT1(CP)INT0(VOL_LESS)INT2(OVERHOT) 中断使能

   _SEI();        //开总中断
   
   _NOP();       
   _NOP();
  
  
  
  } 



  SIGNAL( SIG_INTERRUPT1 )//cp

  {
    if(bit_is_set(PINC,4))  //pc4 (cp)

	{
	  asm volatile("cbi 0x08,3"::);//取消自动半流  

	     
	  if(bit_is_clear(PINC,5)){ //dir=0,default
	   	   stage+=space;
	       if(stage==1200)  stage=0; 
		             
	       }
      else if(bit_is_set(PINC,5)){//dir=1;
      
	        if(stage==0)   stage=1200-space;
	        else           stage-=space;
	       }
     if(stage>=800)  stage1=stage-800;
	 else            stage1=stage+400;
     // }
 
 	 
	 phasea=pgm_read_byte(&A[stage]); 
	 phaseb=pgm_read_byte(&A[stage1]);
    
     PORTD=phasea;
     asm volatile("sbi 0x08,0"::);//daca  0x08=portc
	 asm volatile("cbi 0x08,1"::);//wr 
     asm volatile("sbi 0x08,1"::);//wr 

     PORTD=phaseb;
     asm volatile("cbi 0x08,0"::);//daca
     asm volatile("cbi 0x08,1"::);//wr
     asm volatile("sbi 0x08,1"::);//wr 
     TCNT1=25536;
     TCCR1B=0X04;
	// TIMSK1=0X01;
   }
 }   

  SIGNAL( SIG_INTERRUPT0)
  
                 
   {
   _CLI();
   asm volatile("cbi 0x05,5"::);//SD ,HIGN VALID,0x05 PORTTB
   asm volatile("sbi 0x05,3"::);//offcurrent
   asm volatile("cbi 0x08,2"::);//notready
  
  }
   
 
SIGNAL( SIG_INTERRUPT2)
  
                 
   {
   asm volatile("cbi 0x05,5"::);//SD ,HIGN VALID,0x05 PORTTB
   asm volatile("sbi 0x05,3"::);//offcurrent
   asm volatile("cbi 0x08,2"::);//notready
  
  }
   
 

 SIGNAL(SIG_OVERFLOW1)
{
  TCNT1=25536;
  asm volatile("sbi 0x12,6"::);//OFFCURRENT  PORTD,6
}   
 

  
//priority:fo-低触发最高,undervoltage-低触发次高  ,overvol低触发再次之,overhot高触发最低

⌨️ 快捷键说明

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