原创 比较时钟的另类应用---模拟发送红外遥控的波形

2008-7-28 17:00 5442 8 8 分类: MCU/ 嵌入式
比较时钟一般用来作一个固定的定时器,做系统时钟或固定的时钟任务,
但这里要讲的是:
用比较时钟的动态特性,产一个不定时的时钟,进而生成我想要的波形-----红外遥控器波形
各位兄弟如果觉得不错,就顶一下,转载请注明出处。
开发环境:  ST7VD  芯片ST72F321

主要的思想是:
通过动态地设置中断产生的时间,来处理任务,绘出相应的波形,
未发送时,关闭时钟以减少CPU利用率,发送时设置参数,然后启动时钟

相对于一般以最小基数为单位进行计算输出脉冲波形的比较,大大地减少了任务量

首先要定义红外遥控的波形时间:
//PROCESSOR_CYCLE与你的时钟与分频数有关
#define IR_NUMX_LOW   (U16)(560 * PROCESSOR_CYCLE)
#define IR_NUM0_HIGH  (U16)(565 * PROCESSOR_CYCLE)
#define IR_NUM1_HIGH  (U16)(1690* PROCESSOR_CYCLE)
#define IR_HEAD_HIGH  (U16)(4500* PROCESSOR_CYCLE)
#define IR_HEAD_LOW   (U16)(9000* PROCESSOR_CYCLE)

#define WaveIrSetTimer() {TBOC2HR=WaveIr.time>>8;TBOC2LR=gWaveIr.time&0xff;}
#define WaveIrDisTimer() {TBOC2LR=0;TBOC2HR=0;}

ST72F321有TimerA,TimerB,每个Timer又有两个比较时钟,这里我占用TimerB的CMP2,
中断任务的代码为:
    if (IntTimerBCmp2FlgChk())//检测中断标志
    {
        WaveIrSend();   // IR波形发送任务
    }

IR波形发送任务处理:
void WaveIrSend(void)
{
    if (0==gWaveIr.state)
    {   WaveIrDisTimer();
        return;
    }
    Pin_IRWave = gWaveIr.io; //设置IO高低
    if (0==gWaveIr.trail)
    {   WaveIrDisTimer(); //发送完毕后关闭时钟,以减少CPU占用率
        PinWaveIRIn();
        gWaveIr.state = 0; // 设置发送完成标志
        return;
    }
    gWaveIr.io = ~gWaveIr.io; //IO状态变换
    WaveIrSetTimer(); //使能时钟
    if (gWaveIr.head)  // 发遥控器头
    {
        gWaveIr.head = 0;
        gWaveIr.time += IR_NUMX_LOW;
        gWaveIr.high = 0;
        gWaveIr.next = 0;
    }
    else
    {
        if (gWaveIr.len<5)
        {
            if (gWaveIr.high)
            {   gWaveIr.time += IR_NUMX_LOW; // 发送低脉冲
                if (4==gWaveIr.len)
                {   gWaveIr.len++;return;
                }
                if (0x80==gWaveIr.byte)
                {   gWaveIr.byte = 0x01;
                    gDvdIr.len++;
                }
                else
                {   gWaveIr.byte <<=1;   //移位
                }
            }
            else
            {   //判断下一个发要送的是0,还是1,以取得高脉冲的时间参数
                if (gWaveIr.next)
                {   gWaveIr.time += IR_NUM1_HIGH; 
                }
                else
                {   gWaveIr.time += IR_NUM0_HIGH;
                }
            }
            gWaveIr.high = ~gWaveIr.high;
        }
        else // 发送红外波形的结束
        {
            gWaveIr.time += IR_NUMX_LOW;
            gWaveIr.trail = 0;
        }
    }   
}

外部调用的接口函数: void WaveIrSet (U8 irCmd);
//其主要完成的任务是:设置要发送的四个字节的值,
                    为发送任务设置好相应的参数;
                    设置IO口为输出状态;
                    启动时钟;


文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条