📄 dc-motor.c
字号:
//ICC-AVR application builder : 2006-9-12 23:29:35
// Target : M8
// Crystal: 11.059Mhz
//实验板一的程序
#include <iom8v.h>
#include <macros.h>
#define FORWARD 0x00
#define BACKWARD 0x01
#define STOP 0x02
/*
PB0------in1
PB1------in2(OC1A)
PB2------in3(OC1B)
PB3------in4
*/
unsigned char dir_flag; // dir_flag 电机方向标记
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x7E;
PORTD = 0x00;
DDRD = 0xF3;
}
//TIMER1 initialize - prescale:1
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 20KHz
// actual value: 20.034KHz (0.2%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00; //setup
TCNT1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
ICR1H = 0x02;
ICR1L = 0x27;
TCCR1A = 0x02;
TCCR1B = 0x19; //start Timer
}
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
PORTB&=~(1<<1);// 输出比较匹配时,PB0,PB1全部为低,使得运动停止
PORTB&=~(1<<0);
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
// 定时器1溢出中断处理
{
if(dir_flag==FORWARD)
{//如果要求电机正转
PORTB&=~(1<<0); // pb0=0=in1
PORTB|=(1<<1); // pb1=1=in2
}
else if(dir_flag==BACKWARD)
{//如果要求电机反转
PORTB&=~(1<<1); // pb1=0
PORTB|=(1<<0); // pb0=1
}
else//如果要求电机停止
{
PORTB&=~(1<<1); // pb0=0
PORTB&=~(1<<0); // pb1=0
}
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
// 外部中断0处理,电机反向
{
//external interupt on INT0
if(dir_flag!=BACKWARD)
{
dir_flag=BACKWARD;
}
else if(dir_flag!=FORWARD)
{
dir_flag=FORWARD;
}
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
// 外部中断1处理:电机停止转动
{
//external interupt on INT1
dir_flag=STOP;
}
//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();
MCUCR = 0x0A;
GICR = 0xC0;
TIMSK = 0x14; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//
void main(void)
{
unsigned int data, temp;
init_devices();
ADCSR = 0x00; //disable adc
dir_flag=STOP; // 初始化,电机停转
while(1)
{
ADMUX = 0x40; //选择通道零
ADCSRA = 0xC7;
while((ADCSRA | 0x10)==0);
ADCSRA &=~0x10;
data = ADCL;
temp =ADCH<<8;
data = data +temp;
data>>=1;
// 改变输出比较寄存器OCR1A,改变占空比
OCR1AH=data>>8;
OCR1AL=data;
//清AD转换完标志
ADCSRA |= 0x40;
} // end while
} // end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -