263|0

65

帖子

1

TA的资源

一粒金砂(中级)

【Follow me第二季第3期】任务汇总提交贴重写版 [复制链接]

本帖最后由 breeze_i 于 2024-12-23 16:02 编辑

一、项目简介

        本次实验通过按键选择波形输出,并可以通过ADC模块对DAC电压输出采样,并通过串口打印结果。

    实验器材
1.EK-RA6M5开发板1块,
2.Windows电脑一台,
3.CH340串口转换工具一个
4.杜邦线若干,MicroUSB数据线两根
软件:
e2 studio
FreeMaster,
ch340驱动程序,
term串口显示工具,
Renesas Flash Programmer V3.14(烧录软件)
 

二、程序流程图

流程图.jpg

三、各任务具体实现代码

相关经验分享贴

【Follow me第二季第3期】 EK-RA6M5开发板开箱分享

【Follow me第二季第3期】 EK-RA6M5 开发前准备工作

【Follow me第二季第3期】入门任务,_quickstart工程调试

【Follow me第二季第3期】简单按键控制LED实验

【Follow me第二季第3期】基础任务:quad-spi flash和octo-spi flash读写速度测试

【Follow me第二季第3期】DAC配置生成波形及性能测试

【Follow me第二季第3期】进阶任务:示例程序中新增命令打印信息

【Follow me第二季第3期】扩展任务:简单信号发生器

这里主要介绍一下波形产生原理和按键扫描方法1、    三角波产生原理
定义一个全局变量gs_dac_value,开始时,每隔一定时间加一,然后写入到DAC,更新DAC输出,当gs_dac_value=4095时,接下来每隔一段时间减一,直到gs_dac_value==0,为一个周期。如果在10ms任务中加一,然后更新DAC输出,则,三角波的周期为10ms*4096*2=81920ms=81.92s,这个周期是比较长的,所以将DAC输出和LED连接产生的呼吸灯效果不是很明显,实际输出是没有问题的。

fsp_err_t DAC_output(void)
{
    static int16_t a = 1;
    gs_dac_value = (uint16_t) (gs_dac_value + a);
    if (gs_dac_value >= 0x0FFF)
//    if (gs_dac_value >= 0x5)
    {
        a = -1;
    }
    else if (gs_dac_value == 0)
    {
        a = 1;
    }

    fsp_err_t status = R_DAC_Write (&g_dac0_ctrl, gs_dac_value);

    return status;
}

2、    正弦波产生原理
定期调用math.h库函数sin(),根据系统运行时间来计算正弦波输出,周期T=2π,无相位偏移,然后将电压波形向上偏移1V将负电压转化为正电压,再除以2,然后乘以DAC的精度(4096-1),即可输出正弦波。

fsp_err_t DAC_output_Sinewave(void)
{
    fsp_err_t ret;
    uint64_t currenttime = gs_dwTick;
    uint64_t t_ms = (currenttime - gs_starttime);       //ms
    double t_s = (double) t_ms / 1000;       //(double)(t_ms/1000);
    DAC_value = (uint16_t) ((sin (t_s) + 1) / 2 * 4095);
    gs_dac_value = DAC_value;
    ret = R_DAC_Write (&g_dac0_ctrl, gs_dac_value);
    return ret;
}

3、    按键扫描原理
要检测按键状态,检测与按键连接的IO口的输入电压即可,但是机械按键会有抖动,电压波动容易误判,所以需要再加上消抖,硬件消抖就是利用RC电路充放电来使得电压变化平滑,消除尖刺,达到消抖目的;软件消抖则是在第一次检测到电平变化之后,等待一段时间,待电压稳定后再次读取电平,如果,检测到按键仍然在按下状态,则说明按键按下了;另一种按键扫描则是,等检测到按键松开了再生成按键按下信号,不松开就会阻塞程序运行。
 

#include "key.h"

