快捷搜索:  汽车  科技

hs0038接收头工作原理(HS0038红外线接收器的编程)

hs0038接收头工作原理(HS0038红外线接收器的编程)objs = sensors/irda/irda_raw.o编译执行irda_rae_test(); 修改Makefile 增加irda_raw.c irda_raw.h获取电平极性方式,当前引脚极性电平取反#include "../../s3c2440_soc.h" #include "irda_raw.h" /* IRDA引脚 : EINT1/GPF1 */ static unsigned long long g_last_time = 0; /* * 配置GPIO 注册中断 * 在中断处理函数里: 记录中断发生的时间 跟上次中断的时间比较 计算出脉冲宽度 读取引脚极性 把数据放入环型缓冲区 */ /* 先实现GPIO的基本操作 */ static void irda_data_c

hs0038接收头工作原理(HS0038红外线接收器的编程)(1)

来源:百问网_嵌入式Linux wiki_jz2440 新1期视频维基教程 (视频文字版)

作者:韦东山

本文字数:1687,阅读时长:2分钟

先打印出原始数据

irda_raw.c irda_raw.h

获取电平极性方式,当前引脚极性电平取反

#include "../../s3c2440_soc.h" #include "irda_raw.h" /* IRDA引脚 : EINT1/GPF1 */ static unsigned long long g_last_time = 0; /* * 配置GPIO 注册中断 * 在中断处理函数里: 记录中断发生的时间 跟上次中断的时间比较 计算出脉冲宽度 读取引脚极性 把数据放入环型缓冲区 */ /* 先实现GPIO的基本操作 */ static void irda_data_cfg_as_eint(void) { /* 配置为中断引脚 */ GPFCON &= ~(3<<2); GPFCON |= (2<<2); /* 设置中断触发方式: 双边沿触发 */ EXTINT0 |= (7<<4); /* eint1 */ } static int irda_data_get(void) { /*如果bit1 等于1就表明高电平,返回1 */ if (GPFDAT & (1<<1)) return 1; else return 0; } /*irda中断处理函数*/ void irda_irq(int irq) { /* 在中断处理函数里: 记录中断发生的时间 跟上次中断的时间比较 计算出脉冲宽度 读取引脚极性 把数据放入环型缓冲区 */ irda_raw_event event; /*获得当前时间并赋值给cur*/ unsigned long long cur = get_system_time_us(); /*上次时间和这次时间的差值,也就是周期*/ event.duration = delta_time_us(g_last_time cur); /*获取引脚极性*/ event.pol = !irda_data_get(); /*我们需要环形缓冲区的函数放入环形缓冲区 */ ir_event_put(&event); /*更新时间*/ g_last_time = cur; } /* 注册中断 仿照之前的按键中断程序 */ void irda_init(void) { /*1. 配置为中断引脚 * 2. 配置为双边沿触发 */ irda_data_cfg_as_eint(); /*注册中断*/ register_irq(1 irda_irq); } /*测试原始数据*/ void irda_raw_test(void) { irda_raw_event event; unsigned long long pre = 0 cur; irda_init(); while (1) { /*如果从唤醒缓冲区读到数据,就把它打印出来*/ if (0 == ir_event_get(&event)) { cur = get_system_time_us(); /*如果这次时间和上次时间相差远的话,就打印回车换行*/ if (delta_time_us(pre cur) > 1000000) printf("\n\r"); pre = cur; /*使用三目运算符来判断pol是高电平还是低电平*/ printf("%s %d us | " event.pol? "hight" : "low" event.duration); } } }

irda_raw.h定义极性和脉冲宽度结构体

#ifndef _IRDA_RAW_H #define _IRDA_RAW_H typedef struct irda_raw_event { int pol; /* 极性 */ int duration; /* 脉冲宽度 us */ }irda_raw_event *p_irda_raw_event; #endif /* _IRDA_RAW_H */

测试代码 修改main.c 在main主函数中增加

irda_rae_test();

修改Makefile 增加

objs = sensors/irda/irda_raw.o

编译执行

hs0038接收头工作原理(HS0038红外线接收器的编程)(2)

一开始时间很长是因为一上电的时候高电平,值打印的特别大,说明有问题

irda中断函数中没有更新上一次的时间

/*更新时间*/ g_last_time = cur;

再次更新

hs0038接收头工作原理(HS0038红外线接收器的编程)(3)

时间和数据格式符合时序要求

「新品首发」STM32MP157开发板火爆预售!首批仅300套

猜您喜欢: