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

📄 dtm8-td._c

📁 航模用AVR M48开发的无刷电调驱动
💻 _C
字号:
/******************************************/
/*         燕山大学无线电爱好者协会       */
/*                电子调速器              */
/*     作者:张翃鹏     2005-2-27 9:04:40  */
/*     目标MCU:MEGA8    晶振:INT RC 8MHZ  */
/******************************************/

#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define xtal 8 
#define j11 PORTD|=0x02
#define j10 PORTD&=~0x02
#define j21 PORTD|=0x10
#define j20 PORTD&=~0x10
#define j31 PORTB|=0x40
#define j30 PORTB&=~0x40
#define j41 PORTD|=0x40
#define j40 PORTD&=~0x40
#define LED1 PORTB|=0x08;
#define LED0 PORTB&=~0x08;


int mark=1500;
unit ai,aa;
uchar i,j,az,flag,flagh,zb,mid,pwm;

void port_init(void)
{
 PORTB = 0x23;
 DDRB  = 0x58;
 PORTC = 0x04; //m103 output only
 DDRC  = 0x38;
 PORTD = 0x00;
 DDRD  = 0x52;
}

void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0x00 /*INVALID SETTING*/; //setup
 TCNT1L = 0x00 /*INVALID SETTING*/;
 OCR1AH = 0x00 /*INVALID SETTING*/;
 OCR1AL = 0x00 /*INVALID SETTING*/;
 OCR1BH = 0x00 /*INVALID SETTING*/;
 OCR1BL = 0x00 /*INVALID SETTING*/;
 ICR1H  = 0x00 /*INVALID SETTING*/;
 ICR1L  = 0x00 /*INVALID SETTING*/;
 TCCR1A = 0x00;
 TCCR1B = 0x02; //start Timer
}

void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x00 /*INVALID SETTING*/; //setup
 OCR2  = 0x00 /*INVALID SETTING*/;
 TCCR2 = 0x02; //start
}

void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
}

void init_devices(void)
{
 CLI(); //disable all interrupts
 port_init();
 timer1_init();
 timer2_init();
 watchdog_init();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x40; //timer interrupt sources
 SEI(); //re-enable interrupts
}

/*		微秒级延时程序	*/	
void del(int time)
	 {     
  	  do
	  	{
		 time--;
		}	
  	  while (time>1);
	 }
	 
/*	   毫秒级延时程序   	*/	 
void delay_1ms(void)
{ unsigned int i1;
 for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
    ;
}

void delay(unsigned int n)
{
 unsigned int i2=0;
   while(i2<n)
   {delay_1ms();
    i2++; WDR();
   }
}


#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
WDR();
pwm++;
if(pwm==250) 
 {
 pwm=0;
 if(zb>0)
  {
  if(flag==1)
  {j11; j31;}
  if(flag==0)
  {j21; j41;}  
  }
 }
if(pwm==zb) 
 {j10;j20;j30;j40;}

TCNT2 = 0xF0;	//reload counter value

}


unit fenc(int bb)             
{
 int bc;        
 if((bb<mark-700)||(bb>(mark+700))) return(0);              
 if((mark-bb)<0)  
  {
  flag=1;
  bc=bb-mark;
  }
 if((mark-bb)>0)
  {
  flag=0;
  bc=mark-bb;
  }    
 if(bc<=25) { LED1; }  else { LED0; }   
 if(bc<=50)  return(0);
 if(bc>=300)  return(250);
 return(bc-50);
}

void cy(void)
{
 if(!(PINC&0x04))
   { 
   TCNT1=0; 
   while(!(PINC&0x04)) WDR();
   aa=TCNT1;
   zb=fenc(aa);
   }
}

void main()
{
EEPROM_READ(0x10,ai);//校正振荡频率
OSCCAL=ai;
init_devices();

EEPROM_READ(0x112,ai);   


if(ai==0xFFFF)
{
mark=1500;   //0xD805
EEPROM_WRITE(0x110,mark);    
aa=0;
EEPROM_WRITE(0x112,aa);
}
EEPROM_READ(0x110,mark);


while(1)
{

cy();
WDR();


if(!(PINB&0x20))
 { 
 delay(10);
 if(!(PINB&0x20))
  { 
  cy();
  WDR();
  LED1;
  delay(10);
  mark=aa;  EEPROM_WRITE(0x110,mark);
  CLI();
  delay(200);
  SEI();
  }
 delay(100);
 }

}  
}

⌨️ 快捷键说明

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