uint8_t keyscan(bsp_io_port_pin_t Key)
{
    uint8_t ret = 0;
    bsp_io_level_t keystatus = KEY_RELEASE;
    bsp_io_level_t keystatus1 = KEY_RELEASE;
    g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystatus);
    if (keystatus == KEY_PRESS)
    {
        R_BSP_SoftwareDelay (KEY_SCAN_DELAY_MS, BSP_DELAY_UNITS_MILLISECONDS);
        ret = g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystatus1);
        if (keystatus == keystatus1)
        {
            ret = 1;
        }
        return ret;
    }
    return ret;
}

uint8_t Key_Scan(bsp_io_port_pin_t Key)
{ //阻塞式扫描按键
    uint8_t ret = 0;
    bsp_io_level_t keystate = KEY_RELEASE;
    //bsp_io_level_t keystate1=KEY_RELEASE;
    g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystate);
    if (keystate == KEY_PRESS)
    {
        do
        {
            g_ioport.p_api->pinRead (g_ioport.p_ctrl, Key, &keystate);
        }
        while (keystate == KEY_PRESS);
        ret = 1;
    }
    return ret;
}

4、    串口
本项目中通过串口打印ADC采样数据,我选用的是串口7,在MyRA6M5Project工程中添加串口模块,并重定义Printf()函数。
在项目属性中可以看到,e2studio使用的工具链是GNU,通过查阅资料,找到printf()重定向代码如下(其实只写一个_write()函数就可以实现printf()函数打印到串口了,但是会有许多warning):

PixPin_2024-12-23_14-53-04.png

 

/* 重定向 printf 输出 */
int _isatty(int fd);
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _close(int fd);
int _lseek(int fd, int ptr, int dir);
int _read(int fd, char *ptr, int len);
int _fstat(int fd, struct stat *st);

int _write(int fd, char *pBuffer, int size)
{
    (void) fd;
    R_SCI_UART_Write (&g_uart7_ctrl, (uint8_t*) pBuffer, (uint32_t) size);
    uart7_wait_for_tx ();
    return size;
}

__attribute__((weak)) int _read(int file, char *ptr, int len)
{
    (void) file;
    int DataIdx;
    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        R_SCI_UART_Read (&g_uart7_ctrl, (uint8_t*) ptr, 1); //__io_getchar();
        ptr++;
    }
    return len;
}

__attribute__((weak)) int _isatty(int fd)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
        return 1;

    errno = EBADF;
    return 0;
}

__attribute__((weak)) int _close(int fd)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
        return 0;

    errno = EBADF;
    return -1;
}

__attribute__((weak)) int _lseek(int fd, int ptr, int dir)
{
    (void) fd;
    (void) ptr;
    (void) dir;

    errno = EBADF;
    return -1;
}

__attribute__((weak)) int _fstat(int fd, struct stat *st)
{
    if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)
    {
        st->st_mode = S_IFCHR;
        return 0;
    }

    errno = EBADF;
    return 0;
}


然后在项目属性中按如下图所示勾选3个选项
 

PixPin_2024-12-23_14-14-03.png

串口重定向完成。
 

四、视频


 

五、心得体会

    EK-RA6M5这块开发板的MCU是瑞萨设计的基于M33内核的MCU,时钟最高可达200MHz,在m系列内核控制器中属于非常强大的了,而且丰富的外设资源,超多的IO引脚以及各种通信协议的支持让这块开发板可扩展性非常强!借着本次活动,我有幸体验了一下这块板子,强大的的硬件加上e2studio这款优秀的软件,让开发过程非常简单,省去了大量的写底层驱动的时间,这一点对初学者和缺乏时间的电子工程师来说非常棒。

一点小建议:希望e2studio里面可以增加Flash下载按钮(就像NXP的s32ds那样),Renesas Flash Programmer V3.14这个软件下载的速度太慢了,而且每次切换软件也不方便。还有,希望可以选择软件安装位置,C盘空间实在不够用了!
最后,祝eeworld和digikey越来越好!
 

 

 

MyRA6M5Project.zip

1.21 MB, 下载次数: 2

teraterm-5.0.exe

8.29 MB, 下载次数: 3


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

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

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