56|0

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第3期】信号生成器 [复制链接]

  本帖最后由 zsy-s 于 2024-12-8 21:08 编辑

背景

    用于产生一些常见的波形,通过按钮切换信号的波形。

设计框架

内部实现了三种波形。通过按钮1 实现波形的切换,同时三种波形刚好对应三个led ,会亮起相应的led,提醒当时的波形。

    

代码

写代码得到一个周期的值

    int inx = 0;
    while(inx <= 4096){
        APP_PRINT("%d ",(int)(4096*sin(PI*inx/2048)));
        inx++;
        if(!(inx%500)){
            APP_PRINT("\r\n inx [%d] \r\n ",inx);
            R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
        }
    }

展示图形如下

 

开启中断,由于尽可以使用一个led,开启一个中断服务函数就够用了。

相关的配置前文写过,开启代码如下

    leds = g_bsp_leds;
开启中断
    err = R_ICU_ExternalIrqOpen(&g_external_irq1_ctrl, &g_external_irq1_cfg);
    err = R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);
使能中断
    err = R_ICU_ExternalIrqEnable(&g_external_irq1_ctrl);
    err = R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);

三种波形,三角波,sin波,方波,实现函数如下

uint16_t ledstats = 0;
uint16_t vval = 0;
int vdrec = 0;
static void sinbo()
{

    if(4096 <= vval){
        vval = 0;
    }else{
        vval++;
    }

    APP_PRINT("DAC_SetVoltage  [%d]  [%d]\r\n",vval,sinval[vval]);
  //  DAC_SetVoltage((float)vval);
    R_DAC_Write(&g_dac_ctrl, sinval[vval]);
}

static void sanjiaobo()
{

    if(4096 < vval){
        vdrec = 0;
    }

    if(!vval){
        vdrec = 1;
    }
    if(vdrec){
        vval++;
    }
    if(!vdrec){
        vval--;
    }


    APP_PRINT("DAC_SetVoltage  [%d]  [%d]\r\n",vval,sinval[vval]);
  //  DAC_SetVoltage((float)vval);
    R_DAC_Write(&g_dac_ctrl, vval);
}
static void fangbo()
{
    if(4096 < vval){
        vval = 0;
    }else{
        vval++;
    }
    if(vval <2048){
        R_DAC_Write(&g_dac_ctrl, 0);
    }else{
        R_DAC_Write(&g_dac_ctrl, 4095);
    }

}

时间中断函数里,实现切换波形

void gpt_test_isr(timer_callback_args_t *p_args)
{
    (void)p_args;
    //APP_PRINT("\r\n ** Agpt_test_isr ** \r\n");
    if(ledstats & 0x1){
        sanjiaobo();
    }else if(ledstats & 0x2){
        fangbo();
    }else{
        sinbo();
    }
}

按钮中断函数实现led的点亮

void irq_btn_callback0(external_irq_callback_args_t *p_args)
{
    (void)p_args;
    APP_PRINT("** this is btn0 ** \r\n");

    if(!(ledstats & 7)){
        ledstats = 1;
    }else{
        ledstats <<= 1;
    }
    APP_PRINT("** this is btn0 [%x]** \r\n",ledstats);
    R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[1], !!(ledstats & 2));
    R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[0], !!(ledstats & 1));
    R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)leds.p_leds[2], !!(ledstats & 4));
}

效果

normal video

代码

dac.zip (1.68 MB, 下载次数: 0)

结论

从开始时候第一次用e2工具的新奇,到现在初步能够笨手笨脚的配置stack和参数,是一个巨大的进步。少了畏惧心理,配置一下参数,就能直接应用开发,基本不用看手册,看看接口说明,就能上手开发。越来越像纯应用开发了。

感谢eeworld和得捷联手举办的活动,使许许多多的开发者,能够低成本且动力十足的学习到一些东西,飞快的成长,拿玩游戏的时间用来学习,成就很足。希望活动越来越多,得多多参加。

点赞 关注(1)
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表