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

📄 main.c

📁 PWM输出控制三路步进电机
💻 C
字号:
/*
文件名:main.c
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <avr/wdt.h>

//#include <avr/delay.h>
#include "main.h"
//#include "dataflash.h"

//#include "Int_all.c"
//#include "lcm.h"
//#include "uart.h"
//#include "timechip.h"
#include "comm.h"
#include "sys.h"
//eeprom_write_byte (0xff,0xfe);
//eeprom_write_byte (0x1ff,0xfe);
//void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
//nsigned char EEPROM_read(unsigned int uiAddress);
//ISR_ALIAS(SIG_USART1_RECV,SIG_USART1_TRANS)
void Sys_Ini(void)
{
uchar i,j,k;
   DDRA   = 0x78;
   DDRB   = 0xF0; //1, out; 0,in   
   DDRC   = 0x10;
   DDRD   = 0xF9;    
   DDRE   = 0xba;    // OC3A-C--PE3-5 设置端口E
   DDRF   = 0x00;    // 设置端口F
   DDRG   = 0x00;    // 设置端口G

   PORTA  = 0x03;    // 端口G
   PORTB  = 0x00;   
   PORTC  = 0x40;
   PORTD  = 0xF9;      
   PORTE  = 0x42;    // 端口E   
   PORTF  = 0xF8;    // 端口F   
   PORTG  = 0x1f;    // 端口G      

//CTC3 timer3 over folw
	TCCR3A=0;
	TCCR3B=0;
	OCR3A=0x8;	// >10 important
	TCCR3A=0x40;//40;
	TCCR3B=0x0B;//44

//	TCNT3H =0xff;
//	TCNT3L =0xa0;
//	TCCR3A=0;
//	TCCR3B=3;

//CTC0   //T0设置;prescale=64
 	TCNT0 = 0x83;
    TCCR0  = 0x04; //10;    //T0设置;prescale=64
/*   TCCR0  = (1<<WGM01)|(0<<COM01)|(1<<COM00)|(1<<CS02)|(0<<CS01)|(0<<CS00);
   OCR0 = 5;
   TCNT0 = 0;
*/
//CTC1
	TCCR1A=0;
	TCCR1B=0;
	OCR1A=0x8;	// >10 important
	TCCR1A=0x40;//40;
	TCCR1B=0x0B;//44

 //CTC2
   TCNT2 = 0x83;
   TCCR2  = (1<<WGM21)|(0<<COM21)|(1<<COM20)|(1<<CS21);    //T2;32分之1分频
   OCR2 = 1;  
      
   TIMSK = (1<<TOIE0)|(1<<OCIE1A)|(1<<OCIE2);
   ETIMSK =  (1<<OCIE3A);
   MCUCR=0x00;
//
 //---------------------------------------串口0初始化 
   UCSR0B =  0x00; 
   UCSR0A  = 0x00;
   UCSR0B  = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE0);
   UCSR0C  = (1<<UCSZ01)|(1<<UCSZ00);  
   UBRR0H  = 0x00;
   UBRR0L  = 51;     // UBRR0L=51;9600,8,n,1。UBRR0L=25;19200,8,n,1,fosc=8M
//---------------------------------------串口1初始化  
   UCSR1B = 0x00; 
   UCSR1A  = 0x00;
   UCSR1B  = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
   UCSR1C  = (1<<UCSZ11)|(1<<UCSZ10);  
   UBRR1H  = 0x00;
   UBRR1L  = 51;     // UBRR1L=51;9600,8,n,1。UBRR1L=25;19200,8,n,1,fosc=8M
  // TCCR2  = (1<<WGM21)|(0<<COM21)|(1<<COM20)|(1<<CS22)|(0<<CS21)|(0<<CS20);
   //System_OF=1;
   System_ON_Start=1;
   Sys_count_1s=0;	
   power0=0;// power1=0;power2=0;power3=0;  
   PC_off_data=0;
   i=eeprom_read_byte(0xff);
   j=eeprom_read_byte(0x1ff);
   k =i+j;
   if(k == 0xfc)
   {
   		colin =1;
   }
   else
   {
   		colin=0;
	}
}
ISR(SIG_OVERFLOW0) //SIG_OVERFLOW2)
{
    uint8_t i;             //1ms	
	asm("nop");
	RS485_timer++;
	Touch_count++;
	Sys_count_10ms++;
    if(TM_count1 ++ > 99)
	{
      TM_count1=0;          //100ms	
	  Comm_DRV_count++;
	  Comm_SPD_count++;
	  idle_count++;
	  power_count1++;
	  power_count2++;
	  power_count3++;
	  power_count++;
	  if(power_count >60)
	  {
	  	 asm("nop");		
	     power_count=60;
	   }
      if(TM_count2 ++ >50)
	  { 
	  	 asm("nop");		
         TM_count2=0;
      }  
	}
	asm("nop");	
    TCNT0 = 29; //83;
}

