STM32之DAC君

发布者:电子设计探索者最新更新时间:2021-03-23 来源: eefocus关键字:STM32  DAC 手机看文章 扫描二维码
随时随地手机看文章

先来张比如花漂亮的照片、大家请尽情欣赏:因为其够美丽了、所以我就不展现我美丽而销魂的涂鸦了、


鉴赏过之后、我们来看看STM32之DAC的Resume(简历简介):



2个DAC转换器:每个转换器对应1个输出通道


● 8位或者12位单调输出


● 12位模式下数据左对齐或者右对齐


● 同步更新功能


● 噪声波形生成


三角波形生成


● 双DAC通道同时或者分别转换


● 每个通道都有DMA功能


● 外部触发转换


● 输入参考电压VREF+


哇、、哇、、哇、、好多特征呀、、还记得上篇博客中ADC也有很多功能吗?在这里,我觉得,因为其功能多、所以其复杂、、这也没什么奇怪的哈、、


那我们今天要干嘛呢?DAC顾名思义,输入量是D,也就是D、、而输出量是A、也顾名思义、当然、对于聪明的你们来说D A代表哪个英文单词和普通话意思是知道的、


由上图可以清晰的看出,DAC的输出是受DORX寄存器直接控制的,而用户的写的数据是写在DHRX寄存器里的、说明我们不能直接操控DORX,而要通过DORX间接操作DORX,从而实现对DAC的输出、


今天我们是采用DAC的通道1,采用12位的右对齐方式,对于对齐方式,大家翻开中文参考手册可以看到:


● 单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寄存器。(这段话也就是对上张图片的描述)


接下来我们看看


1、输入输出使能:


通道使能控制:EN1@DAC_CR


一旦通道使能,输出引脚PA.4就被自动连到模拟转换器的输出


使能通道之前,PA.4要配置成模拟模式AIN



该使能信号只使能了模拟部分,数字接口部分由DACEN@RCC_APB1ENR控制WAKEUP


经过t WAKEUP时间后DAC通道准备就绪


DAC通道上的引脚输出模拟电压 = VREF+ * (DOR / 4095)


输出通道上集成可配置的输出缓冲,以减小自身的输出阻抗


使能控制:BOFF1@DAC_CR


2、输出通道上的缓冲:


通道内嵌输出缓冲以增加驱动能力


外部负载较大时,无需增加外部放大器


可使能或禁止该缓冲


外部有大负载,且缓冲禁止时,输出电压可能达不到预期


介绍两张图片:大家可以对比对比下,在这就不细讲了、



3、DAC的转换过程:


用户写入DAC_DHRx的值,自动或者在外部触发条件下经过一段时间后,传输到DAC_DORx;再经过一段固定时间tSETTLING,在外部引脚输出转换后的模拟信号(电压)。


(1)对DAC_DHRx的写操作


(2)数据从DHRx到DORx的搬移


(3)输出电压信号到外部引脚


我们来看看寄存器DAC控制寄存器(DAC_CR)


DMAEN1:DAC通道1 DMA使能 (DAC channel1 DMA enable),我们不使用DMA,故设置为0


MAMP1[3:0]:DAC通道1屏蔽/幅值选择器 (DAC channel1 mask/amplitude selector)我们没有用到 故这几位也设置为0


WAVE1[1:0]:DAC通道1噪声/三角波生成使能 (DAC channel1 noise/triangle wave generation enable)我们也没用到 故也设置为0


TEN1:DAC通道1触发使能 (DAC channel1 trigger enable)我们不用触发,所以设置为0


TSEL1[2:0]:DAC通道1触发选择 (DAC channel1 trigger selection)注意:该位只能在TEN1= 1(DAC通道1触发使能)时设置。我们TEN1设为0,所以这几位就不用设置,默认为0


BOFF1:关闭DAC通道1输出缓存 (DAC channel1 output buffer disable)我们关闭输出缓冲 故设置为1


EN1:DAC通道1使能 (DAC channel1 enable)我们要使能DAC通道、故设置为1


至此,我们已经设置了以上寄存器,我们就可以操作DAC了,但是我们并不是通过寄存器操作的、在这里摆出寄存器的设置,是为了大家有一个更好的了解,那我们打开"stm32f10x_dac.h"


可以看到:


typedef struct


{


uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel.设置是否使用触发功能


This parameter can be a value of @ref DAC_trigger_selection */


uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves设置是否使用波形发生


are generated, or whether no wave is generated.


This parameter can be a value of @ref DAC_wave_generation */


uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or设置屏蔽/幅值选择器


the maximum amplitude triangle generation for the DAC channel.


This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */


uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled.设置输出缓存控制位


}DAC_InitTypeDef;


