【嵌入式】HC32F07X DAC模拟输出 + DMA传输

news2024/11/18 7:38:40

一 背景说明

        使用小华(华大)的MCU HC32F07X实现两个通道的 0-5V 电压模拟输出。

二 原理分析

【1】DAC原理说明

        所谓DAC,就是Digital-Analog-Converter,数字模拟转换器。在模拟电路中,电流电压变化是连续的,而数字电路处理的数据都是离散的数据,输出高电平或者低电平,比如5V单片机,引脚输出的电压要么5V要么0V。DAC做的就是输出一个“任意“的电压,当然这个”任意“是有限制的。

【2】HC32F07X的DAC外设

        HC32F07X 集成了两个 DAC 转换器,各具有一个输出通道: DAC0_OUT 和 DAC1_OUT。

DAC 主要特性如下:
■ 一个数据保持寄存器
■ 12 位模式下数据采用左对齐或右对齐
■ 同步更新功能
■ 生成噪声波
■ 生成三角波
■ 双 DAC 通道,支持单独或同时转换
■ DMA 功能(包括下溢检测)
■ 通过外部触发信号进行转换
■ 4 种参考源: AVCC 电压、 ExRef 引脚、内置 1.5v 参考电压、内置 2.5v 参考电压;

        DAC框图如下:

        更多详细的内容可以参考HC32F07X芯片的DATASHEET。

三 模拟电压输出

        选用引脚 PA04(DAC0)、PA05(DAC1)进行两路电压模拟输出,参考电压为AVCC(5V),并使用DMA传输数据

【1】系统时钟初始化

static void App_SysClkInit(void)
{
    stc_sysctrl_clk_cfg_t stcCfg;
    stc_sysctrl_pll_cfg_t stcPLLCfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);    ///< 使能FLASH模块的外设时钟
    Flash_WaitCycle(FlashWaitCycle1);
    Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);             ///< PLL使用RCH作为时钟源,因此需要先设置RCH

    stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     ///< RCH 4MHz
    stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  ///< PLL 输出48MHz
    stcPLLCfg.enPllClkSrc = SysctrlPllRch;              ///< 输入时钟源选择RCH
    stcPLLCfg.enPllMul    = SysctrlPllMul12;            ///< 4MHz x 12 = 48MHz
    Sysctrl_SetPLLFreq(&stcPLLCfg);

    ///< 选择PLL作为HCLK时钟源;
    stcCfg.enClkSrc  = SysctrlClkPLL;
    ///< HCLK SYSCLK/2
    stcCfg.enHClkDiv = SysctrlHclkDiv1;
    ///< PCLK 为HCLK/8
    stcCfg.enPClkDiv = SysctrlPclkDiv1;
    ///< 系统时钟初始化
    Sysctrl_ClkInit(&stcCfg);
}

【2】DAC初始化GPIO

//模拟量输出引脚定义
#define OUT_DAC0_PORT       (GpioPortA)
#define OUT_DAC0_PIN        (GpioPin4)
#define OUT_DAC1_PORT       (GpioPortA)
#define OUT_DAC1_PIN        (GpioPin5)

/**************************************************************************
* 函数名称: DAC_Init
* 功能描述: DAC初始化GPIO
**************************************************************************/
void DAC_Init(void)
{
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);     //使能GPIO模块的外设时钟
    Gpio_SetAnalogMode(OUT_DAC0_PORT, OUT_DAC0_PIN);            //PA04作为DAC0的模拟输出
    Gpio_SetAnalogMode(OUT_DAC1_PORT, OUT_DAC1_PIN);            //PA05作为DAC1的模拟输出
}

【3】DAC初始化配置

