STM32学习笔记--DAC

article/2025/9/26 5:49:46

目录:

  • 一、DAC原理
    • 1.DAC定义
    • 2.STM32DAC简介
    • 3.STM32DAC工作原理
  • 二、STM32DAC库函数配置
  • 参考资料

一、DAC原理

1.DAC定义

  DAC是Digital-to- Analog Converter的缩写,数字/模拟转换模块的简称,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与ADC相反。

2.STM32DAC简介

  数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
  主要功能特点如下:
  ● 2个DAC转换器:每个转换器对应1个输出通道
  ● 8位或者12位单调输出
  ● 12位模式下数据左对齐或者右对齐
  ● 同步更新功能
  ● 噪声波形生成
  ● 三角波形生成
  ● 双DAC通道同时或者分别转换
  ● 每个通道都有DMA功能
  ● 外部触发转换
  ● 输入参考电压VREF+
  STM32DAC结构框图如下:
在这里插入图片描述

3.STM32DAC工作原理

(1)电源、参考电压及输出通道
  VDDA和VSSA为DAC模块模拟部分的供电;VREF+则是DAC模块的参考电压。
在这里插入图片描述
  DAC_OUTx就是DAC的输出通道了。
在这里插入图片描述
(2)DAC转换及输出
  数字至模拟转换器x是DAC核心部件,它以VREF+作为参考电源,以DAC 的数据寄存器“DORx”的数字信号作为输入,经过它转换得的模拟信号由“DAC_OUTx”通道输出。但是,用户不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DHRx寄存器。
在这里插入图片描述
◆ DHR相关寄存器
  ➢ 用户写入的数据保持寄存器:
    单DAC通道模式:总共有6个DAC_DHRyyyx寄存器
      ● DAC通道x的12位右对齐数据保持寄存器 DAC_DHR12Rx (x=1、2)
      ● DAC通道x的12位左对齐数据保持寄存器 DAC_DHR12Lx (x=1、2)
      ● DAC通道x的8位右对齐数据保持寄存器 DAC_DHR8Rx (x=1、2)
    双DAC通道模式:总共有3个DAC_DHRyyyD寄存器
      ● 双DAC的12位右对齐数据保持寄存器 DAC_DHR12RD
      ● 双DAC的12位左对齐数据保持寄存器 DAC_DHR12LD
      ● 双DAC的8位右对齐数据保持寄存器 DAC_DHR8RD
➢ 内部的数据保存寄存器x
  ● 内部的数据保存寄存器1:DHR1
  ● 内部的数据保存寄存器2:DHR2
◆ DAC数据格式
  根据选择的配置模式,数据按照下文所述写入指定的寄存器:
  ● 单DAC通道x,有3种情况:
    ─ 8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位)
    ─ 12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位)
    ─ 12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)
  根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。
在这里插入图片描述◆ DAC通道x数据输出寄存器DAC_DORx寄存器
  DAC通道2数据输出寄存器(DAC_DOR1)
在这里插入图片描述
  DAC通道1数据输出寄存器(DAC_DOR2)
在这里插入图片描述
◆ 触发配置
 由DAC控制寄存器DAC_CR的第2位TEN1和第18位TEN2分别控制DAC的通道1和通道2是否使能触发。
在这里插入图片描述
 如果使能触发,即寄存器DAC_CR的TENx位置’1’,DAC转换可以配置为由某外部事件或软件触发。
 配置DAC_CR寄存器的控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换。
 如果配置为软件触发,则需要通过对DAC软件触发寄存器DAC_SWTRIGR相应的SWTRIGx位置’1’ 。
 触发发生后,3个APB1时钟周期后,最近存放在寄存器DAC_DHRx中的数据会被传送到寄存器DAC_DORx中,转换即开始。
◆ DAC转换及输出总结:
 针对单DAC模式,无触发
 ● 不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DAC_DHRyyyx数据保持寄存器。
 ● 写入DAC_DHRyyyx寄存器的数据经过相应的移位后,被转存到内部的数据保存寄存器x(DHRx寄存器)中。
 ● 如果没有使能触发(寄存器DAC_CR的TENx位置’0’),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。
 ● 一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。
在这里插入图片描述
(3)DAC输出电压
  数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。
  任一DAC通道引脚上的输出电压满足下面的关系:
    DAC输出 = VREF x (DOR / 4095)
(4)使能DAC通道
  将DAC_CR寄存器的ENx位置’1’即可打开对DAC通道x的供电。经过一段启动时间tWAKEUP,DAC通道x即被使能。
  注意: ENx位只会使能DAC通道x的模拟部分,即便该位被置’0’,DAC通道x的数字部分仍然工作。
(5)DAC输出缓存
  DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭。

二、STM32DAC库函数配置

  以设置DAC模块的通道1来输出模拟电压为例
1.开启PA口和DAC时钟,设置PA4为模拟输入

RCC_APB1PeriphClockCmd()
RCC_APB2PeriphClockCmd()
GPIO_Init()

