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

📄 main._c

📁 一个正在应用的步进电机控制程序,包括电机的调速,正反,细分,通讯控制
💻 _C
📖 第 1 页 / 共 2 页
字号:
D/A初始化函数
******************************************************/
void da_init(void)
{
cal_timer1(speed);
PORTA|=(1<<DA_WR);
PORTD|=(1<<DA_CS);
DDRA|=(1<<DA_WR);
DDRD|=(1<<DA_CS)|(1<<DA_AB);
DDRC|=(1<<DA_SIN)|(1<<DA_COS);
DATA_OUT=0x00;
DATA_IO=0xff;
timer1_init();
}


/****************************************************************
A/D初始化
****************************************************************/
void adc_init(void)
{
ADMUX=0b00000000;	  //选择ADC0做AD输入						 
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADATE);  //允许AD转换,128分频
}



void adc_change(void)
{
unsigned char i;
unsigned char k;
unsigned int j;
unsigned int g;
unsigned char l;
unsigned int s[10];
g=0;
for (l=0;l<10;l++)
	{
	for (k=0;k<10;k++)
		{
		ADCSRA|=(1<<ADSC);
		i=ADCSRA;
		while ((i&(1<<ADIF))==0)
   			  {i=ADCSRA;}
   		j=ADC;
   		s[k]=j; 
  		ADCSRA|=(1<<ADIF);
		}
	ins(s,10);
	j=0;
	for (k=0;k<5;k++)
  		 {
   		 j=j+s[k+2];
  		 }
	j=j/5;
	g=g+j;
	}
g=g/10; 
g=g*6/10;
if (g<=6)
  {g=1;}
else
  {g=g-6;}
if (g>=600)
   {g=600;}
if (g<=1)
   {g=1;}
out_ctr=g;
}

void ins(unsigned int *item,unsigned char count)
{
unsigned char a;
unsigned char b;
unsigned int t;
for (a=1;a<count;a++)
   {
   t=item[a];
   b=a-1;
   while(b>=1&&t<item[b])
      {
	  item[b+1]=item[b];
	  b--;
	  }
   item[b+1]=t;
   }
}

/*
*电流输出允许函数
*/
void i_en(void)
{
TIMSK |= (1<<OCIE1A);
PORTC|=(1<<INT);
DDRC |=(1<<INT);
}

/*
*电流输出禁止函数
*/
void i_disen(void)
{
TIMSK &=~(1<<OCIE1A);
delay_ms(100);
PORTC&=~(1<<INT);
DDRC |=(1<<INT);
}
  
/*
*根据速度判断细分数函数
*/
unsigned char sp_mic(unsigned int sudu)
{
unsigned char i;
   if (sudu<=410)
   	  {
	  if (sudu<=290)
	  	 {
		 if(sudu<=210)
		    {
			if (sudu<=140)
			   {i=16;}
			else
			   {i=8;}
			}
		 else
		    {i=4;}
		 }
	  else
	  	 {i=2;}
	  }
   else
   	  {i=1;} 
return i; 
}


/*
缓启动函数
*/
void speed_slow(unsigned int speed_start,unsigned int speed_end)
{
unsigned char i;
for (i=0;speed_start<speed_end;i++)
    {
	cal_timer1(speed_start);
	speed_start=speed_start+5;
	delay_ms(slow_time);            //缓启动加速延时
	}
	speed_start=speed_end;//abcd
    cal_timer1(speed_start);
}

void cal_timer1(unsigned int sudu)
{
unsigned long data;
micros_nu=sp_mic(sudu);
data=1200000/(sudu*micros_nu);
if (sudu==1)
  {
  data=data/8;
  TCCR1B |= (1<<CS11); 
  TCCR1B &=~(1<<CS10);
  data=data-1;
  }
else
  {
  TCCR1B |= (1<<CS10);
  TCCR1B &=~(1<<CS11);
  data=data-1;
  }
time_da=data;
}

void out_ctrol(void)//abcd
{ 
unsigned char temp;
i_disen();
state&=0b11110101;
state2|=0b00100000;		
}  
  