/**************************************************************************
* 函数名称: DAC_Cfg
* 功能描述: DAC初始化配置
**************************************************************************/
void DAC_Cfg(void)
{
    stc_dac_cfg_t  dac_initstruct;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralDac, TRUE);     ///< 使能DAC模块的时钟

    dac_initstruct.boff_t = DacBoffDisable;     //禁止缓冲器
    dac_initstruct.ten_t  = DacTenEnable;       //使能通道触发
    dac_initstruct.sref_t = DacVoltageAvcc;     //参考电压选择AVCC电压
    dac_initstruct.mamp_t = DacMenp4095;        //振幅选择
    dac_initstruct.tsel_t = DacSwTriger;        //软件触发方式
    dac_initstruct.align  = DacRightAlign;      //右对齐
    Dac0_Init(&dac_initstruct);     //DAC0初始化
    Dac1_Init(&dac_initstruct);     //DAC1初始化
    
    Dac0_Cmd(TRUE);
    Dac0_DmaCmd(TRUE);
    Dac1_Cmd(TRUE);
    Dac1_DmaCmd(TRUE);
}

【4】DAC直接存储器存取配置

uint16_t out_buff[2];

/**************************************************************************
* 函数名称: DAC_DmaCfg
* 功能描述: DAC直接存储器存取配置
* 其他说明: 两个DAC需用两个DMA通道
**************************************************************************/
void DAC_DmaCfg(void)
{
    stc_dma_cfg_t DmaInitStruct;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralDma, TRUE);          ///< 使能DMA模块的外设时钟

    DmaInitStruct.enMode =  DmaMskBlock;                            ///< 选择块传输
    DmaInitStruct.u16BlockSize = 1;                                 ///< 块传输个数
    DmaInitStruct.u16TransferCnt = 1;                               ///< 块传输次数,一次传输数据大小为 块传输个数*BUFFER_SIZE
    DmaInitStruct.enTransferWidth = DmaMsk16Bit;                    ///< 传输数据的宽度,此处选择字(16Bit)宽度
    DmaInitStruct.enSrcAddrMode = DmaMskSrcAddrInc;                 ///< 源地址自增
    DmaInitStruct.enDstAddrMode = DmaMskDstAddrFix;                 ///< 目的地址自增
    DmaInitStruct.enDestAddrReloadCtl = DmaMskDstAddrReloadDisable; ///< 禁止重新加载传输目的地址
    DmaInitStruct.enSrcAddrReloadCtl = DmaMskSrcAddrReloadEnable;   ///< 使能重新加载传输源地址
    DmaInitStruct.enSrcBcTcReloadCtl = DmaMskBcTcReloadEnable;      ///< 使能重新加载BC/TC值
    DmaInitStruct.u32SrcAddress = (uint32_t)&out_buff[0];           ///< 源地址
    DmaInitStruct.u32DstAddress = 0x40002508;                       ///< 目标地址: DAC_DHR12R0
    DmaInitStruct.enRequestNum = DmaDAC0Trig;                       ///< 设置DAC0触发
    DmaInitStruct.enTransferMode = DmaMskOneTransfer;               ///< 传输一次
    DmaInitStruct.enPriority = DmaMskPriorityFix;                   ///< 各通道固定优先级,CH0优先级 > CH1优先级
    Dma_InitChannel(DmaCh0,&DmaInitStruct);                         ///< 初始化dma通道0
    
    DmaInitStruct.u32SrcAddress = (uint32_t)&out_buff[1];           ///< 源地址
    DmaInitStruct.u32DstAddress = 0x40002514;                       ///< 目标地址: DAC_DHR12R1
    DmaInitStruct.enRequestNum = DmaDAC1Trig;                       ///< 设置DAC1触发
    Dma_InitChannel(DmaCh1,&DmaInitStruct);                         ///< 初始化dma通道1

    Dma_Enable();                                                   ///< 使能DMA
    Dma_EnableChannel(DmaCh0);                                      ///< 使能DMA通道0
    Dma_ClrStat(DmaCh0);                                            ///< 清零:STAT[2:0]
    Dma_EnableChannel(DmaCh1);                                      ///< 使能DMA通道1
    Dma_ClrStat(DmaCh1);                                            ///< 清零:STAT[2:0]
}

【5】DAC通道0/1触发接口

/**************************************************************************
* 函数名称: DAC0_Trig/DAC1_Trig
* 功能描述: DAC通道0/1触发
**************************************************************************/
void DAC0_Trig(uint16_t p_out)
{
    out_buff[0] = p_out;
    Dac0_SoftwareTriggerCmd();
}

