📄 motor._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 + -