历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2020年12月24日 | STM32 DAC详解

2020-12-24 来源:eefocus

上一篇介绍了《STM32ADC详解》,既然有模拟转数字的ADC模块,那么就必然有数字转模拟的DAC模块。顾名思义,该模块仅具有ADC的补充功能。它将数字二进制值转换为模拟电压输出。DAC模块具有多种用途,包括音频生成,波形生成等。通常在大多数8位微控制器中,此模块不可用,并且通过脉宽调制(PWM)可以稍微满足其需求。部分原因是由于它们的硬件资源和运行速度相对较低。所有STM32单片机都具有PWM模块,但大容量STM32也具有DAC模块。STM32DAC模块不是很复杂,并且在工作原理方面与ADC模块相似。

01、DAC简介

从STM32F207数据手册看到,STM32F207具有两个DAC模块。

每个DAC具有独立的通道,对应的GPIO分别为:PA4和PA5。对于GPIO的复用功能(Alternatefunctions)和附加功能(Additionalfunctions),在《STM32ADC详解》有详细讲解。

除了DAC输出的管脚,还有其他相关引脚

注意:使能DAC 通道x 后,相应GPIO 引脚(PA4 或PA5)将自动连接到模拟转换器输出(DAC_OUTx)。为了避免寄生电流消耗,应首先将PA4 或PA5 引脚配置为模拟模式(AIN)。

下面的简化框图显示了STM32DAC模块的主要组件。

02、DAC转换

由框图可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器写入数据,而是通过DHRx间接地传给DORx寄存器,实现对DAC的输出控制。

