STM32 DAC 学习笔记

2023-11-05

(本文基于SYM32F4,部分参数说明参考标准库)

DAC简介

作用就是把输入的数字编码,转换成对应的模拟电压输出。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出 通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当 两个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压引脚 Vref+ (与 ADC 共享)来提高分辨率。

DAC功能框图

在这里插入图片描述

  1. 参考电压
    在这里插入图片描述
    DAC使用Vref+作为参考电压,STM32规定了DAC的Vref+的输入范围为2.4-3.3V设计原理图时一般把Vssa接地,Vref+和Vdda接3.3V,可以得到DAC的电压输出范围是0~3.3V。

    如果需要输出的电压范围变宽,需要外加电压转换电路将DAC的输出按比例抬升。

  2. 数模转换及输出通道
    在这里插入图片描述
    这是DAC的核心部件,它以Vref+为参考电源,以数据寄存器DORx的数字编码作为输入,经过其转换得的模拟信号通过右侧DAC_OUTx通道输出。

    STM32中有两个DAC,每个DAC有一个对应的输出通道连接到特定引脚(需要配置为模拟输入功能)

  3. 触发源及DHRx寄存器
    在这里插入图片描述
    使用DAC时不能直接对DORx寄存器写数据,任何输出到DAC通道x的数据都必须写入到DHRx寄存器中

    数据写入到DHRx寄存器后,DAC会根据触发配置进行处理:

    若使用硬件触发,则DHRx中的数据会在3个APB1时钟周期后传输至DORx,DORx随之输出相应的模拟电压到输出通道

    若使用外部事件触发,可以使用定时器(TIMx_TRGO)、EXTI_9信号或软件触发(SWTRIGx)这几种方式

配置参数
  1. DAC_Trigger:
    用于配置DAC的触发模式,当DAC产生相应的触发事件时才会把DHRx寄存器的值转移到DORx寄存器中进行转换。可以选取的模式:
    ·硬件触发模式(DAC_Trigger_None):DHRx寄存器内的数据会在3个APB1时钟周期内自动转换至DORx进行转换

    · 定时器触发模式(DAC_Trigger_T2/4/5/6/7/8_TRGO):使用定时器2、4、5、6、7、8控制DHRx寄存器的数据按时间转移到DORx中进行转换,利用这种方式可以输出特定的波形

    · EXTI_9触发模式(DAC_Trigger_Ext_IT9):当产生EXTI_9事件时触发转换(如IO中断)

    · 软件触发模式(DAC_Trigger_Software):本模式下向DAC_SWTRIGR寄存器写入配置即可触发信号转换

  2. DACWaveGeneration:
    用于设置是否使用DAC输出伪噪声或三角波
    使用伪噪声或三角波时,DAC都会把LFSR寄存器的值叠加在DHRx数值上,产生伪噪声或三角波。

  3. DAC_LFSRUnmask_TriangleAmplitude:
    通过控制DAC_CR的MAMP2位设置LFSR寄存器位的数据,即当使用伪噪声或三角波输出时要叠加到DHRx的值,非噪声或三角波输出模式下本参数无效。

    使用伪噪声输出时LFSR=0xAAA,MAMP2寄存器位可以屏蔽LFSR的某些位,这时把本结构体成员赋值为DAC_LFSRUnmask_Bit0~DAC_LFSRUnmask_Bit11_0等宏即可;

    使用三角波输出时,本结构体设置三角波的最大幅值,可选择DAC_TriangleAmplitude_1~ DAC_TriangleAmplitude_4096等。

  4. DAC_OutputBuffer:
    用于控制是否使能DAC的输出缓冲,使能了DAC输出缓冲可以减小输出阻抗,适合直接驱动一些外部负载

实验验证

我们可以通过DAC通道产生正弦波来验证实验。
要输出正弦波,实质是控制DAC以正弦函数关系来输出电压。由于模拟信号是连续的而数字信号是离散的,所以使用DAC输出正弦波时只能按一定时间间隔输出正弦曲线上的点,在该时段内输出相同的电压值,若缩短时间间隔,提高单个周期内输出点数,可以逐渐逼近连续正弦波的图形。

因为正弦波是周期函数,所以我们只需要得到单个周期内的数据即可。为了增加响应速度,减少单片机运算量,我们一般提前算好数据存入表中查表使用。

数据准备
可写入寄存器的最大值是12位所以就是2^12=4096
sin范围是[0,1],可以经过处理:v=3.3*(sin+1)/2,此时的范围就是[0,3.3]

把电压值以DAC寄存器的形式表示:Reg=(4096/3.3)v=2^11(sin+1)
此时存储到寄存器的值的范围就是[0,4096]

