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

📄 main._c

📁 数字舵机(1) 数字脉宽检测 数字脉宽检测
💻 _C
📖 第 1 页 / 共 2 页
字号:
 OCR1BL = 0x20;
 OCR1CH = 0x4E;
 OCR1CL = 0x20;
 ICR1H  = 0x4E;
 ICR1L  = 0x20;
 TCCR1A = 0x01;
 TCCR1B = 0x12; //start Timer
}*/
//TIMER1 initialize - prescale:256
// WGM: 7) PWM 10bit fast, TOP=0x03FF
// desired value: 40mSec
// actual value: 32.768mSec (18.1%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFC; //setup
 TCNT1L = 0x01;
 OCR1AH = 0x03;
 OCR1AL = 0xFF;
 OCR1BH = 0x03;
 OCR1BL = 0xFF;
 OCR1CH = 0x03;
 OCR1CL = 0xFF;
 ICR1H  = 0x03;
 ICR1L  = 0xFF;
 TCCR1A = 0xAB;
 TCCR1B = 0x0C; //start Timer
}

#pragma interrupt_handler timer1_capt_isr:iv_TIM1_CAPT

void timer1_capt_isr(void)
//ICP输入捕获中断处理程序 
//SIGNAL(SIG_INPUT_CAPTURE1) 
{ PORTF=~PORTF;
        
		if(shang_johu)
		  {
		     					//ICR1=0;;	
						        temp1 = ICR1;							   
                                //TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us                                
								TCCR1B &= ~(1<<ICES1); 	
								//shang_johu=0;	
								
		  }
		else
		  {
                                temp2 = ICR1; 
                                TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能                                 
                                //TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10)); 
                                //TCNT1 = 0; 
                                
														 
                               //temp2 -= temp1; 
							  
   							   //TCCR1B=0x00; 
							   TCCR1B |= (1<<ICES1);
							   count1=0;
							   //shang_johu=1;	 
		  }
shang_johu=!shang_johu;
/*
		count1++;
        switch(count1) 
        { 
                case 2://第一次捕获,则开始计数 
                        {
						       ICR1=0;
						       temp1 = ICR1;
							   
                                TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us                                
								TCCR1B &= ~(1<<ICES1); 				
					   		    
                        } 
                        break; 
                case 3: //第二次捕获,表示一个周期结束,计数结束 
                        { 
                                temp2 = ICR1; 
                                TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能                                 
                                //TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10)); 
                                //TCNT1 = 0; 
                                
														 
                               //temp2 -= temp1; 
							  
   							   TCCR1B=0x00; 
							   TCCR1B |= (1<<ICES1);
							   count1=0;
                        } 
                        break; 
						
                default:  ; 
        } 
*/		 
} 