void adc_ctrol(void)
{ 
adc_change();
speed_slow(speed,out_ctr);
if (out_ctr==speed)
	{asm("nop");}
else 
  	{speed=out_ctr;}  
} 

/*键盘处理函数*/
void key_disposal(void)
{
  unsigned char i;
  unsigned char j;
  unsigned int temp;
  switch (key)
    {
/*******************************启停控制*********************************/	
	case runstop_nu:	
			  				
		    if((state&0b00001000)==0)			  //判断启停状态
	     	   {
		       state|=0b00001000;
		       i_en();
		       speed_slow(1,speed);
		       }
	        else
	           {
		       i_disen();
		       state&=0b11110111;
			   }
	  key=empty;
	  break;
/******************************正反转控制**********************************/	  
	case cwccw_nu:	

	           if ((state|0b11111110)==0b11111110)	    //判断正反状态					  
	              {
		          state|=0b00000001;	
	              } 		
	           else 
	              {
		          state&=0b11111110;
		          }			 
		       speed_slow(1,speed);
	  key=empty;
	  break;
    }
}

//状态初始化函数
void state_init(void)  
{ 
	  if ((state&0b00001000)!=0)			  //如果电机没有运行可执行确认操作
         {
	     state&=0b11110111;
	     key=runstop_nu;
	     }
    key_disposal();
}
//停止所有运行 
void all_stop(void)   
{ 
			   i_disen();
	           state&=~(1<<RUN_STOP); 
}

//所有参数的出厂缺省值
void defult_fac(void)
{
unsigned int temp;
if ((EEPROMread(DEFAULT_ROMADDR))!=0)
  {
  do {temp=EEPROMwrite(DEFAULT_ROMADDR,0);}
  while(temp>0);	
  speed=50;
  EEPROMWriteWord(speed_romaddr,&speed);	
  state=0;
  do {temp=EEPROMwrite(state_romaddr,state);}
  while(temp>0);	
  pump_tab=1;
  do {temp=EEPROMwrite(pump_tab_romaddr,pump_tab);}
  while(temp>0);	
  state_other=0;
  do {temp=EEPROMwrite(state_other_romaddr,state_other);}
  while(temp>0);	
  }
//do {temp=EEPROMwrite(DEFAULT_ROMADDR,1);}
//while(temp>0);				
} 


/****************************************************************
                              主函数
****************************************************************/
void main(void)
{ 
  unsigned char i;
  CLI(); 
  defult_fac();
  EEPROMReadWord(speed_romaddr,&speed);	
  pump_tab=EEPROMread(pump_tab_romaddr);
  if ((pump_tab>=31)||(pump_tab==0))
    {pump_tab=1;}
  if ((speed>600)||(speed==0))
    {speed=1;}
  state=0;
  state0=0;
  state1=0;
  state2=0;
  wrong=0;
  micros_nu0=16;
  in_out_number=in_int;
  in_out_state=in_int;
  port_init(); 		   		//端口初始化
  da_init(); 
  out_init();		        //外控初始化
  serial_init();
  adc_init();
  int0_init();
  cal_timer1(speed);
  GIFR=0;
  TIFR=0;
  SEI(); 
  delay_ms(50);
  i_disen();
  job_att(0);
  //临时
  state2|=0b00000010;//进入计算机控制状态
  while(1)					//按键循环处理
     {
        job_att(1);					  //485
		in_out_number=out_v; 
	        switch (in_out_number)  
			   {          
			   case out_v :				   	  //外控电压
			      if (in_out_state!=out_v)
				     {
					 in_out_state=out_v;
					 out_ctrol();
					 pull_stop();
					 }
				  adc_ctrol();
				  break;  
			   case out_pull:
			      if (in_out_state!=out_pull)
				    {
					in_out_state=out_pull;
					timer2_init();
					pull_start();
					}
				  if (speed_pull>2400)
				    {speed_pull=2400;}
				  if(speed_pull<=4)
				    {speed_pull=4;}
				  //cal_timer1();
				  speed_slow(speed,speed_pull/4);
				  speed=speed_pull/4;
			   default :
	  		   	  break;
			   }
	 out_key();
     key_disposal();
	 }   
}

⌨️ 快捷键说明

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