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

📄 motor_main.c

📁 基于AVRICC开发环境的ATMEL mega16单片机的电机速度控制程序
💻 C
字号:
//ICC-AVR application builder : 2005-8-3 
// Target : M16
// Crystal: 4.0000Mhz
//closed speed loop controlling 

#include <iom16v.h>
#include <macros.h>

#pragma data:code
const unsigned char table[]={0xbd,0x84,0xd9,0xcd,0xe4,0x6d,0x7d,0x85,0xfd,0xed};//7segment
#pragma data:data
unsigned char ledbuff[]={0xbd,0xbd,0xbd,0xbd};

unsigned char adc_res8,count;
unsigned char ad_mux;
unsigned int adc_res16,count16;

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0xF0;//HIGH 4BIT AS OUTPUT
 PORTB = 0x00;
 DDRB  = 0xfd;//t1 input other output
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xFF;//port d as a output
}


//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 2mSec
// actual value:  2.000mSec (0.0%)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x16; //set count
 OCR0  = 0x57;  //set compare
 TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 unsigned char temp;
 temp=SREG;
 //unsigned int temp16;
 TCCR1B=0X00;//STOP T1
 TCCR0=0X00;//STOP T0
 count++;
 count16=TCNT1;
 TCNT1H = 0x00 /*INVALID SETTING*/; //setup
 TCNT1L = 0x00 /*INVALID SETTING*/;
  
 TCNT0 = 0x16; //reload counter value
 OCR0=0X57;
 TCCR0=0X05;//START TIMER0
 TCCR1B=0X07;//START T1
  if (count16==0)
   {
   	TCCR0=0X00;
   }
 SREG=temp;
}
//TIMER1 initialize - prescale:Rising edge
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value: Out of range
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*/;
 //OCR1CH = $OCR1CH$;
 //OCR1CL = $OCR1CL$;
 ICR1H  = 0x00 /*INVALID SETTING*/;
 ICR1L  = 0x00 /*INVALID SETTING*/;
 TCCR1A = 0x00;
 TCCR1B = 0x07; //start Timer
}
       
//TIMER2 initialize - prescale:1
// WGM: PWM Phase correct
// actual value: 15.686KHz (93.6%)
void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x01; //setup
 OCR2  = 0xFF;
 TCCR2 = 0x61; //start
}

//#pragma interrupt_handler timer2_ovf_isr:5
//void timer2_ovf_isr(void)
//{
// unsigned char temp;
// temp=SREG;
// OCR2=adc_res8;
// SREG=temp; 
//}

//ADC initialize
// Conversion time: 3uS
void adc_init(void)
{ad_mux=0x01;
 ADCSR = 0x00; //disable adc
 ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f); //select adc input 0
 ACSR  = 0x80;
 ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
}

//#pragma interrupt_handler adc_isr:15
//void adc_isr(void)
//{
// 	 unsigned char temp;
//	 temp=SREG;
 	// adc_res8=ADCH;
	 //hex2bcd(adc_res8);
	 //ad_mux=0x01;
	 //ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f);
//	 ADCSRA|=(1<<ADSC);//start adc again
// SREG=temp;
//}

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

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x41; //enable timer0 timer2 interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}
void delay_1ms(void)
{
 unsigned int i;
 for (i=0;i<542;i++)
 ;
}
void hex2bcd(unsigned int cnt)
{
 unsigned char i,temp;
 for (i=0;i<4;i++)
 	 {
	  temp=cnt%10;
	  ledbuff[i]=table[temp];
	  cnt=cnt/10;
	 }
}

void display(void)
{
 	 unsigned char i;
	 for (i=0;i<4;i++)
	 {
	  PORTB=ledbuff[i];
	  PORTA=~(1<<(4+i));
	  delay_1ms();
	  PORTA|=(1<<(4+i));
	 }
}


main()
{
 	  init_devices();
	  count=0;
	  while(1)
	  {
	   //hex2bcd(adc_res8);
	   hex2bcd(count16);
	   display();
	  }	  
}

⌨️ 快捷键说明

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