前言

本文分享基于ra6e1实现任意信号发生的万能红外遥控。

开发环境搭建

需要先安装FSP/RASC+MDK


打开rasc

指定工程名和路径,Next

forum.jpg

指定芯片型号,工具链,Next

forum.jpg

选择开发模式,Next

forum.jpg

指定OS,Next

forum.jpg

选择led的demo,完成

forum.jpg


生成MDK工程


打开FSP_Project.uvprojx


编译下载运行

forum.jpg

可以进行仿真调试

forum.jpg


可见使用rasc可以快速搭建MDK工程,搭建开发环境。


PWM输出红外载波

forum.jpg

使用P303


配置

forum.jpg

设置P303为外设模式,对应GTIOC7B

forum.jpg

配置对应的定时器

forum.jpg

时钟PCLKD 100M

forum.jpg

添加pwm相关代码

forum.jpg

配置参数

forum.jpg

产生代码

forum.jpg


初始化

                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);


测试效果如下

forum.jpg



任意调制信号输出

使用P113输出,硬件定时器


配置P113引脚

forum.jpg

添加定时器

forum.jpg

设置属性

forum.jpg

产生代码


实现代码

ir.h


  • #ifndef IR_H
  • #define IR_H

  • #ifdef __cplusplus
  • extern "C" {
  • #endif

  • void ir_init(void);
  • void ir_send(uint8_t num);
  • uint8_t ir_isdone(void);

  • #ifdef __cplusplus
  • }
  • #endif

  • #endif
  • 复制代码

    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;
  • }
  • 复制代码






    forum.jpg


    万用遥控

    将以上载波和调制信号叠加控制红外发射光即可产生任意的红外信号,实现万能遥控器。

    forum.jpg

    图片.png


    总结

    基于ras能够快速搭建开发环境,创建工程,配置资源。基于fsp驱动,面向对象的思想能快速调用api实现对应的接口。以上基于定时器,pwm和io演示了万能红外遥控的功能。