495005638

495005638

0个粉丝

22

问答

0

专栏

38

资料

495005638  发布于  2013-08-27 16:28:22
采纳率 0%
22个问答
3364

智能家居

 
红外遥控器原理 我这里就不多说了,如果需要了解的 请网上寻找相关资料
基于市面上的家电遥控器绝大多数是38khz的载波,所以我们这次也选择只学习和控制38khz的。
学习型的原理:采样学习遥控器波形——存储波形数据——发送相应的波形   
三步骤就完成了自学习红外转发的功能。
当然最好有淘宝网上的那种百来块的逻辑分析仪会让你的工作事半功倍。

1、采样学习遥控器波形
    接收头为了图方便 使用一体化红外接收头 主要是38k载波的  tim2 90us 采样用。
    学习键值:主要实现的原理是基于一般的红外高低电平大概是560US 所以我们用90us去采集,
    我用的最简单的方法,定时去判断io口状态,然后保存起来。
    当然也可以用pwm高低电平的输入捕获,保存每次跳变的时间,我觉得有点麻烦 以前没用过,所以就用个最简单的方法。
    程序如下:
   bTIM2Flag是90us定时器2,每次定时时间到之后 bTIM2Flag = TRUE;

void Receve_Data(u8 * data,u16 len)
  {
    u8 buf=0;
    u16 i,j;
    for(i=0;i         {  
           buf=0;     
           for(j=0;j<8;)
           {                  
              
                  if(bTIM2Flag)
                  {         
                    buf=buf<<1;
                        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)==0)
                        {
                          buf|=1;
                        }
                   j++;
                   bTIM2Flag = FALSE;
                  }

                  data = buf;
           }

     }
  }


2、存储波形数据
   通过上面的工作,每个键的学习你可以得到200~500个数据 ,为什么差别在吗大呢? 原因是这样:电视机遥控器 机顶盒 dvd等这些常用的都是单键值遥控器,比如开机关机是同一个键值。
   但是空调就是不一样了,虽然是按下同一个按键,开机和关机键不一样。 不同的温度,不同的模式,输出的都是不是一样的,也就是说 如果你想学空调的键值,空调的每个状态你都必须要学习。
   当然我觉得没必要空调的学习完所有状态,学习常用的温度常用的模式之间组合就差不多了。

   这时候你需要用另外的定时器tim3做一个38khz的载波,条件成立时候bSendFlag = TRUE 让红外发射控制管脚不停的取反。条件不成立bSendFlag = FALSE,tim3 不控制发射引脚 ,很简单吧。
   然而你应该什么时候 设置bSendFlag 的值呢? 应该是进入发送程序时候,你就判断发送数据里面,判断要发送的每个数据,比如0xff 或者0x3f,你就知道0xff 是8位都是 bSendFlag = TRUE。
   0x3f 你应该知道前后6位时候是bSendFlag = TRUE ,高2位是bSendFlag = FALSE。
   程序如下:
   void Send_Data(u8 * data,u16 len)
  {
    u8 buf;
    u16 i,j;
    for(i=0;i         {      
           buf = data;

           for(j=0;j<8;)
           {
                  if(bTIM2Flag)
                  {
                      if(buf &0x80)
                          {
                           bSendFlag = TRUE;
                          }
                          else
                          {
                           bSendFlag = FALSE;
                          }
                   j++;
                   buf=buf<<1;
                   bTIM2Flag = FALSE;
                  }
           }
     }

           bTIM2Flag = FALSE;
           while(!bTIM2Flag);
           bSendFlag = FALSE;
  }

通过这样就可以完成学习和发送的功能了。 很简单但是比较实用。
附件:112421jjpjttt6umj20t2z.pdf
易百纳技术社区文件: 112421jjpjttt6umj20t2z.pdf
下载
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区