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

📄 motor._c

📁 步进电机驱动程序。ICCAVR开发。ATMEGA8
💻 _C
字号:
//ICC-AVR application builder : 2008-7-3 10:08:15
// Target : M8
// Crystal: 4.0000Mhz

#include <iom8v.h>
#include <macros.h>

#define uchar unsigned char
#define unint unsigned int
#define MaxAngle 2880


void motor(void);

//GLOBAL VARIABLES
//SIGNALS
uchar MotorBlocked = 0;

//MOTOR POSITION
SpeedMotorCurrent = 0;
SpeedMotorSetting = 2880; //test




void port_init(void)
{
 PORTB = 0x04;
 DDRB  = 0xef;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x40;
 PORTD = 0x00;
 DDRD  = 0x80;
}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 0.1Sec
// actual value:  0.100Sec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xF0; //setup
 TCNT1L = 0xBE;
// TCNT1H = 0x67; //setup
// TCNT1L = 0x6A;
 OCR1AH = 0xC3;
 OCR1AL = 0x50;
 OCR1BH = 0xC3;
 OCR1BL = 0x50;
 ICR1H  = 0xC3;
 ICR1L  = 0x50;
 TCCR1A = 0x00;
 TCCR1B = 0x05; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0xF0; //reload counter high value
 TCNT1L = 0xBE; //reload counter low value
// TCNT1H = 0x67; //setup
// TCNT1L = 0x6A;
 
  MotorBlocked = 0;
 //TEST
 PORTB ^= BIT(2);	 

}

//TIMER2 initialize - prescale:32
// WGM: Normal
// desired value: 1KHz
// actual value:  1.000KHz (0.0%)
void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x83; //setup
 OCR2  = 0x7D;
 TCCR2 = 0x03; //start
}

#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
 TCNT2 = 0x83; //reload counter value
// TCNT2 = 0x07; //reload counter value
 //unblock motor
}

//SPI initialize
// clock rate: 250000hz
void spi_init(void)
{
 SPCR = 0x51; //setup SPI
 SPSR = 0x00; //setup SPI
}

//ADC initialize
// Conversion time: 104uS
void adc_init(void)
{
 ADCSR = 0x00; //disable adc
 ADMUX = 0x00; //select adc input 0
 ACSR  = 0x80;
 ADCSR = 0xED;
}

#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
 //conversion complete, read value (int) using...
 // value=ADCL;            //Read 8 low bits first (important)
 // value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 //external interupt on INT0
}

#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
 //external interupt on INT1
}

//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();
 spi_init();
 adc_init();

 MCUCR = 0x0F;
 GICR  = 0xC0;
 TIMSK = 0x44; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
 init_devices();
 //insert your functional code here...
 while(1)
 {
    if(MotorBlocked==0)
	  motor();
 }
	  
}

uchar IOWord = 0x00;

//===============================================
//=============MOTOR SUBROUTINE=================
//================================================
void motor(void)
{
 	 uchar clockwise = 0x00;//test
	 uchar anticlockwise = 0;
/* 	 //CALCULATE THE DIRECTION OF ALL MOTOR
	 if(SpeedMotorCurrent<SpeedMotorSetting)
	 {	 	 
	//   SpeedMotorCurrent++;
	   clockwise |=BIT(1); //SPEED invert
	 }
	 else if (SpeedMotorCurrent>SpeedMotorSetting)
	 {
	//   SpeedMotorCurrent--;
	   anticlockwise |= BIT(1); //SPEED invert
	 }
*/
	 int delay;
	 PORTB ^=BIT(1);
//	 PORTD ^=BIT(7);
	 //CLOCKWISE 
	   //set DAD1(PB7)
	   PORTB |= BIT(7);
	   //set DAC1-8 through SPI
	   SPDR = 0x01;//clockwise;	//SPIOUTPUT
	   while ( !(SPSR & BIT(7)) )	;		//wait  
 	   PORTB |= BIT(0);		 	//SET OUTCS
	   _NOP();
	   PORTB &= ~BIT(0);		//CLEAR OUTCS
	   //clear DAC1-8
	   SPDR = 0x00;	  		 //SPIOUTPUT
	   while ( !(SPSR & BIT(7)) )	;	  	//wait		
	   PORTB |= BIT(0);		 	//SET OUTCS
	   _NOP();
	   PORTB &= ~BIT(0);		//CLEAR OUTCS

	   SPDR = IOWord;	  		 //SPIOUTPUT
	   while ( !(SPSR & BIT(7)) )	;	  	//wait		
	   PORTD = BIT(7);
	   _NOP();
	   PORTD &= ~BIT(7);
	   IOWord = ~IOWord;
	 
	 //ANTICLOCKWISE
	 /*
	   //clear DAD1(PB7)
	   PORTB &= BIT(7);
	   //set DAC1-8 through SPI
	   SPDR = anticlockwise;	//SPIOUTPUT
	   while ( SPSR & BIT(7) )	;		//wait   
	   PORTB |= BIT(0);		 	//SET OUTCS
	   _NOP();
	   PORTB &= ~BIT(0);		//CLEAR OUTCS	   
	   //clear DAC1-8
	   SPDR = 0;	  		 	 //SPIOUTPUT
	   while ( SPSR & BIT(7) )	;	  	//wait		 
	   PORTB |= BIT(0);		 	//SET OUTCS
	   _NOP();
	   PORTB &= ~BIT(0);		//CLEAR OUTCS	   
	 //}
	 */
	 
	 //BLOCK
	 MotorBlocked = 1;
	 
}

⌨️ 快捷键说明

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