不能直接对寄存器DAC_DORx写入数据,任何输出到DAC通道x的数据都必须写入DAC_DHRx寄存器(数据实际写入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。

  1. 如果没有选中硬件触发(寄存器DAC_CR1的TENx位置0),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx;

  2. 如果选中硬件触发(寄存器DAC_CR1的TENx位置1),数据传输在触发发生以后3个APB1时钟周期后完成。

一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。

DAC控制寄存器(DAC_CR)

     DMAEN1:DAC通道1DMA使能(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 generationenable)我们也没用到故也设置为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。

03、功能说明

STM32的DAC等效电路如下

该电路中显示的输出缓冲器在内部3.3V电源上运行。与大多数运放在单电源(而不是+/-双电源)上运行一样,输出摆幅永远不会真正达到目标。但是,如电路所示,有两个内部开关(S1和S2)可通过寄存器控制。将它们都打开将通过两个串联的电阻(Ra和Rb)将“DACINT”信号直接连接到“DACOUT”引脚。作为参考,Ra+ Rb约为15k。

 

根据选择的配置模式,数据按照下文所述写入指定的寄存器:

单DAC通道x,有3种情况:

  1. 8位数据右对齐:用户须将数据写入寄存器DAC_DHR8Rx[7:0]位(实际是存入寄存器DHRx[11:4]位);

  2. 12位数据左对齐:用户须将数据写入寄存器DAC_DHR12Lx[15:4]位(实际是存入寄存器DHRx[11:0]位);

  3. 12位数据右对齐:用户须将数据写入寄存器DAC_DHR12Rx[11:0]位(实际是存入寄存器DHRx[11:0]位)。

一般采用第三种方式:12位数据右对齐比较多。

根据对DAC_DHRyyyx寄存器的操作,经过相应的移位后,写入的数据被转存到DHRx寄存器中(DHRx是内部的数据保存寄存器x)。随后,DHRx寄存器的内容或被自动地传送到DORx寄存器,或通过软件触发或外部事件触发被传送到DORx寄存器。

双DAC通道,有3种情况:

  1. 8位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR8RD[7:0]位(实际是存入寄存器DHR1[11:4]位),将DAC通道2数据写入寄存器DAC_DHR8RD[15:8]位(实际是存入寄存器DHR2[11:4]位);

  2. 12位数据左对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12LD[15:4]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12LD[31:20]位(实际是存入寄存器DHR2[11:0]位);

  3. 12位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12RD[11:0]位(实际是存入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12RD[27:16]位(实际是存入寄存器DHR2[11:0]位)。

04、DAC输出电压

当DAC的参考电压位VREF+的时候,数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。

任一DAC通道引脚上的输出电压满足下面的关系:

DAC输出= VREF x (DOR / 4095)。

注意:此时数据格式:应该选择12位数据右对齐。

05、代码配置

DAC配置


void DAC1_Config(void)

{

  DAC_InitTypeDef  DAC_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

  

  /* DMA1 clock and GPIOA clock enable (to be used with DAC) */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

  

  /* DAC Periph clock enable */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

  

  /* DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  

   /* DAC channel2 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 Channel2 */

  DAC_Cmd(DAC_Channel_1, ENABLE);

}

设置输出电压


//设置通道1输出电压

//vol:0~3300,代表0~3.3V

void Dac1_Set_Vol(uint16_t vol)

{

  double temp=vol;

  temp/=1000;

  temp=temp*4096/3.3;

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

}

测试用例很简单,就是反复输出1.2V和3.0V电压


 while (1)

  {

    GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯

    Dac1_Set_Vol(1200);

    LCD_ShowString(0,0,"DAC OUT 1.2V");

    Delay(500);                      //延时500ms

    GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯

    Dac1_Set_Vol(3000);

    LCD_ShowString(0,0,"DAC OUT 3.0V");

    Delay(500);                      //延时500ms

  }

下载验证

上一篇:STM32 SDIO详解

下一篇:STM32 ADC详解

推荐阅读

史海拾趣

旌芯半导体(GN)公司的发展小趣事

机顶盒,全称数字视频变换盒(Set Top Box,简称STB),是连接电视机与外部信号源的关键设备。它不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能将这些信号转换成适合电视机播放的格式,极大地丰富了电视节目的选择,提升了观看体验。

从技术层面看,机顶盒具备强大的媒体处理能力和交互功能。它能接收高清乃至4K的超高清电视节目,并通过内置的解码器将数字信号转换为电视可识别的视频和音频流,实现细腻的画面和震撼的音效。此外,机顶盒还支持数据广播、电子节目指南(EPG)、因特网接入、视频点播等多种增值服务,使电视机成为了一个互动的智能终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。智能化技术如人工智能(AI)的集成,使机顶盒具备了语音助手、智能推荐等功能,为用户提供了更为便捷、智能的使用体验。同时,云计算和边缘计算技术的应用,也进一步提升了内容分发和管理的效率。

综上所述,机顶盒作为连接电视与外部世界的桥梁,不仅是现代家庭娱乐不可或缺的一部分,也是推动数字电视技术发展的重要力量。随着技术的持续进步和市场需求的不断增长,机顶盒的未来将更加丰富多彩,为用户提供更加优质、便捷的观影体验。

Deutronic Elektronik GmbH公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Deutronic Elektronik GmbH始终坚持创新驱动和可持续发展的理念。公司不断推出新产品、新技术和新服务,以满足客户的不断变化的需求。同时,公司也注重环境保护和可持续发展,积极推广绿色能源和环保技术,为社会和环境做出了积极贡献。

Astec [Astec America, Inc]公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,Astec开始积极寻求市场拓展的机会。公司不仅加大了在国内市场的宣传力度,还通过参加国际电子展会等方式,将产品推向了国际市场。同时,Astec还注重品牌形象的建立,通过提供优质的产品和服务,逐渐树立了良好的品牌形象。

Ceramics公司的发展小趣事

“全球陶瓷”公司凭借其卓越的产品质量和国际化战略,成功拓展了海外市场。该公司积极参与国际展览和交流活动,与多国电子企业建立了合作关系。同时,全球陶瓷还针对不同国家和地区的市场需求,推出了定制化的陶瓷电子材料解决方案。这一国际化战略不仅提升了公司的品牌影响力,也为其在全球范围内的业务拓展提供了有力支持。

GE Solid State公司的发展小趣事
在搭建完成后,对电路进行调试和优化,确保声音信号能够准确反映曝光量的变化。
Aristo-Craft/ L M P Inc公司的发展小趣事

面对未来电子行业的快速发展和变革,Aristo-Craft/L M P Inc制定了明确的战略规划。他们将继续加大在研发和创新方面的投入,推出更多具有创新性和竞争力的产品。同时,公司还将积极拓展新的应用领域和市场,寻求更多的合作机会,以实现更加广泛的发展。

请注意,这些故事仅为概述性的框架,并非具体的事实描述。如果您需要更详细、具体的故事内容,建议查阅Aristo-Craft/L M P Inc公司的官方资料、新闻报道或行业分析报告等,以获取更准确的信息。

问答坊 | AI 解惑

新建楼宇防雷电设计

根据5月16日颁布实施的《厦门市建设项目防雷工程设计审核规定(试行)》(以下简称《规定》(试行)),今后所有新建、改建、扩建建设项目在设计审核和竣工验收时,建设方都必须向审核、验收部门提供单独列出的防雷设计专篇。昨日上午,市气象局召 ...…

查看全部问答>

成批量的买件,你习惯去哪里

设计好一套电路板,需要购买器件,大家一般都去哪里买啊,网上还是当地电子市场。派睿,艾睿还是其他的,大家说说啊…

查看全部问答>

nrf905在凌阳61上的问题!!大家帮帮忙!急啊

#include \"SPCE061A.H\" #include \"math.h\" #include \"bit.h\"   //位操作            1.8.4版 #define  uchar  unsigned char #define LED     & ...…

查看全部问答>

SMbus 总线与 I2C总线有什么区别?

同一个设备EEPROM,接在I2C总线上,和连在SM bus上,写驱动时有什么差别吗? 以前写过I2C主控制器的驱动, 现在要写一个SM bus控制器的驱动,二者有什么差别啊? …

查看全部问答>

MMU地址映射问题

各位大侠好! 小弟最近在调试wince5.0的bootloader时遇到了问题,是这样的:cpu是ATMEL9261(926ej-s),在startup.s中没有启用MMU之前程序运行很好!但是当执行完mcr      p15, 0, r1, c1, c0, 0 后,灯也没亮,程序就飞了,请大家赐教 ...…

查看全部问答>

晶振的问题

我用了一个有源的晶阵 是5v电压供电的那一种 输出是ttl电平 可是我下面接了一个非门 可是没有输出啊 是不是驱动能力不构 如何提高呢 感谢啊…

查看全部问答>

关于CCS的限制问题

我的仿真器附带光盘上有一个CCSv4,上面说是32K限制版,这个32K指的是存储器的大小吗?假如我想使用TMS320F28035中的128K的Flash,能用吗?…

查看全部问答>

单电源边双电源?

单电源变双电源的原理是什么?能给个电路吗 6v电池到正负5v的? 谢谢…

查看全部问答>

用51单片机进行控制射进简易计算器

通过Proteus与keil C的方针联调设计一个简易计算器,计算器可实现6位整数的四则运算,由LED数码显示运算数据以及结果,其中出发运算无需实现小数部分。   QQ 261246707欢迎交流 现在编程方面有一些问题 希望大家给点帮助…

查看全部问答>

日企PCB专业LAYOUT工作经验6年,求兼职

本人日企PCB专业LAYOUT工作经验6年,有2-10层基板级设计经验,有丰富EMC、SI,EMI,ESD,PI设计经验,现求兼职PCB LAYOUT,有意请:ximigac@163.com…

查看全部问答>