ISR(SIG_OUTPUT_COMPARE3A) //Channel 1
{
    uint8_t i;
	asm("nop"); 
//	TCCR0  = 0x1B;
	Puls_count0++; //Puls_count[0] ++; 

	if(TM1_PWM_flag)
	{	 
	  asm("nop");		 
	  if(Start_data[0])  
	  {
	      asm("nop");		
		  if(Start_data[0] < Accel_step)
		  {	  	
		     asm("nop");		
		     Start_data[0]=0;
		  }
		  else
		  {	
		  		asm("nop");					  		
				i= OCR3A;
				if(i <= Const_T[0])
				{
					asm("nop");		
					i = Const_T[0];
					Start_data[0] -=Accel_step;
                }
                else
				{
					asm("nop");		
				    i= OCR3A;
					Start_data[0] -=Accel_step;					
					Raise_data[0] ++;
					if(Raise_data[0] < 10)
					{
						asm("nop");   
					}									
					else if(Raise_data[0] < 100)
					{
						asm("nop"); 
						if(i >3)
						   i -= 3; 
						else
						   i --;  
					}	
					else if(Raise_data[0] < 200)
					{
						asm("nop"); 
						if(i >2)
						   i -= 2; 
						else
						   i --;  
					}					
					else 
					{
						asm("nop");		
						i --;
					}
				}
				asm("nop");
				OCR3A = i;
		  }
	  }	
	  else if(End_data[0])
	  {
	  	  asm("nop");		
	  	  if(End_data[0] <= Accel_step)
		  {	  	
		  	 asm("nop");		
		     End_data[0]=0;
			 Start_flag[0]=0;	
		  }
		  else if(End_data[0] >150)
		  {
		  		asm("nop");		
		  	    End_data[0] -=Accel_step;
				OCR3A += 1;
		  }
		  else if(End_data[0] >50)
		  {
		  		asm("nop");		
		  	    End_data[0] -=Accel_step;
				OCR3A += 2;
				if(OCR3A >240)
				{
				   asm("nop");		
				   OCR3A = 0xEE; 
				 }
		  }
		  else
		  {
		  		asm("nop");		
				End_data[0] -= Accel_step;	
				if(OCR3A >240)
				{
				   asm("nop");		
				   OCR3A = 0xEE;   	
				 }
				 asm("nop");				
				 OCR3A += 3; //Const_T[0] +Accel_step;
				
		  }
	  }	
	  else
	  {	
	  	asm("nop");		
		Start_flag[0]=0;
	  }
	  asm("nop");		
	  TM1_PWM_flag=0;
    }
    else
	{
	  asm("nop");		
	  TM1_PWM_flag=1;  	
	}
}

ISR(SIG_OUTPUT_COMPARE2) //Channel 2
{
    uint8_t i;
	asm("nop");
	Puls_count1 ++; //Puls_count[1] ++; 
	if(TM2_PWM_flag)
	{
	  asm("nop");			  
	  if(Start_data[1])  
	  {
	      asm("nop");		
		  if(Start_data[1] < Accel_step)
		  {	  	
		     asm("nop");		
		     Start_data[1]=0;
		  }
		  else
		  {				  		
		        asm("nop");		
				i= OCR2;
				if(i <= Const_T[1])
				{
				    asm("nop");		
					i = Const_T[1];
					Start_data[1] -=Accel_step;
                }
			    else
				{
					//i= OCR2;
					asm("nop");		
					Start_data[1] -=Accel_step;					
					Raise_data[1] ++;
					if(Raise_data[1] < 10)
					{
						asm("nop");   
					}									
					else if(Raise_data[1] < 100)
					{
						asm("nop"); 
						if(i >3)
						   i -= 3; 
						else
						   i --; 
					}				
					else if(Raise_data[1] < 200)
					{
						asm("nop"); 
						if(i >2)
						{
						   asm("nop");		
						   i -= 2; 
						}
						else
						{
						   asm("nop");		
						   i --; 
						}
					}	
					else 
					{
					    asm("nop");		
						i --;
					}
				}
				asm("nop");
				OCR2 =i;
		  }
	  }	
	  else if(End_data[1])
	  {
	  	  asm("nop");		
	  	  if(End_data[1] <= Accel_step)
		  {	  	
		     asm("nop");		
		     End_data[1]=0;
			 Start_flag[1]=0;
		  }
		  else if(End_data[1] >150)
		  {
		        asm("nop");		
		  	    End_data[1] -=Accel_step;
				OCR2 += 1;
		  }
		  else if(End_data[1] >50)
		  {
		        asm("nop");		
		  	    End_data[1] -=Accel_step;
				OCR2 += 2;
				if(OCR2 >240)
				{
				   asm("nop");		
				   OCR2 = 0xEE;  
				}
		  }
		  else
		  {
		  		asm("nop");		
				End_data[1] -= Accel_step;	
				if(OCR2 >240)
				{
				   asm("nop");		
				   OCR2 = 0xEE;   	
				 }
				 asm("nop");				
				 OCR2 += 3; //Const_T[0] +Accel_step;				
		  }
	  }	
	  else
	  {	
	    asm("nop");		
		Start_flag[1]=0;
	  }
	  asm("nop");		
	  TM2_PWM_flag=0;
    }
    else
	{
	  asm("nop");		
	  TM2_PWM_flag=1;
	}
}

