walnutcy

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

0
阅读(2072)


比较时钟一般用来作一个固定的定时器,做系统时钟或固定的时钟任务,
但这里要讲的是:
用比较时钟的动态特性,产一个不定时的时钟,进而生成我想要的波形-----红外遥控器波形
各位兄弟如果觉得不错,就顶一下,转载请注明出处。
开发环境: 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口为输出状态;
启动时钟;
Baidu
map