GPIO_InitTypeDef GPIO_InitStructure;
//开启PA口和DAC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );//使能PA口时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );//使能DAC通道时钟
//设置PA4为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

2.初始化DAC,设置DAC的工作模式

void DAC_Init(uint32_t DAC_Channel,
DAC_InitTypeDef* DAC_InitStruct)

  参数设置结构体类型DAC_InitTypeDef的定义:

typedef struct
{
uint32_t DAC_Trigger; //用来设置是否使用触发功能
uint32_t DAC_WaveGeneration; //用来设置是否使用波形发生
uint32_t DAC_LFSRUnmask_TriangleAmplitude;//用来设置屏蔽/幅值选择器,这个变量只在
使用波形发生器的时候才有用
uint32_t DAC_OutputBuffer; //用来设置输出缓存控制位
}DAC_InitTypeDef

  第一个参数 DAC_Trigger 用来设置是否使用触发功能,前面已经讲解过这个的含义,这里我们不是用触发功能,所以值为 DAC_Trigger_None。
  第二个参数 DAC_WaveGeneratio 用来设置是否使用波形发生,这里我们前面同样讲解过不使用。所以值为 DAC_WaveGeneration_None。
  第三个参数 DAC_LFSRUnmask_TriangleAmplitude 用来设置屏蔽/幅值选择器,这个变量只在使用波形发生器的时候才有用,这里我们设置为 0 即可,值为DAC_LFSRUnmask_Bit0。
  第四个参数 DAC_OutputBuffer 是用来设置输出缓存控制位。
  代码:

DAC_InitTypeDef DAC_InitType;
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1 输出缓存关闭
DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化 DAC 通道 1

3.使能DAC转换通道

void DAC_Cmd(uint32_t DAC_Channel
FunctionalState NewState)

DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC通道1

4.设置DAC的输出值

void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)

  第一个参数设置对齐方式。可以为:
    12位右对齐DAC_Align_12b_R,
    12位左对齐DAC_Align_12b_L,
    8位右对齐DAC_Align_8b_R方式。
  第二个参数就是DAC的输入值了。

DAC_SetChannel1Data(DAC_Align_12b_R, 400); //12位右对齐数据格式设置DAC值

  读出DAC的数值,函数是:

uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel)

DAC_GetDataOutputValue(DAC_Channel_1);

参考资料

  1.STM32 DAC工作原理
  2.【STM32】DAC基本原理、寄存器、库函数(DAC一般步骤)


http://chatgpt.dhexx.cn/article/K5m2xf2Q.shtml

相关文章

Bwapp 04 05

