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

📄 0417.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[80]={255,255,254,253,252,250,248,245,242,239,
                   236,232,227,222,217,212,206,200,194,187,
				   180,173,166,158,150,142,133,125,116,107,
				   98, 88,  79, 70, 60, 50, 40,30, 20, 10,
				    0, 10,  20, 30,40, 50, 60,70, 79, 88,
					98,107,116,125,133,142,150,158,166,173,
					180,187,194,200,206,212,217,222,227,232,
					236,239,242,245,248,250,252,253,254,255
					}; 
				      
 prog_char  B[160]= {8, 10, 10, 10, 10, 10, 10, 10, 10, 10,
                   10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
				   10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
				   10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  //40
				    2,  6,  6,  6,  6,  6,  6,  6,  6,  6,
					6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
					6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
					6,  6,  6,  6,  6,  6,  6,  6,  6,  6,//80
					4,  5,  5,  5,  5,  5,  5,  5,  5,  5,
					5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
					5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
					5,  5,  5,  5,  5,  5,  5,  5,  5,  5,//120
					1,  9,  9,  9,  9,  9,  9,  9,  9,  9,  
					9,  9,  9,  9,  9,  9,  9,  9,  9,  9, 
					9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
					9,  9,  9,  9,  9,  9,  9,  9,  9,  9,//160
					};
                  

uint8_t stage_drop,space_drop;
                      
uint8_t  phasestep,phaseout,currenta,currentb,space,table;

volatile uint8_t stage,stage1,cpnum;

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) 
 { 
    
	 currenta=pgm_read_byte(&A[0]); 
     currentb=pgm_read_byte(&A[40]);
	 phaseout=pgm_read_byte(&B[0]);
	 phaseout<<=4;
	 PORTA|=phaseout;

	 PORTC=currenta;
     asm volatile("sbi 0x1B,2"::);//daca
     asm volatile("cbi 0x1B,1"::);//wr                                                                                                
     asm volatile("sbi 0x1B,1"::);//wr 
     PORTC=currentb;
     asm volatile("cbi 0x1B,2"::);//daca
     asm volatile("cbi 0x1B,1"::);//wr
     asm volatile("sbi 0x1B,1"::);//wr 
  }  
//0    0   0  //5    对于清华丰10/5细分,将拨码3,2拨到地,用拨码1切换
//0    0   1  //10
//0    1   0  //8    对于万博丰10/8细分,将拨码3接地,拨码2接1,用拨码1切换
//0    1   1  //10
//1    1   1   //2   
//1    1   0   //20



void loadbm(void)
{
  xfnum=PIND&0xf8;  //pd2,pd1,pd0 三位拨码
  switch(xfnum)
  {
   case 0: space=4;table=0;break; //5
   case 1: space=4;table=0;break;  //10
   case 2: space=5;table=0;break;   //8
   case 3: space=4;table=0;break; //10
   case 6: space=2;table=0;break;//20
   case 7: space=20,table=0;break;// 2
   case 8: space=1;break;//40
   default: space=4;table=0;break;//默认10细分
   }
 }

/*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=0X02;//PA1-wr,PA2-daca
   DDRA=0XFF;
   
   PORTC=0X00; 
   DDRC=0Xff;  //
               //delay(10);
   PORTD=0X00;
   DDRD=0XE0;   //PD6  -OFFCURRENT.PD5-FREE
   currenta=0;
   currentb=0;
   stage=0;
   stage1=0;
   phasestep=0;
   cpnum=0;
   table=0;
   loadbm();
   while(bit_is_set(PORTE,0));  //若过热,则停止
     
   initialcurrent(); //向tlc7528发出电流台阶信号.
   GICR|=0XC0; //INT1(CP)INT0(VOL_LESS)INT2(OVERHOT) 中断使能
   MCUCR=0X0A;

         //开总中断
   TIMSK=0X80; //T1 INTRRUPT 
   TCCR1B=0X00;
   _NOP();       
   _NOP();
   _SEI(); 
  while(1);
  
  } 



  SIGNAL( SIG_INTERRUPT1 )//cp

  {
    if(bit_is_clear(PIND,3))  //pc4 (cp)

	{
	  cpnum++;
	  asm volatile("cbi 0x12,6"::);//取消自动半流  

	 	  
	  if(bit_is_clear(PIND,4)){ //dir=0,default
	   	   stage+=space;
	       if(stage==80)  stage=0;
		   phasestep+=space;
		   if(phasestep==160) phasestep=0; 
		             
	       }
      else if(bit_is_set(PIND,4)){//dir=1;
      
	        if(stage==0)   stage=80-space;
	        else           stage-=space;
			if(phasestep==0)   phasestep=160-space;
			else            phasestep-=space;
	       }
     if(stage<40)  stage1=stage+40;
	 else          stage1=stage-40;
 	 
	 currenta=pgm_read_byte(&A[stage]); 
	 currentb=pgm_read_byte(&A[stage1]);
    
	 phaseout=pgm_read_byte(&B[phasestep]);
	 phaseout<<=4;
	 PORTA|=phaseout;
     PORTC|=currenta;
     asm volatile("sbi 0x08,0"::);//daca  0x08=portc
	 asm volatile("cbi 0x08,1"::);//wr 
     asm volatile("sbi 0x08,1"::);//wr 

     PORTC|=currentb;
     asm volatile("cbi 0x08,0"::);//daca
     asm volatile("cbi 0x08,1"::);//wr
     asm volatile("sbi 0x08,1"::);//wr 
     TCNT1=25536;
     TCCR1B=0X01;
	// TIMSK1=0X01;
   }
 }   

  SIGNAL( SIG_INTERRUPT0)
  
                 
   {
   _CLI();
   PORTA=0X02; //相位=0000,wr=1;
   asm volatile("sbi 0x12,6"::);//OFFCURRENT (PORTD.6)
  }
   
 

   
 

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

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

⌨️ 快捷键说明

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