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

📄 dc-motor.c

📁 直流电机驱动
💻 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 + -