ISR(SIG_OUTPUT_COMPARE1A) //Channel 3
{
    uint8_t i;
	asm("nop");   
	Puls_count2 ++; //Puls_count[1] ++; 	
	if(TM3_PWM_flag)
	{
	  asm("nop");			  
	  if(Start_data[2])  
	  {
	  	  asm("nop");		
		  if(Start_data[2] < 4)
		  {	  	
		     asm("nop");		
		     Start_data[2]=0;
		  }
		  else
		  {				  		
		  	    asm("nop");		
				i= OCR1A;
				if(i <= Const_T[2])
				{
				    asm("nop");		
					i = Const_T[2];
					Start_data[2] -=Accel_step;
                }
                else
				{
				    asm("nop");		
					Start_data[2] -=Accel_step;					
					Raise_data[2] ++;
					if(Raise_data[2] < 30)
					{
						asm("nop");   
					}									
					else if(Raise_data[2] < 100)
					{
						asm("nop"); 
						if(i >3)
						{
						   asm("nop");		
						   i -= 2; 
						}
						else
						{
						   asm("nop");		
						   i --;  
						}
					}	
					else if(Raise_data[2] < 200)
					{
						asm("nop"); 
						if(i >2)
						{
						   asm("nop");		
						   i -= 3; 
						}
						else
						{
						   asm("nop");		
						   i --;   
						}
					}	
					else 
					{
						asm("nop");		
						i --;
					}
				}
				asm("nop");
				if( i < 16)
				{
					asm("nop");		
					i=16;
				}
				asm("nop");		
				OCR1A =i; 
		  }
	  }	
	  else if(End_data[2])
	  {
	  	  asm("nop");		
	  	  if(End_data[2] <= 3)
		  {	  	
		     asm("nop");		
		     End_data[2]=0;
			 Start_flag[2]=0;	
		  }
		  else if(End_data[2] >100)
		  {
		  		asm("nop");		
		  	    End_data[2] -=Accel_step;
				OCR1A += 1;
		  }
		  else if(End_data[2] >50)
		  {
		  		asm("nop");		
		  	    End_data[2] -=Accel_step;
				OCR1A += 2;
				if(OCR1A >240)
				{
					asm("nop");		
				   OCR1A = 0xEE;
				}
		  }
		  else
		  {
		  		asm("nop");		
				End_data[2] -= Accel_step;	
				if(OCR1A >240)
				{
					asm("nop");		
				   OCR1A = 0xEE;   	
				 }
				 asm("nop");				
				 OCR1A += 2; //Const_T[0] +Accel_step;				
		  }
	  }	
	  else
	  {	
	    asm("nop");		
		Start_flag[2]=0;
	  }
	  asm("nop");		
	  TM3_PWM_flag=0;
    }
    else
	{
	  asm("nop");		
	  TM3_PWM_flag=1;
	}
}

ISR(SIG_USART0_RECV)
{   
   asm("nop");		
   Recv_data[1] =Recv_data[0];
   Recv_data[0] =UDR0;
  
   if((Recv_data[0] == 0xAA) &&(Recv_data[0] == 0x55))
   {
   		asm("nop");		
   		Recv_number =2;
        Recv_buff[0]=0xAA;
		Recv_buff[1]=0x55;
      /*if(Recv_data[1] <4)
	  {
	     Recv_buff[0] = Recv_data[1];
         Recv_number =1;
	  } */  
   }
   else
   {
   		asm("nop");		
       Recv_buff[Recv_number] = Recv_data[0];
	   Recv_number++;
   }    
}

ISR(SIG_USART0_TRANS)
{
	asm("nop");		
  	if(Trans_number <13)
  	{      
		 asm("nop");		
	     UDR0 = Trans_buff[Trans_number];
         Trans_number++; 		 	     
   	}     
}

SIGNAL(SIG_USART1_RECV)
{
   //uchar temp0,i_t0;  
   asm("nop");		
   if(RS485_RCV_number <7)
   {      
   		 asm("nop");		
	     RS485_RCV_buff[RS485_RCV_number] = UDR1;
         RS485_RCV_number++;
		 if(RS485_RCV_number==7)
		 {
		 	asm("nop");		
			RS485_RCV_OK=1;
		 }		 	     
   }  
}

SIGNAL(SIG_USART1_TRANS)
{
 	asm("nop");		
   if(RS485_number <5)
   {
   		asm("nop");		
      	UDR1=RS485_send[RS485_number];
      	RS485_number++;  
		if(RS485_number ==5)     
		{
			asm("nop");		
			receive485;
   		}
   }       
}

void main(void)
{
	asm("nop");		
    Sys_Ini();
	asm("nop");		
	wdt_enable(7);
	asm("nop");		
	sei();
	asm("nop");		
	while(1)
	{
		asm("nop");
		COMM();
		asm("nop");		
		wdt_enable(7);	
		asm("nop");
		system();
		asm("nop");

		asm("nop");
	
		asm("nop");	
	}
}


⌨️ 快捷键说明

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