void DAC1_Trig(uint16_t p_out)
{
    out_buff[1] = p_out;
    Dac1_SoftwareTriggerCmd();
}

【6】主函数调用

int32_t main(void)
{
    //系统时钟
    App_SysClkInit();

    //输出模块
    DAC_Init();
    DAC_Cfg();
    DAC_DmaCfg();
    
    while(1)
    {
        //输出
        DAC0_Trig(4095);
        DAC1_Trig(2048);
        
        delay1ms(10);
    }
}

【6】实测结果

        示波器测量PA04(DAC0)、PA05(DAC1)的输出电压如下,根据参考电压5V计算得到DAC0 输出应该为 5V * 4095 / 4095 = 5V;DAC1 输出应该为 5V * 2048 / 4095 = 2.5V。实测符合预期:

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

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

相关文章

漏洞复现-dedecms文件上传(CVE-2019-8933)

dedecms文件上传_CVE-2019-8933 漏洞信息 Desdev DedeCMS 5.7SP2版本中存在安全漏洞CVE-2019-8933文件上传漏洞 描述 ​ Desdev DedeCMS&#xff08;织梦内容管理系统&#xff09;是中国卓卓网络&#xff08;Desdev&#xff09;公司的一套基于PHP的开源内容管理系统&#x…

WebSocket 原理揭秘:让你彻底搞懂 Websocket 原理

WebSocket 的原理 WebSocket 是什么&#xff1f; WebSocket 是一种新型的协议&#xff0c;它可以在客户端和服务器之间建立长连接&#xff0c;实现双向通信。在传统的 HTTP 协议中&#xff0c;当客户端向服务器发送请求后&#xff0c;服务器会返回响应&#xff0c;然后连接就…

创建python虚拟环境

为什么要创建python虚拟环境&#xff1f; 在python开发中&#xff0c;我们可能会遇到一种情况&#xff0c;就是当前的项目依赖的是某一个版本&#xff0c;但是另一个项目依赖的是另一个版本&#xff0c;这样就会造成依赖冲突&#xff0c;在不同的环境中进行不同需求的项目开发…

ChinaSoft 论坛巡礼 | 智慧化 IDE 论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

华为OD机考算法题:矩阵最大值

题目部分 题目矩阵最大值难度难题目说明给定一个仅包含 0 和 1 的 N*N 二维矩阵&#xff0c;请计算二维矩阵的最大值&#xff0c;计算规则如下&#xff1a; 1. 每行元素按下标顺序组成一个二进制数&#xff08;下标越大越排在低位&#xff09;&#xff0c;二进制数的值就是该行…

怎样下载视频号视频?分享6种有效方法

在今天的数字时代&#xff0c;视频号视频成为了人们生活中不可或缺的一部分。有时候&#xff0c;我们看到了一段精彩的视频&#xff0c;希望能够保存下来欣赏或分享给朋友&#xff0c;却因为平台限制而困难重重。为了帮助你实现这个目标&#xff0c;本文将介绍几种简单而有效的…

【JAVA基础】多线程与线程池

多线程与线程池 文章目录 多线程与线程池1. 相关概念1.1 线程调度1.2 守护线程 2. 生命周期3. 同步机制/同步锁3.1 synchronized3.2 lock3.3 synchronized 与 Lock 的对比 4. 死锁5. 线程通信5.1 线程间的通信5.2 等待唤醒机制5.3 举例5.4 调用 wait 和 notify 需注意的细节5.5…

docker应用部署---MySQL的部署配置

docker应用部署---MySQL的部署配置 1. 搜索mysql镜像2. 拉取mysql镜像3. 创建容器&#xff0c;设置端口映射、目录映射4. 进入容器&#xff0c;操作mysql5. 登录mysql6. 使用外部机器连接容器中的mysql 1. 搜索mysql镜像 docker search mysql2. 拉取mysql镜像 #安装5.6版本的M…

<script> 标签的 defer 和 asnyc 属性的作用以及二者的区别

前言 在现代Web开发中&#xff0c;JavaScript的使用几乎是不可避免的。随着Web应用变得越来越复杂&#xff0c;JavaScript文件的大小也在不断增长。为了提高页面加载性能&#xff0c;浏览器提供了async和defer两个属性&#xff0c;用于改变浏览器加载和执行JavaScript文件的方…

