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

本教程基于韦东山百问网出的 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;elsevalue -= (float)0.5;pDevice->SetValue(pDevice, value);mdelay(300);}
}

37.6 测试结果

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


本章完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB基础-MAT文件的读写操作

简介 MAT文件是MATLAB格式的双精度二进制数据文件&#xff0c;由MATLAB软件创建&#xff0c;可以使用MATLAB软件再其他计算机上以其他浮点格式读取&#xff0c;同时也可以使用其他软件通过MATLAB的应用程序接口来进行读写操作。如果只是再MATLAB环境中处理数据&#xff0c;使用…

【深度学习】树莓派Zero w深度学习模型Python推理

在机器学习开发过程中&#xff0c;当模型训练好后&#xff0c;接下来就要进行模型推理了&#xff0c;根据部署环境可分为三类场景&#xff1a; 边缘计算&#xff1a;一般指手机&#xff0c;嵌入式设备&#xff0c;直接在数据生成的设备上进行推理&#xff0c;因为能避免将采集…

SkyWalking安装部署

一、概念 1、什么是 APM 系统&#xff1f; APM&#xff08;Application Performance Management&#xff09;即应用性能管理系统&#xff0c;是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理&#xff0c;主要指对企业的关键业务应用…

不使用辅助变量的前提下实现两个变量的交换

package operator; //不用第三个辅助变量&#xff0c;实现两个数的交换 public class Demo08 {public static void change(int a, int b){a ab;b a-b;a a-b;System.out.println(a);System.out.println(b);}public static void main(String[] args) {change(900,3000);} }后续…

UMA 2 - Unity Multipurpose Avatar☀️七.UMA API介绍 : 基本API与保存加载配置

文章目录 🟥 UMA Data DNA参数引用位置🟥 UMA API介绍🟥 UMA Data DNA参数引用位置 我们想通过代码去控制如图所示参数,达到捏脸的目的.下面就是可以控制的代码: _dna["headSize"].Set(1); _avatar.BuildCharacter();我们观察发现操控代码类似Material去设置…

三分钟学会一个新技能——使用Java操作Redis

目录 1、前置准备操作 1.1、为什么要进行前置准备操作 1.2、本地如何访问到云服务上Redis的6379端口号 1.3、配置步骤&#xff1a; 2、配置后本地主机如何操作 3、常用命令举例 3.1、通用命令举例 3.2、string相关命令举例 3.3、hash相关命令举例 3.4、list相关命令…

80. 删除有序数组中的重复项 II

Powered by:NEFU AB-IN Link 文章目录 80. 删除有序数组中的重复项 II题意思路代码 80. 删除有序数组中的重复项 II 题意 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长…

道可云元宇宙每日资讯|第二届世界元宇宙大会将在嘉定安亭举行

道可云元宇宙每日简报&#xff08;2023年9月6日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 第二届世界元宇宙大会将于9月20日在嘉定安亭举行 元起嘉定&#xff0c;虚实相生&#xff0c;产业赋能。由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办&a…

配置Vite获取内网IP(Vue3项目​ts版本获取本机局域网IP地址)

参考文章&#xff1a;vue项目获取本机局域网IP地址&#xff08;vue.config.js版本) 在Vite中&#xff0c;没有vue.config.js文件&#xff0c;而是使用vite.config.js&#xff08;或vite.config.ts&#xff0c;如果项目使用TypeScript&#xff09;来配置项目&#xff1b; 1.获…

【修复】centos定时任务python top不能输出

问题 用python监控进程占用硬件资源时&#xff0c;手动执行正常运行&#xff0c;定时任务执行出错 在centos的定时任务中&#xff0c;用python的os模块执行top命令时终端没有输出 cmd top -d 1 -n 1 -p {} | grep -E "PID|{}|%Cpu|buff/cache" .format(process_id…

JavaScript中var,let,const 的区别

JavaScript中var&#xff0c;let&#xff0c;const 的区别 一、前言二、使用var声明变量1、var 声明的变量是函数作用域2、var声明的变量会有变量提升3、全局作用域中声明的变量会被挂载到全局对象的window中4、同一作用域下&#xff0c;可以重复声明相同的变量名 三、使用let声…

Unity下如何实现RTMP或RTSP播放端录像?

好多开发者问我们&#xff0c;Unity环境下&#xff0c;除了RTSP或RTMP的播放&#xff0c;如果有录像诉求&#xff0c;怎么实现&#xff1f;实际上录像相对播放来说&#xff0c;更简单一些&#xff0c;因为不涉及到绘制&#xff0c;只要拉流下来数据&#xff0c;直接写mp4文件就…

云原生Kubernetes:pod资源管理与配置

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是kubernetes中…

【LeetCode-中等题】78. 子集

文章目录 组合并集问题汇总&#xff1a;题目方法一&#xff1a;动态规划方法二&#xff1a;递归加回溯(关键----startIndex) 组合并集问题汇总&#xff1a; 1、子集去重版本 2、组合非去重版本 3、组合去重版本 题目 注意&#xff1a;这里的nums数组里面的元素是各不相同的&a…

(文末赠书)我为什么推荐应该人手一本《人月神话》

能点进来的朋友&#xff0c;说明你肯定是计算机工作的朋友或者对这本书正在仔细琢磨着的朋友。 文章目录 1、人人都会编程的时代&#xff0c;我们如何留存?2、小故事说明项目管理着为什么必看这本书3、如何评价《人月神话&#xff1a;纪念典藏版》4、本书的目录&#xff08;好…

【操作系统】进程的通信IPC

进程通信是指进程之间的信息交换。 低级通信方式&#xff1a;PV操作 高级通信方式&#xff1a;1.共享存储2.消息传递3.管道通信 共享存储 低级数据结构共享&#xff0c;高级存储区共享。 对共享空间进行读写操作时&#xff0c;需要用到互斥工具。 消息传递 利用发送消息和…

如何选择安全稳定的大文件传输软件平台,企业传输必看

在当今的信息时代&#xff0c;大文件传输是企业间合作、项目交付、数据备份等场景中不可或缺的需求。然而&#xff0c;大文件传输也面临着诸多挑战&#xff0c;比如速度慢、不稳定、不安全等&#xff0c;给企业带来了不少困扰和风险。那么&#xff0c;如何选择一款安全稳定的大…

自然语言处理应用(一):情感分析

情感分析 随着在线社交媒体和评论平台的快速发展&#xff0c;大量评论的数据被记录下来。这些数据具有支持决策过程的巨大潜力。 情感分析&#xff08;sentiment analysis&#xff09;研究人们在文本中 &#xff08;如产品评论、博客评论和论坛讨论等&#xff09;“隐藏”的情…

echarts静态饼图

<div class"cake"><div id"cakeChart"></div></div> import * as echarts from "echarts";mounted() {this.$nextTick(() > {this.getCakeEcharts()})},methods: {// 饼状图getCakeEcharts() {let cakeChart echart…

『力扣每日一题07』字符串最后一个单词的长度

气死我啦&#xff0c;今天这道题花了快一个小时&#xff0c;我学完了答案的解法&#xff0c;放上去在线 OJ &#xff0c;一直报错&#xff0c;找来找去都找不到自己错在哪&#xff0c;明明跟答案一模一样。后来还是学了另一种解法&#xff0c;才跑出来的(̥̥̥̥̥̥̥̥o̥̥…