文章目录 Insecure DOR (Change Secret)Insecure DOR (Reset Secret)Insecure DOR (Order Tickets)安全配置 Insecure DOR (Change Secret) 抓包的话,就可以实行篡位修改 Insecure DOR (Reset Secret) 同上,换成了xml的形式 Insecure DOR (Order Ticke…

水处理相关工艺控制程序汇总(RXXW_Dor)

水处理和化工行业流程控制类程序工艺有很多相似之处,属于过程控制,并不太关心控制实时性和控制速度,这篇博客汇总项目各种工艺写法,陆续会更新。流程控制类程序很多可以利用状态机思想进行编程,有关状态机编程的详细方法可以参看下面的文章链接: PLC面向对象编程系列之有…

整理 kanban 的 DoR 和 DoD

所谓 DoR 和 DoD 就是 Definition of Ready 和 Definition of Done。 我们的敏捷团队在需求管理上主要有两个会:需求梳理会和需求计划会议。 需求梳理会的阐述的意向用户故事会放到 Backlog,后由研发 Owner 跟进,在计划会上,将符合 DoR 放入 Sprint Todo。 「Backlog」…

人生的DoR和DoD:志向、遗产

我们要为两件事做好准备:太阳升起和太阳落山。前者没准备好,则错过了大好时光。后者没准备好,则坠入无边黑暗。前者让你醒的来,后者让你睡得着。 (一)立志是人生的DoR 年少的刘备与同族的孩子在树下玩耍时&…

【Scrum模式语言9】准备就绪的定义(Definition of Ready - DoR )

译者序:在很多敏捷项目中,秩序诞生的标志之一是有了成文的DoR。但是项目组和需求方的折中往往也无可奈何地始于将没有就绪的需求纳入到Sprint待办事项列表,并为Sprint实施阶段带来一系列的不可控因素。为什么市场和产品人员时常要求技术人员在…

敏捷开发中的 DoD 和 DoR 是什么?

在敏捷开发中,让所有成员保持目标统一、步调和节奏一致非常重要,但是在团队协作中,认知偏差却在所难免。需求在不同环节中流转,是否存在某种途径能保证所有成员的理解一致,将偏差最小化? 今天跟大家介绍敏…

传播动力学--SIR模型及其应用

王道谊 2020年3月 1. 传播动力学 “道生一,一生二,二生三,三生万物。” ---《道德经》 所谓“不积跬步无以至千里”,任何变化都是由点滴变化决定并发展起来的。知道所有的微观点滴变化,就能够掌握宏观变化。点滴…

SIR传播模型的科普和预测

>关注公众号:大数据技术派,回复资料,领取1024G资料。 注:本文仅是个人对于几个疾病模型做的一些概念性描述(科普),并进行了简单的编程实现。切勿当做现实的行动指导。因为文章内容原因&#…

6.复杂网络实验六:SIR病毒传播模型(matlab)

一、SIR模型简介 在典型的传染病模型中,种群(Population)内的N个个体的状态可分为如下几类: (1)、易染状态S(Susceptible),即健康状态,可被感染的个体。 (2)、感染状态I(Infected),处于感染状态的个体还能够感染将康…

传染病SIR传播模型(搬运,含带MATLAB代码)

学习笔记之SIR传染病模型TOC 本文主要是对此篇文章代码部分的详解 function ysir(~,x)a0.8; %感染率0.8b0.2; %治愈率0.2y[-a*x(1)*x(2),a*x(1)*x(2)-b*x(2),b*x(2)]; end %t 为持续时间,%x为三维矩阵,其中x(1)为易感染者,x(2)为传染者&…

传染病模型(4)——SIRS模型和SIER模型及matlab具体程序

前言 常见的传染病模型按照具体的传染病的特点可分为 SI、SIS、SIR、SIRS、SEIR 模型。其中“S”“E”“I”“R”的现实含义如下: S (Susceptible),易感者,指缺乏免疫能力健康人,与感染者接触后容易受到感染; E (Ex…

信息传播模型——SIR的Python实现

本文通过Python语言实现SIR模型,并进行可视化,所用例子为足球俱乐部数据集。 author:xiao黄 缓慢而坚定的生长 我之前还写过SI和IC模型的Python实现及可视化,请点击传送门查看,希望对你们有帮助。 SIR模型是传染病模型…

疫情模拟中的SIR模型与扩展的SIRD模型

一.SIR模型 SIR模型起源于流行病学的研究,是模拟传染病动力学的经典模型。至今仍在流行病学中占据中心位置,核心在于微分方程。 SIR模型描述了流行病下三大人群:易感者 susceptible、感染者 infectious、痊愈者 recovered之间的关系。 SIR模…

基于SIR模型的疫情预测 matlab

基于SIR模型的疫情预测 庚子年 庚辰月 丁丑日,疫情从爆发到今天,已经有100多万人感染,而我国有一群这样的逆行者他们以自己的生命筑起了我国的防疫长城,鲁迅先生曾说“我们从古以来,就有埋头苦干的人,有拼…

python实现SI、SIS、SIR、SIRS、SEIR、SEIRS模型

传染病传播模型 SISISSIRSIRSSEIR(相比较贴合新冠状病毒)SEIRS 在家闲着无事,搜了一些关于传染病模型的知识,在此做个总结。 SI 最简单的SI模型首先把人群分为2种,一种是易感者(Susceptibles),易感者是健康…

流行病模型(SIR Model)

流行病模型(SIR Model) by : ZhuoFei, Zhou 首先定义一个函数bernoulli(p) #以概率p判断是否会被感染或恢复 function bernoulli(p::Number)if rand(1)[1] < preturn trueelsereturn falseend endbernoulli (generic function with 1 method)恢复所需的时间函数recovery_…

SIR模型与R模拟

SIR病毒模型R模拟 文章目录 SIR病毒模型R模拟[toc]1.SIR病毒模型2.R模拟 1.SIR病毒模型 SIR病毒模型的的三个字母分别为病毒传播过程中的三种状态&#xff0c;其中 S&#xff0c;表示易感染者&#xff0c;即没有被感染病毒的人群I&#xff0c;表示已感染者&#xff0c;即被感…

【python】SIR模型实现

SIR模型python实现 SIR模型是传染病模型中最经典的模型&#xff0c;其中S表示易感者&#xff0c;I表示感染者&#xff0c;R表示恢复者。SIR模型中&#xff0c;染病人群为传染的源头,他通过一定的几率把传染病传给易感人群,他自己也有一定的几率/可以被治愈并免疫,或者死亡;易感…

传染病模型(3)——SIR模型及matlab运行结果

前言 常见的传染病模型按照具体的传染病的特点可分为 SI、SIS、SIR、SIRS、SEIR 模型。其中“S”“E”“I”“R”的现实含义如下&#xff1a; S (Susceptible)&#xff0c;易感者&#xff0c;指缺乏免疫能力健康人&#xff0c;与感染者接触后容易受到感染&#xff1b; E (Exp…

关于SIR模型性质的进一步摘录

1 SIR模型的性质 又是成为SIR搬运工的一天。以下内容来自陈卫老师在《大数据网络传播模型和算法》。纯纯自我记录&#xff0c;不够美观不够细致&#xff0c;不喜欢看出门左拐。 1.1 SIR模型中的basic reproduction rate&#xff08;基础再生数&#xff09; R 0 R_0 R0​ 它是…