AI数字人系统源码部署,打造自己品牌的数字人克隆直播平台

AI数字人是一种利用人工智能技术生成的虚拟形象&#xff0c;可以模仿真人的外貌、声音、表情和动作&#xff0c;实现与人类的自然交互。AI数字人有着广泛的应用场景&#xff0c;如虚拟主播、电商直播、客服助理、教育培训等。要实现AI数字人的功能&#xff0c;需要部署一套完整…

数据库调优(Mysql)

1 索引 索引是帮助数据库高效查询的一种数据结构&#xff1a; 查询语句&#xff1a;select * from t where t.Col2 89; 不加索引进行数据库查询时&#xff0c;每次都需要将所有数据遍历一次&#xff0c;直到找到符合目标的数据。 加上索引之后&#xff0c;可以根据数据结构不同…

Hutool中那些常用的工具类和实用方法 | 京东云技术团队

❓背景 灵魂拷问1&#xff1a;还在为新项目工具类搬迁而烦恼&#xff1f; 灵魂拷问2&#xff1a;还在为项目中工具类维护而烦恼&#xff1f; &#x1f4d8;简述 **Hutool**它是一个Java工具集类库&#xff0c;包含了很多静态方法的封装&#xff1a;流处理、时间日期处理、正…

SAP BC PP 物料搜索帮助修改

ECC on Oracle 升级S4 on HANA ,公司启用了物料状态 MARA-MSTAE 用户想在做物料搜索帮助里面加上这个 物料状态 参考 <SAP简使-ABAP>自定义搜索帮助 - 知乎 (zhihu.com) 过程如下&#xff1a; 1)spro-物流-常规--物料主数据-工具-维护搜索帮助 以 “MAT1L” 物料&am…

SpringBoot集成Redis Cluster集群(附带Linux部署Redis Cluster高可用集群)

目录 一、前言二、集成配置2.1、POM2.2、添加配置文件application.yml2.3、编写配置文件2.4、编写启动类2.5、编写测试类测试是否连接成功 一、前言 这里会使用到spring-boot-starter-data-redis包&#xff0c;spring boot 2的spring-boot-starter-data-redis中&#xff0c;默…

前端 读取/导入 Excel文档

情况&#xff1a; 需要通过Excel表&#xff0c;将数据导入到数据库&#xff0c;但是后台人员出差了&#xff0c;我又只会PHP&#xff0c;没用过node&#xff0c;所以只能前端导入Excel文件&#xff0c;然后循环调用后台的单条添加接口了。 库&#xff1a; Excel.js&#xff08…

基于Java的宠物商店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

03_Flutter自定义下拉菜单

03_Flutter自定义下拉菜单 在Flutter的内置api中&#xff0c;可以使用showMenu实现类似下拉菜单的效果&#xff0c;或者使用PopupMenuButton组件&#xff0c;PopupMenuButton内部也是使用了showMenu这个api&#xff0c;但是使用showMenu时&#xff0c;下拉面板的显示已经被约定…

MedNeXt: Transformer-driven Scaling ofConvNets for Medical Image Segmentation

论文标题;MedNeXt: Transformer-driven Scaling of ConvNets for Medical Image Segmentation 论文链接&#xff1a;2303.09975.pdf (arxiv.org)https://arxiv.org/pdf/2303.09975.pdf 论文&#xff1a; MedNeXt&#xff1a;用于医学图像分割的转换器驱动的ConvNets缩放 项目…

echart绘制环形进度条

原型: <template><div class="chart"><div ref="chartRef" class="chart-bar" :style="{ width, height }"></div><div class="num">{{ sideText }}</div></div> </templa…

一文教你如何将Eclipse项目导入到IDEA运行

&#x1f4d6;本篇超级详细案例截图教学 Eclipse web项目如何导入到Intellij IDEA中&#xff0c;图片点击可放大仔细看 工具版本说明&#xff1a; 工具 版本 Intellij IDEA 2022.3 tomcat 8.5 JDK 1.8 步骤一 .导入一个已存在的工程 1.1 File–>New–>Proj…