根据以上说明,具体的设置请看代码、、


那好、、现在我们来看看具体的步骤:


1、使能DAC的时钟和GPIOA的时钟,并配置GPIOA


2、设置DAC的工作模式等功能


3、使能DAC通道


4、设置DAC的输出值


void Dac1_Init(void)


{


DAC_InitTypeDef DAC_InitStructure;


GPIO_InitTypeDef GPIO_InitStructure;


/* Enable peripheral clocks ------------------------------------------------*/


/* GPIOA Periph clock enable */


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


/* DAC Periph clock enable */


RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);


/* Once the DAC channel is enabled, the corresponding GPIO pin is automatically


connected to the DAC converter. In order to avoid parasitic consumption,


the GPIO pin should be configured in analog */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;


GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_SetBits(GPIOA,GPIO_Pin_4);


/* DAC channel1 Configuration */


DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;


DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;


DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;


DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;


DAC_Init(DAC_Channel_1, &DAC_InitStructure);


/* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is


automatically connected to the DAC converter. */


DAC_Cmd(DAC_Channel_1, ENABLE);


/* Set DAC Channel1 DHR12L register *初始化/


DAC_SetChannel1Data(DAC_Align_12b_R, 0);


}


//设置DAC通道的值我们可以通过按键 例如


if(按键按下)


{


delay_ms(10);


DAC_SetChannel1Data(DAC_Align_12b_R, a += 200);


if(a>4000)


{


a = 0;


}


}


,或者由ADC转换后的值,给DAC采集


adcx=DAC_GetDataOutputValue(DAC_Channel_1);//通过此函数我们可以读取设置DAC通道里的值也就是DOR里的数(0~4095)


DAC通道上的引脚输出模拟电压 = VREF+ * (DOR / 4095)//根据此公式就可以计算出模拟输出电压、、


此模拟电压又可以被ADC采集,从而输出(0~4095),你可以把两者结合起来,通过一定的编程,通过串口发送到窗口,看你设置的值和经ADC转换的值(0~4095)是否相等


PS:此步骤也可以在官方的例程里找到步骤哈、、


在听完小甲鱼的数据结构与算法后、整理了一下昨天学的DAC模块,写了这篇文章、看着面前的一大堆书:数据结构,算法导论、通信原理、计算机控制等、、总想让自己在毕业之前多学习,多学些知识、可以看出、这篇文章的幽默是少了很多、、但我觉得不影响这篇博客的质量

关键字:STM32  DAC 引用地址:STM32之DAC君

上一篇:STM32自己总结如何正确创建一个工程
下一篇:什么是STM32以及如何学习?

推荐阅读最新更新时间:2024-10-27 16:56

KUKA机器人RESUME取消中断事务 V4.25
•取消在本中断程序的优先级之下的中断程序和子程序。 可能导致的运动被终止 RESUME 指令只能在中断程序中执行 当 RESUME 生效时,vancerun 指针不能在产生中断的行,而是至少低一行。 机器人运动期间,接近开关发现到两个目标并且记录了它们的位置,所以随后机器人可以再移动到该位置。 即使机器人已经知道了两个目标,机器人也会沿着全部的搜索轨迹移动。为节约时间,一旦发现了零件的多数时应立即结束移动。 KRC.。.中机器人运动的取消是可能的,使用语句: RESUME RESUME可以取消当前中断被声明的级别和以下级别的所有运行的中断程序和
[机器人]
USB的挂起和唤醒 (Suspend and Resume)
USB协议的第9章讲到USB可见设备状态 ,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态。所谓可见,即USB系统和主机可见的状态,其他状态属于USB设备内部而不可见。其中有关电源的,大致可分下面三类: 1. 连接状态(Attached):设备连接,但未提供电源。 2. 上电状态(Powered):设备被复位(Reset),或者说处于地址、配置状态。(参见 USB枚举过程 ,USB Specification, page 241) 3. 挂起状态(Suspended):3 ms未见总线活动而处于省电状态,设备不
[嵌入式]
STM32 DAC 播放wav 语音
#define BITS_PER_SAMPLE_8 8 #define WAVE_DUMMY_BYTE 0xA5 #define DAC_DHR8R1_Address 0x40007410 #define BUFFER_SIZE 1024 __IO uint16_t TIM6ARRValue = 1088; uint32_t WaveDataLength = 13144; uint32_t ReadOffset; uint8_t Wavebuffer ; //uint8_t Wavebuffer2 ; #define SAMPLE_RAT
[单片机]
STM32 DAC+TIMER+DMA应用演示
现在有如下图所示的这样一个需求,希望使用STM32芯片来实现。 横轴表示时间,纵轴表示电压【3.3v为限】,不同时刻的电压输出不一样、持续时间也不尽相同。 此问题源于某高校STM32学习时的习题,这里拿出来一起交流探讨下。方法不是唯一的,尤其基于不同STM32系列。这里尽量使用通用、常规的方法,算是抛砖引玉。 显然,我们可以考虑使用STM32的DAC加TIMER以及片内其它资源加以实现。 对于这个实现我们可以分两种方式完成,每一种方式同时也体现不同难度。 我们可以考虑下面两种应用情形: 第一种方式:MCU除了做这一件事外,还做点别的,比方做按键响应、ADC采样这些,整体上没有太复杂的功能和要求。【中断方式】 第二种方式:M
[单片机]
<font color='red'>STM32</font> <font color='red'>DAC</font>+TIMER+DMA应用演示
STM32DAC加TIMER应用演示
现在有如下图所示的这样一个需求,希望使用 STM32 芯片 来实现。 横轴表示时间,纵轴表示电压【3.3v为限】,不同时刻的电压输出不一样、持续时间也不尽相同。 此问题源于某高校STM32学习时的习题,这里拿出来一起交流探讨下。方法不是唯一的,尤其基于不同STM32系列。这里尽量使用通用、常规的方法,算是抛砖引玉。 显然,我们可以考虑使用STM32的 DAC 加 TI MER以及片内其它资源加以实现。 对于这个实现我们可以分两种方式完成,每一种方式同时也体现不同难度。 我们可以考虑下面两种应用情形: 第一种方式: MCU 除了做这一件事外,还做点别的,比方做按键响应、 ADC 采样这些,整体上没有太复杂的功能和要求。【中断
[单片机]
<font color='red'>STM32</font>的<font color='red'>DAC</font>加TIMER应用演示
STM32系列DAC的介绍与使用
前言 最近是因为有一个项目需要输出 0~10V 的信号量,而且 想着应该可以直接使用 STM32 的 DAC 来做,虽然不一定实际使用,但是也就来试试看吧。 说句实话,博主自己做的产品,不常用 DAC,所以 本文我们就来好好复习下 STM32 的 DAC ,从应用角度讲讲如何快速使用起来。 我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 一、STM32 带 DAC 的系列 目前博主产品使用的芯片为 STM32L051C8 系列,本来还想着直接CubeMX 设置一下,直接测试,才发现这个片片根本没有 DAC = =! 好吧,尴尬,后来查了下 L 系列确实都没有 D
[单片机]
<font color='red'>STM32</font>系列<font color='red'>DAC</font>的介绍与使用
CubeMX配置stm32DAC
我们使用 STM32CubeMX 软件进行配置。DAC 的配置是相对很简单的,如下图所示: 选择两个输出通道,其中 External Trigger 选项为是否选择 外部中断EXTI9 触发,如下图所示: DAC 的基本设置,很简单,对于博主使用的 STM32L151 来说就只有2个选项: DAC选择了输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。但是输出的电压没法低于20mv。 不使能输出缓存,DAC可以输出低于20mv的信号。 对于其他型号的 DAC ,可能还会有下面两个选项: Wave generation mode 波形生成模式:可选三角波发生器 ( Triangle wave genera
[单片机]
CubeMX配置<font color='red'>stm32</font>的<font color='red'>DAC</font>
STM32系列DAC的基本使用
一、STM32 带 DAC 的系列 目前博主产品使用的芯片为 STM32L051C8 系列,本来还想着直接CubeMX 设置一下,直接测试,才发现这个片片根本没有 DAC = =! 好吧,尴尬,后来查了下 L 系列确实都没有 DAC。 STM32L0: STM32L0 系列都没有 DAC。(ST产品线一直在完善,也可能是我自己不知道有,有错误请指出!) 那么想着就用 STM32F103 系列把,然后又查了下资料,48pin 的STM32F103C系列 也没有 DAC ,自己最常用的两款芯片都没有,网上也没有直接说哪些有哪些没有的,只能去找 ST 的资料看看,果然在某份文档中找到了。 STM32F103: STM32F103 系
[单片机]
<font color='red'>STM32</font>系列<font color='red'>DAC</font>的基本使用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved