第37章_瑞萨MCU零基础入门系列教程之DAC数模转换模块

2023-10-29

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949

配套资料获取:https://renesas-docs.100ask.net

瑞萨MCU零基础入门系列教程汇总https://blog.csdn.net/qq_35181236/article/details/132779862


第37章 DAC数模转换模块

37.1 SPI-DAC模块工作原理

本次实验使用的SPI-DAC模块是定制模块,原理图如下图所示:

核心芯片是TLC5615,主机通过SPI接口发出一个数字量,TCL5615将数字量转化为模拟量,并通过OUT引脚输出模拟电压来点亮LED。通过LED的亮度形象地感受DAC的效果。这个模块的参考电压是2.048V,可以输出的最大电压是2倍参考电压,即4.096V。

TLC5615是一个10bit的DAC转换芯片,用户需要将需要转换的数字量左移2bit后再通过SPI发送给TLC5165,数据格式和转换关系如下图所示:

由于TLC5615是10位DAC,它允许主控每次发送12位或者16位的数据,12位和16位的发送数据格式要求如下图所示。

这个模块的使用比较简单,重点是在SPI的通信上,其次是在发送数据的时候需要移位。

37.2 模块配置

本次实验使用的是开发板配套扩展板的SPI组,如下图所示:

使用的SPI引脚是P202/P203/P204和P205,SPI引脚对应使用的是RA6M5的Common SPI0:

本次实验使用的SPI-DAC模块控制比较简单,对于SPI的Stack配置使用默认参数即可,使能发送buffer空中断,配置中断对调函数,如下图所示:

37.3 外设驱动

37.3.1 GPIO驱动

本次实验的SPI片选信号脚为P205,它的驱动如下:

static struct IODev gSPIDACCSDev = {
    .name = "SPIDAC CS",
    .port = BSP_IO_PORT_02_PIN_05,
    .Init = IODrvInit,
    .Read = IODrvRead,
    .Write = IODrvWrite,
    .next = NULL
};

void IODevicesCreate(void)
{
    IODeviceInsert(&gSPIDACCSDev);
}

对于GPIO的驱动函数参考《32.4.1 GPIO驱动》。

37.3.2 SPI驱动

参考《35.4.2 SPI驱动》。

37.4 DAC驱动程序

37.4.1 SPI-DAC设备对象封装

要操纵SPI-DAC模块,只需要初始化、写入数值。为了更具观赏性,还可以提供写入多个数值的操作。把这些特性封装为一个结构体,代码如下(dev_spi_dac.h):

typedef struct SPIDACDev{
    char *name;
    int (*Init)(struct SPIDACDev *ptdev);
    int (*SetValue)(struct SPIDACDev *ptdev, float voltage);
    int (*Write)(struct SPIDACDev *ptdev, unsigned char *buf, unsigned int length);
}SPIDACDevice;

然后在dev_spi_dac.c里构造一个SPIDACDevice结构体,并给上层代码提高获得这个结构体的函数,代码如下:

static SPIDACDevice gDAC = {
    .name = "SPI DAC",
    .Init       = SPIDACDevInit,
    .SetValue   = SPIDACDevSetValue,
    .Write      = SPIDACDevWrite,
};

struct SPIDACDev *SPIDACGetDevice(void)
{
    return &gDAC;
}

37.4.2 初始化SPI-DAC

初始化SPI-DAC模块,本质就是初始化SPI控制器,代码如下:

static int SPIDACDevInit (struct SPIDACDev *ptdev)
{
    if(NULL == ptdev)   return -EINVAL;
    gSPI = SPIDeviceFind("SPIDAC SPI");
    if(NULL == gSPI)    return -ENODEV;
    if(ESUCCESS != gSPI->Init(gSPI))    return -EIO;
    return ESUCCESS;
}

37.4.3 输出一个模拟量

要输出指定数字量,需要根据TLC5615的数据格式进行移位计算,再通过SPI发送给TLC5615:

static int SPIDACDevSetValue (struct SPIDACDev *ptdev, float voltage)
{
    if(NULL == ptdev)   return -EINVAL;
    if(NULL == gSPI)    return -EINVAL;
    if(DAC_OUT_MAX_VOLTAGE < voltage)     return -EINVAL;

    unsigned short value = (unsigned short)((voltage*1024)/(DAC_OUT_MAX_VOLTAGE));
    value = (unsigned short)(value<<2);
    return gSPI->Write(gSPI, (unsigned char*)&value, 2);
}

37.4.4 输出N个模拟量

为了方便用户使用,将N个数字量在模块驱动函数内部进行格式转换,然后再通过SPI传输给转换芯片:

static int SPIDACDevWrite(struct SPIDACDev *ptdev, unsigned char *buf, unsigned int length)
{
    if(NULL == ptdev)   return -EINVAL;
    if(NULL == gSPI)    return -EINVAL;
    if(NULL == buf)     return -EINVAL;
    if(0 == length)     return -EINVAL;
    
    unsigned short *pbuf = (unsigned short*)buf;
    for(unsigned int i=0; i<length; i+=2)
    {
        pbuf[i] = (unsigned short)(pbuf[i]<<2);
    }
    
    return gSPI->Write(gSPI, buf, length);
}

37.5 测试程序

本次实验使用SPI传输,连续发送0~4V的电压给DAC模块,以实现呼吸灯效果:

void DeviceTest(void)
{
    UartDevicesRegister();
    TimerDevicesRegister();
    SPIDevicesRegister();
    IODevicesRegister();
    
    SPIDACDevice *pDevice = SPIDACGetDevice();
    if(NULL == pDevice)
    {
        xprintf("Failed to Find SPI DAC Devide!\r\n");
        return;
    }
    pDevice->Init(pDevice);
    
    bool dir = false;
    volatile float value = 0;
    while(1)
    {
        if(value > 4)
            dir = true;
        else if(value < 0)
            dir = false;
        
        if(dir)
            value += (float)0.5;
        else
            value -= (float)0.5;
        pDevice->SetValue(pDevice, value);
        mdelay(300);
    }
}

37.6 测试结果

将SPI-DAC模块插入到扩展板上后,再将程序烧写到开发板上运行,用户可以看到SPI-DAC模块上的LED呈现呼吸灯效果。


本章完
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第37章_瑞萨MCU零基础入门系列教程之DAC数模转换模块 的相关文章

  • ISCC——美人计

    拿到题目下载文件 得到一张照片 还有一张二维码扫码结果 U2FsdGVkX1 Ka sScszwQkwhO VLiJwV 6IFg5W TfNHGxG2qZsIr2iwMwb9X9Iu3GuGWmPOtO27z8vNppD2D50fwsD
  • PowerDNS篇1-简介和安装

    本文主要介绍PowerDNS的主要特性和初始化安装的配置方法 侧重点是对复杂程度相对较高PowerDNS Authoritative Server进行介绍 同时会夹杂部分PowerDNS Recursor的初始化安装和配置 1 PowerD
  • 【AI编程工具合集】42 款 AI 代码助手工具大盘点!开发效率神器!

    0 未来百科 未来百科 https nav 6aiq com 是一个知名的AI产品导航网站 为发现全球优质AI工具而生 目前已 聚集全球3000 优质AI工具产品 旨在帮助用户发现全球最好的AI工具 同时为研发AI垂直应用的创业公司提供展示

