找回密码
 注册
查看: 379|回复: 2
打印 上一主题 下一主题

PWM调速源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-27 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
  • #include<iom16v.h>
  • #include<macros.h>
  • #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=0xa0;
  • OCR1B=0xa0;
  • }
  • /**********************************************
  • 函数名称: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();
  • }
  • }
      d7 D  z# L) a" C% F) [/ W+ I9 W+ }' k

8 n& J( C0 C8 c# Q* r( D

该用户从未签到

2#
发表于 2021-9-27 14:32 | 只看该作者
100ms延时会有问题吗

该用户从未签到

3#
发表于 2021-9-27 19:30 | 只看该作者
代码思路很清晰  学习了8 j/ B1 ~- s  [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-24 05:04 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表