#define PWM_ON    DDRB|=   R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1;
#define PWM_OFF   DDRB&= ~(R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1);
main()
{int n;
unsigned char n_jiaodu=0,n_juli=0;
unsigned char n_sec=0;
unsigned int pwm_duoji=0;


unsigned char i=0;
init_devices();
timer1_init();timer0_init();
 //OCR1AH = 0x00;
/* OCR1AL = 64;
 //OCR1BH = 0x00;
 OCR1BL = 64;
 //OCR1CH = 0x00;
 OCR1CL = 64;
 OCR0=64;*/

 
//while(1);
DDRE|=0x38;//while(1);
/////////LCD
	/* DDRB = 0xBF;    //SI输入,SO,SCK,SS输出
	 SPCR = 0x50;  //setup SPI
	 SPSR = 0x01;  //setup SPI*/
/*while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
UDR0='a';*/
delay_ms(3000);
number_uart1(1010,1);
			number_uart1(xx,0);
			number_uart1(ADCjohu,1);
delay_ms(3000);	
xx=0;
//LCD_Init();
//LCD_clear();

DDRE &= ~0x7c;//if (!(PORTE & STOP))  if (!(PORTE & VOLDOWN))  if (!(PORTE & VOLUP))  if (!(PORTE & NEXTSONG))  if (!(PORTE & PREVSONG))
PORTE |=0x7c;

PORTD=0x01;
//number(0,0,4,-999,1);
	     /* OCR1AL = pwm_pingjun;
 		  OCR1BL = pwm_pingjun;
 		  OCR1CL = pwm_pingjun;
 		  OCR0=pwm_pingjun;*/
		  
        PORTD &= ~(1<<PD4); 
        DDRD  &= ~(1<<PD4); 
        //初始化TC1 
       /* TCCR1A = 0x00; 
        TCNT1  = 0x00; 
        TCCR1B |= (1<<ICES1);//(1<<ICNC1)|打开输入捕捉噪声抑制器 |上升沿触发捕捉,噪声捕捉器需打开,否则会导致上升沿/下降沿捕捉不准确,出来的结果会相差一半 
        TCCR1B |= (1<<CS11);//8分频,8M时钟时正好1us 
        SEI(); 
        TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));*/ 
        
		TCCR1B = 0x00;//停止定时器 
        TIMSK |= 0x20;//中断允许 
        ICR1H  = 0xFF; 
        ICR1L  = 0xFF;//输入捕捉匹配值 
        TCCR1A = 0x00; 
        TCCR1B = 0x83;//启动定时器 
		TCCR1B |= (1<<ICES1)|(1<<ICNC1)|(1<<CS11);//|(1<<CS10)8分频,8M时钟时正好1us 
		TCCR1B |= (1<<ICES1);
		//方法一:采用直接测频率的方法,PROTEUS仿真通过 
        /*while(1) 
        { 
                for(i=0; i<50; i++)delay_ms(10); 
                TCNT1 =0; 
                TCCR1B = ((1<<CS12)|(1<<CS11)|(1<<CS10)); 
                for(i=0; i<100; i++)delay_ms(10);//此处用简单的延时函数,精度有限,更高精度可以用timer来尝试 
                TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10)); 
                //printf("TCNT1=%8u 频率=%8uHz\r\n", TCNT1, TCNT1); 
				number_uart1(TCNT1,0);
				number_uart1(TCNT1,1);
				
        }*/ 
         
        //方法二:采用测量周期的方法 
        while(1) 
        { 
                count1=1; 
                //for(i=0; i<250; i++)
				delay_ms(2); 
                TIMSK |= (1<<TICIE1);//打开输入捕捉器中断使能 
	
                while(count1);//count1循环,等待捕获中断处理完成, 
                //printf("temp1:%6u temp2:%6u width:%6lu\r\n", temp1, temp2, (temp2>=temp1)?(temp2-temp1):(65536-temp1+temp2));
			    number_uart1(temp1,0);
				number_uart1(temp2,0);
				
				//if (temp2>temp1)
				//    { pwm_duoji=(temp2-temp1); number_uart1(pwm_duoji  ,1   );}
				//else 
				    { pwm_duoji=(temp1-temp2); number_uart1(pwm_duoji  ,1   );}
				
				
        } 
	  
while(1)
{
		if (!(PINE & NEXTSONG))
	     {delay_ms(50);
		  if (!(PINE & NEXTSONG))
		  {
			 //CLI();
		     if(pwm_duoji<0x3ff) pwm_duoji++;
 			 OCR1BH = (pwm_duoji>>8)&0x07;
 			 OCR1BL = pwm_duoji; 
			 /*OCR1BH = 0x03;
 			 OCR1BL = 0xF0;
 			 OCR1CH = 0x03;
 			 OCR1CL = 0xF0;
			 */
			PWM_ON
			//SEI();
		  }
		}
		if (!(PINE & PREVSONG))
	     {delay_ms(50);
		  if (!(PINE & PREVSONG))
		  {
			 //CLI();
		     if(pwm_duoji>0) pwm_duoji--;
 			 OCR1BH = (pwm_duoji>>8)&0x07;
 			 OCR1BL = pwm_duoji; 
			 /*OCR1BH = 0x03;
 			 OCR1BL = 0xF0;
 			 OCR1CH = 0x03;
 			 OCR1CL = 0xF0;
			 */
			PWM_ON
			//SEI();
		  }
		}

}
  while(1)
  { //(unsigned char)jiaodu;
  	PORTF=juli;
  	if (!(PINE & STOP))jiaodu=100;//PWM_ON//PORTD=~PORTD;
    if (ms==1)
   	   { //if (jiaodu!=n_jiaodu)//test
	   	 if (jiaodu!=0)
	      {//PORTF=jiaodu;
		    //if (jiaodu<0-20)//test  旋转
			if (ADCjohu<jiaodu-20)
	   	 	 {DDRB |=(R_pwm1 | L_pwm0);
			  DDRB &=~(R_pwm1 | L_pwm0);
			  PORTB &=~(R_pwm0 |R_pwm1| L_pwm1 | L_pwm0);
			  OCR1AL = pwm_pingjun;
 		  	  OCR1BL = pwm_pingjun;
 		  	  OCR1CL = 0;
 		  	  OCR0=0;
			  PWM_ON
			 }
		    //else if (jiaodu>0+20)//test
			else if (ADCjohu>jiaodu+20)
	   	 	 {DDRB |=(R_pwm0 | L_pwm1);
			  DDRB &=~(R_pwm0 | L_pwm1);
			  PORTB =0xf0;
			  OCR1AL = 0;
 		  	  OCR1BL = 0;
 		  	  OCR1CL = pwm_pingjun;
 		  	  OCR0=pwm_pingjun;
			  PWM_ON
			 }
		    else PWM_OFF
		   n_jiaodu=jiaodu;
		  }
		 if (juli!=0) 
		 if (sec!=n_sec)
		    {
			 if (juli>0)
	   	 	  {DDRB |=(R_pwm1 | L_pwm1);
			   DDRB &=~(R_pwm1 | L_pwm1);
			   OCR1AL = 0;
 		  	   OCR1BL = pwm_pingjun+Rpwm0;
 		  	   OCR1CL = 0;
 		  	   OCR0=pwm_pingjun;
			   PWM_ON
			   juli--;
			  }
			 else if (juli<0)
	   	 	  {DDRB |=(R_pwm0 | L_pwm0);
			   DDRB &=~(R_pwm0 | L_pwm0);
			   OCR1AL = pwm_pingjun;
 		  	   OCR1BL = 0;
 		  	   OCR1CL = pwm_pingjun;
 		  	   OCR0=0;
			   PWM_ON
			   juli++;
			  }/**/
			 else PWM_OFF
			n_sec=sec;
			}	

	   	//number(0,2,5,xx,1);
		//number(0,4,5,ADCjohu,1);
		if (!(PINE & PREVSONG))xx=0;
		if (!(PINE & NEXTSONG))
	    	{
			//CLI();
			number_uart1(xx,0);
			number_uart1(ADCjohu,1);
			delay_ms(20);
			//SEI();
			}
   	    ms=0;
       }
  }

}

⌨️ 快捷键说明

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