我们在单个周期内取32个点进行电压输出,所以就在[0,2Π]内等距取32个点按上面的公式算出来形成数组表格。
控制DAC输出时,每隔固定的时间就取出数组中的一个值进行输出即可模拟正弦波,改变时间间隔长度可以改变模拟正弦的周期

最后我们可以得到一组值:
在这里插入图片描述
下面我们进行配置:

uint16_t Sine12bit[32] = {
 2048 , 2460 , 2856 , 3218 , 3532 , 3786 , 3969 , 4072 ,
 4093 , 4031 , 3887 , 3668 , 3382 , 3042 , 2661 , 2255 ,
 1841 , 1435 , 1054 , 714 , 428 , 209 , 65 , 3 ,
 24 , 127 , 310 , 564 , 878 , 1240 , 1636 , 2048
 };

void DAC_Config(void)
{
	DAC_InitTypeDef  DAC_Structer;
	DAC_Structer.DAC_Trigger	= DAC_Trigger_Software;//使用软件触发
	DAC_Structer.DAC_WaveGeneration  = DAC_WaveGeneration_None;//不使用波形发生器
	DAC_Structer.DAC_OutputBuffer  = DAC_OutputBuffer_Enable; //使用DAC输出缓冲
	DAC_Structer.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;//本实验没有用到,随便设置
	DAC_Init(DAC_Channel_1,&DAC_Structer);
	DAC_Cmd(DAC_Channel_1,ENABLE);
	
}

void TIM2_IRQHandler(void)
{
	static u8 i=0;
	TIM_ClearITPendingBit (TIM2,TIM_IT_Update);
	DAC->DHR12R1 = Sine12bit[i];
	//DAC_SetChannel1Data (DAC_Align_12b_R,Sine12bit[i]);/这个和上面一行效果一样
	DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);//需要注意的是,每次更改DHRx寄存器的值,都要用这个函数使能后才能输出
	i++;
	if(i>31) 
	{
		i=0;
	}
}

最够得到结果可以用示波器看到是一个正弦波(这个正弦波还是会有噪声的)

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

STM32 DAC 学习笔记 的相关文章

  • markdown插入excel表格

    No Cruft Excel to HTML Table Converter http pressbin com tools excel to html table index html John Smith 123 Main St Spr
  • SpringCloud整体架构解析

    目录 技多不压身 服务治理 负载均衡 消息间调用 服务容错 分布式配置中心和消息推送组件 服务网关 调用链路追踪 消息驱动 防流量卫兵 小结 Spring Cloud的中文名我们就暂且称呼它为 春云 吧 听上去是多么朴实无华的名字 不过呢一
  • 【Xilinx Vivado时序分析/约束系列4】FPGA开发时序分析/约束-实验工程上手实操

    目录 建立工程 添加顶层 模块1 模块2 添加约束文件 编辑时钟约束 打开布线设计 代码代表的含义 时序报告 进行时序分析 Summary 包含了汇总的信息量 Source Clock Path 这部分是表示Tclk1的延时细节 Data
  • 关于mysql中触发器执行动态sql的问题

    这几天手头开发的系统要做一个类似windows账户到期时间的功能 考虑了半天想出了一个技术上和逻辑上都还能实现的解决方案 创建一个用户存入数据库的时候都创建一个事件调度器来控制用户的到期时间 mysql的时间调度器确实很方便 想起来是很简单

