×
单片机 > 单片机程序设计 > 详情

avr单片机 PWM调速程序及原理图

发布时间:2020-08-26 发布时间:
|

源程序:

#include

#include


#define uint unsigned int

#define uchar unsigned char

#define Left OCR1A

#define Right OCR1B

#define ADD 1.15;   //宏定义,加速系数


uchar i;

uchar flag;      //是否减速标志位

uchar TCRT5000_IN;


uint Max_Speed;

uchar Min_Speed;


/*************************************************

函数名称:Init_TCRT5000

函数功能:初始化红外传感器TCRT5000

函数说明:设置PA口为输入,监测传感器信号*********/

void Init_TCRT5000()

{

DDRA = 0X00;

PORTA = 0XFF;

}


/*************************************************

函数名称:Max()

函数功能:判断最大速度

函数说明:判断最大速度,将其值放入Max_Speed中*****/

void Max()

{

if(Left >= Right)

{

  Max_Speed = Left * ADD;

}

else

{

  Max_Speed = Right * ADD;

}

if(Max_Speed >= 0xf7)

{

  Max_Speed = 0xf7;

}

Min_Speed = 0x20 ;

}


/*************************************************

函数名称:Scan_TCRT5000

函数功能:TCRT5000进行扫描,返回跑到信息

函数说明:*********/

void Scan_TCRT5000()

{

TCRT5000_IN = PINA&0x1F;

switch(TCRT5000_IN)

{

   /*  OOOOO  *///全灭

   case 0x00:

       break;

   /*  *****  *///全亮

   case 0x1f:

       OCR1A=0x00;

       OCR1B=0x00;

           break; 

   /*  O*OOO  */

   case 0x08:

       OCR1A=Min_Speed;

           OCR1B=Max_Speed;

           break;

   /*  *OOOO  */

   case 0x10:

       OCR1A=Min_Speed;

           OCR1B=Max_Speed;

              break;

   /*  O**OO  */

   case 0x0c:

       OCR1A=Min_Speed;

           OCR1B=Max_Speed;

           break;

   /*  **OOO  */

   case 0x18:

       OCR1A=Min_Speed;

           OCR1B=Max_Speed;

           break;

    /*  ***00*/

    case 0x1c:

       OCR1A=Min_Speed;

           OCR1B=Max_Speed;

           break;

   /*  OOO*O  */

   case 0x02:

           OCR1A=Max_Speed;

           OCR1B=Min_Speed;

           break;

   /*  OOOO*  */

   case 0x01:

       OCR1A=Max_Speed;

           OCR1B=Min_Speed;

           break;

   /*  OO**O  */

   case 0x06:

       OCR1A=Max_Speed;

           OCR1B=Min_Speed;

           break;

   /*  OOO**  */

   case 0x03:

       OCR1A=Max_Speed;

           OCR1B=Min_Speed;

           break;

   /*  OO***  */

   case 0x07:

       OCR1A=Max_Speed;

           OCR1B=Min_Speed;

           break;  

   default:

       break;

  }

}


/*************************************************

函数名称:Init_Speed

函数功能:定时器1初始化,产生两路PWM信号

函数说明:通过改变全局变Left,Right控制小车速度**/

void Init_Speed()

{

DDRD |= 0X30;

TCCR1A=0xA1;

TCCR1B=0x0A;

OCR1A=0;

OCR1B=0;

}


/**********************************************

函数名称:Stop

函数功能:小车停止

函数说明:Right=0,Left=0*********************/

void Stop()

{

OCR1A=0x00;

OCR1B=0x00;

}


/**********************************************

函数名称:Init_Timer0

函数功能:初始化定时器0

函数说明:初始化定时器0

          设1024分频

                  100ms触发一次中断,速度加1**********/

void Init_Timer0()

{

TCCR0 = 0x05;

TCNT0 = 0x00;

TIMSK |= BIT(2);

SREG |= BIT(7);

}


void main()

{

uchar speed;

TCRT5000_IN = PINA&0x1F;

Init_Speed();

Init_TCRT5000();

Init_Timer0();

while(1)

{

  TCRT5000_IN = PINA&0x1F;

  while(TCRT5000_IN != 0x04)

  {

   SREG &= ~BIT(7);   //关闭中断

   Scan_TCRT5000();

   TCRT5000_IN = PINA&0x1F;

   flag = 1;

  }


  while(TCRT5000_IN == 0x04)

  {

   if(flag == 1)

   {

           Left = 0xb0;

    Right = 0xb0;

        flag =0;

        SREG |= BIT(7);   //打开中断

   } 

   TCRT5000_IN = PINA&0x1F;

  }

}

}


/*定时器0中断函数*/

#pragma interrupt_handler Timer0:10

void Timer0()

{

TCNT0 = 0x00;

i++;

if(i == 100)

{

  i=0; 

  Left++;

  if(Left >= 0xfe)

  {

   Left = 0xfe;

  }

  OCR1B++;

  if(OCR1B >= 0xfe)

  {

   OCR1B = 0xfe;

  }

  Max();

}

}



关键字:avr  单片机  PWM  调速程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计