随机推荐

  • Python字典加减操作

    最近工作中遇见了这个基础问题 分享一下 以下是Python中的两个Dict x a 1 b 2 c 3 y a 3 b 1 d 5 我们需要用到class collections Counter iterable or mapping 相加
  • 数学建模_饮食计划

    摘要 民以食为天 合理的饮食是身体健康的基础 科学的控制摄入食物的比例可以健康的减肥 实际的饮食计划中既要考虑较低的热量摄入 还要考虑较高的满足感和饱腹感 并且营养要均衡 本文采用多目标加权 分优先级的方法将多目标优化问题转化为多个线性规划
  • rsync使用时的常见问题

    rsync使用时的常见问题 错误1 rsync read error Connection reset by peer 104 rsync error error in rsync protocol data stream code 12
  • 常用社交网络(SNS、人人网、新浪微博)动态新闻(feed、新鲜事、好友动态)系统浅析

    最近见几个朋友都在说人人网新鲜事排序的问题 恰巧对这方面也较感兴趣 于是打算顺便把手头收集到的资料梳理学习一下 由于本人也只是新手 很多内容仅仅是参阅资料后的个人猜测与纸上谈兵故难免存有错误与纰漏 感谢大家指正 一 什么是feed Feed
  • HMI全液晶仪表方案-使用QNX和Kanzi的UI解决方案

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 e mail 174176320 qq com 黑莓有限公司子公司及全球车载电子软件平台领导厂商QNX软件系统有限公司与汽车用户界面设计工
  • three.js学习(第二天)之阻尼+自适应+js全屏

    添加阻尼效果 加载轨道控制器 import OrbitControls from three addons controls OrbitControls js 创建轨道控制器 const controls new OrbitControls
  • 常用的API接口对接方式和注意事项

    常用的API对接方式和注意事项 随着互联网的发展 API 应用程序接口 已经成为了不可或缺的一部分 API允许不同的软件系统进行通信和数据交互 为开发者提供了一种简单 灵活和高效的方式来集成不同的软件系统 在进行API对接时 有一些常用的方
  • 禅道后台命令执行漏洞 (二)

    漏洞简介 禅道是第一款国产的开源项目管理软件 它集产品管理 项目管理 质量管理 文档管理 组织管理和事务管理于一体 是一款专业的研发项目管理软件 完整地覆盖了项目管理的核心流程 禅道管理思想注重实效 功能完备丰富 操作简洁高效 界面美观大方
  • 防火墙的相关信息

    什么是防火墙 防御对象 授权用户 非授权用户 它是一种位于内部网络与外部外部网络之间的安全系统 是一种隔离 非授权用户在区域间 并过滤 对受保护网络有害流量或数据包 的设备 防火墙具有路由交换的功能 既可以做路由器也可以做交换机 防火墙的分
  • 狂神Elasticsearch笔记

    ElasticSearch笔记 我们要讲解什么 SQL like 狂神说 如果是的大数据 就十分慢 索引 ElasticSearch 搜索 百度 github 淘宝电商 1 聊一个人 2 货比三家 3 安装 4 生态圈 5 分词器ik 6
  • 如何不通过iconfont项目向已有字体图标中添加新的字体图标

    前言 今天接到一个需求 要往项目中添加一个字体图标 按照以往的惯例 就是在iconfont网站的我的项目添加需要的字体图标就行了 但这个需求是个临时需求 不想用这种方式 于是 就想直接在现有的字体图标中添加 解决方案 第一步 在iconfo
  • uGUI元素显示在角色的头顶上

    孙广东 2015 5 26 转载请注明出处 http blog csdn net u010019717 我们 游戏完全使用UGUI来工作 所以游戏中的很多元素都是UGUI的 Game Canvas画布设置为 World Space 主要也是
  • Unity3D游戏开发之设置动画(Animations)属性

    通过创建角色动画Avatar 在新的动画系统Mecanim中 Unity就设置了角色动画的骨架和蒙皮信息 从而就可以在Unity中实现角色动画了 切换到动画 Animations 选项卡 选中导入动画 Import Animation 的选
  • 人工神经网络的设计与实现(二) 感知机

    感知机 感知机 perceptron 是ANN的基本单元 至少我现在是这么觉得的 如果我学到后来发现不是 会来更正的 感知机 如下图 就是伸出几只小触手去感知这个世界 感知 感知 然后触手获取数据的加权和通过函数 f 得到的值即为该感知机的
  • 【热门框架】Mybatis-Plus标准CRUD操作

    MyBatis Plus提供了一系列标准的CRUD操作 包括insert delete update和select 下面是这些操作的指引 插入数据 1 使用实体类进行插入 User user new User user setName To
  • Idea license server地址

    以下都可以试试 http idea iteblog com key phphttp intellij mandroid cn http idea imsxm com https jetlicense nss im
  • 系统扩容心得

    author skatetime 2010 11 10 系统扩容心得 由于业务的快速发展 系统需要扩容 我们这次系统扩容动作比较小 相对不是很复杂 但过程是曲折的 结果是完美的 从开始准备到完成实施期间的每一个小细节都需要我们倍加注意 因为
  • vue-cli配置文件的查看和修改

    针对vue cli gt 3的版本 介绍两种修改方式 1 vue ui 在终端执行 vue ui 会打开页面 可以导入要管理的项目 会打开页面如下 2 在根目录下新建vue config js文件 添加要修改的配置
  • SSH整合中文

    在struts2里面配置一个常量
  • 第37章_瑞萨MCU零基础入门系列教程之DAC数模转换模块

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do