随机推荐

  • vue报错:Error: [vuex] Do not mutate vuex store state outside mutation handlers.

    报错原理解读 Error vuex Do not mutate vuex store state outside mutation handlers 该报错从文本意思理解还是很清晰的 不要在mutation函数外修改vuex中存储的值 通常
  • 小程序发布后搜索不到怎么办?

    随着小程序商城的热度不减 更多的电商大佬纷纷使用小程序 如今已建立起2万开发者 1 2亿用户日活的小程序生态 微信对小程序的大力支持 也让无数的开发者和商户看到了微信小程序的无限发展潜力 但是 身边有很多朋友都会遇到一些问题 常见的就是在发
  • CVE-2023-27363 FOXIT PDF READER与EDITOR任意代码执行漏洞复现

    目录 0x01 声明 0x02 简介 0x03 漏洞概述 0x04 影响版本 0x05 环境搭建 文件下载 0x06 漏洞复现 POC下载 利用POC RCE 0x07 修复建议 官方升级 手动升级 0x01 声明 仅供学习参考使用 请勿用
  • ERROR: Failed to parse POMs解决方法

    最近在做jenkins构建项目发布时遇到这个问题 ERROR Failed to parse POMs java io IOException Can t read POM opt gamma jenkins jobs indra pare
  • gitbash使用

    gitbash是什么 git bash是Windows下的命令行工具 基于msys GNU环境 有git分布式版本控制工具 主要用于git版本控制 上传下载项目代码 GNU环境 就是说如果你喜欢linux unix的环境 就可以选择使用gi
  • 如何用Autojs写自己的卡密验证界面?实战代码

    最近有朋友问我的卡密验证界面是怎么写的 今天把源码分享出来 先上一个卡密验证界面的效果图 源码第646行中的main js替换为你的卡密验证通过后要跳转的js文件 这里路径为相对路径 跟本卡密验证 js为同级目录 完整源码 遇到问题 一键加
  • 【转】虚拟机安装Ubuntu的上网设置(有线网络和无线网络)

    虚拟机下ubuntu共享方式上网 一 有线网络 在有线网络的条件下 vmware的安装非常简单 上网方式几乎不用怎么设置 默认NAT模式 如果默认情况下不能上网 则按以下步骤尝试 NAT的DHCP配置 1 将虚拟机的上网方式选为NAT 2
  • down.php无法打开,php下载文件 图片不能打开,该怎么解决

    php下载文件 图片不能打开 function fileDown file name file name iconv utf 8 gb2312 file name file path E php down file name if file
  • STC15单片机实战项目 - PCB设计

    PCB设计 一 设计文件链接 1 PADS9 5格式PCB设计文件 gt Project STC15 V1 0 pcb 2 AltiumDesigner格式PCB设计文件 gt Project STC15 V1 0 PcbDoc 二 获取开
  • 【python爬虫专项(23)】利用Selenium实现网页账号登录(以豆瓣网为例)

    案例网页 https book douban com 1 找到 登陆 注册 的标签 并click 输入对应代码如下 log in browser find element by xpath id db global nav div div
  • Mac os更新系统后安装scrapy报错error: command ‘xcrun‘ failed with exit status 1

    查看报错信息 In file included from src twisted test raiser c 4 In file included from Library Developer CommandLineTools Librar
  • 14 C语言进阶自定义类型详解

    自定义类型 结构体 枚举 联合 大纲 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段 位段的填充 可移植性 枚举 枚举的定义 枚举的优点 枚举的使用 联合 联合类型的定义 联合的
  • 敏捷测试的“三板斧“

    什么是三板斧 可灰度 任何变更 都必须是可以灰度的 即控制变更的生效范围 先做小范围变更 验证通过之后才扩大范围 可监控 在灰度的过程中 必须能做到可监控 能了解到变更之后对系统的应用 可回滚 当通过监控发现变更后会引发问题时 还需要有方法
  • 八进制数的表达方法!八进制数在转义符中的使用!

    C C 语言中 如何表达一个八进制数呢 如果这个数是 876 我们可以断定它不是八进制数 因为八进制数中不可能出7以上的阿拉伯数字 但如果这个数是123 是567 或12345670 那么它是八进制数还是10进制数 都有可能 所以 C C
  • Spring学习笔记 搭建环境

    现在开始我们就要开始学习Spring框架了 首先要做的事情就是搭建Spring环境 为了让我们关注于Spring的功能 我在这里使用Spring Initializer 它会自动为我们创建一个包含了Spring依赖的项目 让我们能直接快速开
  • 试题 算法训练 二进制数数

    问题描述 给定L R 统计 L R 区间内的所有数在二进制下包含的 1 的个数之和 如5的二进制为101 包含2个 1 输入格式 第一行包含2个数L R 输出格式 一个数S 表示 L R 区间内的所有数在二进制下包含的 1 的个数之和 样例
  • linux 防火墙打开5432 端口,在ubuntu上打开端口5432

    我试图使用ufw使用sudo ufw allow 5432 tcp在ubuntu上打开端口5432 然后我使用nmap来查看端口5432是否已打开 我得到了这个 root domain sudo nmap sS O 127 0 0 1 St
  • Linux部署kettle并设置定时任务

    一 安装Kettle linux中使用kettle时首先需要jdk环境 这里就不概述linux中jdk的安装与配置了 1 首先将kettle压缩包放入linux并解压 unzip data integration zip kettle安装路
  • C++:理解this指针

    详情见 gt https blog csdn net keneyr article details 111758870
  • STM32 DAC 学习笔记

    本文基于SYM32F4 部分参数说明参考标准库 DAC简介 作用就是把输入的数字编码 转换成对应的模拟电压输出 DAC 可以按 8 位或 12 位模式进行配置 并且可与 DMA 控制器配合使用 在 12 位模式下 数据可以采用左对齐或右对齐