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

📄 dtm48-td.c

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

#include <iom48v.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
}

//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 255uSec
// actual value: 255.000uSec (0.0%)
void timer2_init(void)
{
 TCCR2B = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x01; //setup
 OCR2A = 0;
 OCR2B = 0x00;
 TCCR2A = 0x00; 
 TCCR2B = 0x02; //start
}
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCSR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
}


//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();
 timer2_init();
 watchdog_init();

 MCUCR = 0x00;
 EICRA = 0x00; //extended ext ints
 EIMSK = 0x00;
 
 TIMSK0 = 0x00; //timer 0 interrupt sources
 TIMSK1 = 0x00; //timer 1 interrupt sources
 TIMSK2 = 0x03; //timer 2 interrupt sources 

 PCMSK0 = 0x00; //pin change mask 0 
 PCMSK1 = 0x00; //pin change mask 1 
 PCMSK2 = 0x00; //pin change mask 2
 PCICR = 0x00; //pin change enable 
 PRR = 0x00; //power controller
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}


/*		微秒级延时程序	*/	
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_compa_isr:8
void timer2_compa_isr(void)
{
 //compare occured TCNT2=OCR2a
 if(zb<255)
  {j10;j20; j30;j40;} 
}

#pragma interrupt_handler timer2_ovf_isr:10
void timer2_ovf_isr(void)
{
  if(zb>0)
  {
  if(flag==1)
   {j11;j31;}
   else
  if(flag==0)
   {j21;j41;}  
  }
 TCNT2 = 0x0; //reload counter value
 OCR2A=zb;
}


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

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

void main(void)
{
unit tr;
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();

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

WDR();

if(!(PINB&0x20))
 { 
 delay(300);
 if(!(PINB&0x20))
  { 
  cy();
  WDR();
  LED1;
  delay(10);
  mark=aa;  EEPROM_WRITE(0x110,mark);
  j10;j20;j30;j40;
  CLI();
  delay(500);
  SEI();
  }
 }

}  
}

⌨️ 快捷键说明

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