前言
本文分享基于ra6e1实现任意信号发生的万能红外遥控。
开发环境搭建
需要先安装FSP/RASC+MDK
打开rasc
指定工程名和路径,Next
指定芯片型号,工具链,Next
选择开发模式,Next
指定OS,Next
选择led的demo,完成
生成MDK工程
打开FSP_Project.uvprojx
编译下载运行
可以进行仿真调试
可见使用rasc可以快速搭建MDK工程,搭建开发环境。
PWM输出红外载波
使用P303
配置
设置P303为外设模式,对应GTIOC7B
配置对应的定时器
时钟PCLKD 100M
添加pwm相关代码
配置参数
产生代码
初始化
fsp_err_t err = FSP_SUCCESS;
err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
assert(FSP_SUCCESS == err);
err = R_GPT_Start(&g_timer0_ctrl);
测试效果如下
任意调制信号输出
使用P113输出,硬件定时器
配置P113引脚
添加定时器
设置属性
产生代码
实现代码
ir.h
ir.c
#include <stdint.h>
#include "hal_data.h"
static void ir_handle(void);
void timer6_callback(timer_callback_args_t * p_args)
{
switch(p_args->event)
{
case TIMER_EVENT_CYCLE_END:
ir_handle();
break;
default:
break;
}
}
#define ir_outl() do{R_BSP_PinAccessEnable();R_BSP_PinWrite(BSP_IO_PORT_01_PIN_13, BSP_IO_LEVEL_LOW);R_BSP_PinAccessDisable();}while(0)
#define ir_outh() do{R_BSP_PinAccessEnable();R_BSP_PinWrite(BSP_IO_PORT_01_PIN_13, BSP_IO_LEVEL_HIGH);R_BSP_PinAccessDisable();}while(0)
static void ir_handle(void);
void time_init(uint32_t period)
{
R_GPT_Stop(&g_timer1_ctrl);
R_GPT_PeriodSet (&g_timer1_ctrl, period*47);
/* 启动 GPT 定时器 */
R_GPT_Start(&g_timer1_ctrl);
}
void time_stop()
{
R_GPT_Stop(&g_timer1_ctrl);
}
timer_info_t info; //用于获取定时器参数信息
uint32_t period; //输入捕获计数器的计数周期
void ir_init(void)
{
R_GPT_Open(&g_timer1_ctrl, &g_timer1_cfg);
R_GPT_Enable(&g_timer1_ctrl);
}
typedef struct iostate
{
uint8_t level;
uint32_t holdtime;
}iostate_t;
iostate_t s_iostate[2][40]=
{
{
{0,3000}, /* 0 - 3mS 1000 25uS*/
{1,3000}, /* 1 - 3ms */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2,5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2.5mS */
{0,500}, /* 0- 500uS */
{1,4000}, /* 1 -4mS */
{0,500}, /* 0- 500uS */
{1,60000}, /* 1 -1000mS */
{0Xff,0}
},
{
{0,3000}, /* 0 - 3mS 1000 25uS*/
{1,3000}, /* 1 - 3ms */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2,5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2.5mS */
{0,500}, /* 0- 500uS */
{1,1500}, /* 1 -1.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2.5mS */
{0,500}, /* 0- 500uS */
{1,2500}, /* 1 -2.5mS */
{0,500}, /* 0- 500uS */
{1,4000}, /* 1 -4mS */
{0,500}, /* 0- 500uS */
{1,22500}, /* 1 -22.5mS */
{0Xff,0}
}
};
static uint32_t s_ir_index = 0;
static uint8_t s_ir_done = 1;
static uint32_t s_ir_num = 0;
static void ir_handle(void)
{
if(s_ir_index < sizeof(s_iostate[0])/sizeof(s_iostate[0][0]))
{
if(s_iostate[s_ir_num][s_ir_index].level != 0xFF)
{
if(s_iostate[s_ir_num][s_ir_index].level == 0)
{
ir_outl();
}
else
{
ir_outh();
}
time_init(s_iostate[s_ir_num][s_ir_index].holdtime);
}
else
{
time_stop();
s_ir_done = 1;
}
}
else
{
s_ir_done = 1;
time_stop();
}
s_ir_index++;
}
void ir_send(uint8_t num)
{
s_ir_index = 0;
s_ir_done = 0;
s_ir_num = num;
if(s_iostate[s_ir_num][s_ir_index].level == 0)
{
ir_outl();
}
else
{
ir_outh();
}
time_init(s_iostate[s_ir_num][s_ir_index].holdtime);
s_ir_index++;
}
uint8_t ir_isdone(void)
{
return s_ir_done;
}
复制代码
万用遥控
将以上载波和调制信号叠加控制红外发射光即可产生任意的红外信号,实现万能遥控器。
总结
基于ras能够快速搭建开发环境,创建工程,配置资源。基于fsp驱动,面向对象的思想能快速调用api实现对应的接口。以上基于定时器,pwm和io演示了万能红外遥控的功能。