历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2021年03月23日 | STM32之DAC君

2021-03-23 来源:eefocus

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


鉴赏过之后、我们来看看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模块,写了这篇文章、看着面前的一大堆书:数据结构,算法导论、通信原理、计算机控制等、、总想让自己在毕业之前多学习,多学些知识、可以看出、这篇文章的幽默是少了很多、、但我觉得不影响这篇博客的质量

推荐阅读

史海拾趣

Allied Controls Incorporated公司的发展小趣事

Allied Controls Incorporated(ACI)是一家专注于设计和制造温度传感器和控制器的公司,以下是其发展历程的五个相关故事:

  1. 创立和早期发展: Allied Controls Incorporated成立于1983年,总部位于美国新泽西州。公司的创始人是一群对温度控制技术充满热情的工程师和企业家。起初,ACI专注于为工业和商业应用提供高品质的温度传感器和控制器。通过不断提高产品质量和性能,公司逐渐赢得了客户的信任和好评,实现了良好的初期发展。

  2. 技术创新与产品优化: 随着市场需求的变化和技术的发展,ACI不断进行技术创新,并不断优化其产品线。公司投入大量资源用于研发新型温度传感器和控制器,以满足不同行业的需求。ACI的工程团队与客户紧密合作,根据客户的反馈和需求不断改进产品设计和性能,确保产品的质量和可靠性。

  3. 扩大市场份额: 随着业务的稳步增长,ACI逐渐扩大了其市场份额,涵盖了更多的行业和应用领域。除了工业和商业应用外,公司还开始进军医疗、航空航天、汽车和消费电子等领域。通过开发定制化解决方案和与行业领先企业合作,ACI成功地拓展了其市场份额,并在各个行业中树立了良好的声誉。

  4. 国际市场拓展: 除了在美国市场取得成功外,ACI还积极拓展国际市场。公司与全球各地的合作伙伴建立了稳固的合作关系,拓展了产品的销售网络。ACI的产品出口到欧洲、亚洲和其他地区,赢得了国际客户的青睐和认可。通过不断开拓国际市场,ACI进一步巩固了其在全球温度传感器和控制器领域的领先地位。

  5. 持续创新和发展: 作为一家技术驱动型公司,ACI致力于持续创新和发展。公司不断投入研发和技术改进,推出更加先进和高性能的产品。ACI的工程团队不断探索新的技术和解决方案,以满足客户日益增长的需求。通过不断创新和发展,ACI得以在电子行业中保持竞争优势,并为客户提供更加可靠和高效的温度控制解决方案。

Clover Display Limited公司的发展小趣事

随着中国内销市场的不断扩大,Clover Display Limited看到了巨大的商机。为了更好地服务中国内销客户,公司在2001年在深圳南山区成立了高华电子显示(深圳)有限公司。这家子公司以独资经营方式运作,可以开具增值税发票,以人民币结算,从而更加便捷地服务中国客户。深圳子公司的成立不仅拓宽了公司的销售渠道,也为其在中国市场的进一步发展奠定了坚实基础。

Advanced Pressure Technology公司的发展小趣事

APT公司的成功引起了业界的广泛关注。2007年5月,日本上市公司SMC对APT公司进行了战略收购。这一收购不仅为APT公司提供了更强大的资金和技术支持,也为其未来的发展注入了新的活力。虽然被收购,但APT公司仍然保持其独立运作的特色,继续专注于气体输送技术的研发和生产。在SMC的支持下,APT公司得以进一步扩大生产规模、提升技术水平,并持续推出更多创新产品。

爱特姆(ATOM)公司的发展小趣事

随着电子行业的快速发展,爱特姆不断加大对技术研发的投入,致力于推出更先进、更稳定的连接器产品。公司成功研发出一系列具有自主知识产权的新产品,不仅提升了产品的性能和质量,也进一步巩固了其在行业内的领先地位。

CTC Coils Ltd公司的发展小趣事

随着国内市场的逐渐饱和,CTC Coils Ltd公司开始将目光投向海外市场。公司首先在欧洲设立了销售分支机构,通过参加国际电子展会、与当地企业建立合作关系等方式,逐步打开了欧洲市场。随后,公司又进一步拓展到北美和亚洲其他地区,实现了业务的国际化布局。

华润华晶公司的发展小趣事

随着国内市场的逐渐饱和,CTC Coils Ltd公司开始将目光投向海外市场。公司首先在欧洲设立了销售分支机构,通过参加国际电子展会、与当地企业建立合作关系等方式,逐步打开了欧洲市场。随后,公司又进一步拓展到北美和亚洲其他地区,实现了业务的国际化布局。

问答坊 | AI 解惑

NRF24L01无线模块发射程序

最近从网上下了一NRF24L01无线模块发射程序,改了一下,准备用AT89S51单片机控制,但是运行之后没有反应(不知道模块是否正常运行)。麻烦大家给看一下问题出在哪,程序如下: #include #include #include \"api.h\" /********************** ...…

查看全部问答>

做linux驱动的迷茫啊!(不是技术问题)希望前人指引方向!

    我今年毕业,去了一家很大的公司去做嵌入式Linux驱动,公司很好、很大,但是当我去实习时发现,公司的驱动已经做得很成熟了,而且公司的产品更新换代很慢,几乎驱动是不用改的,所以感觉进这样的公司没办法去得到实践,是不是在这样 ...…

查看全部问答>

远程视频监控的PCB设计问题

请问各位大大,关于DSP远程无线视频监控的的6层PCB电路板设计,其中多层电路板如何分层,在另外想询问一下,哪里能下到TI公司的TMS320DM647的电路原理图和元件封装!…

查看全部问答>

重金请高手帮忙 嵌入式数据

本人急需嵌入式数据应用程序。需要实现下列功能: 基于Windows CE的应用程序可以捕获来自于用户串口数据,并将它们存储在设备上的SQL Server CE数据库中,然后应用程序可以周期性地将SQL Server CE 数据库中的数据通过http上载到SQL Server上的数 ...…

查看全部问答>

贴片电容 没标容值怎么判断其大小?谢谢!!!越详细越好最好附图

贴片电容 没标容值怎么判断其大小?谢谢!!!越详细越好最好附图…

查看全部问答>

如何在VxWorks中添加应用程序!

我在usrApp中添加应用程序后总是在编译时出现 dld: warning: Undefined symbol \'IVEC_TO_INUM\' in file \'partialImage.o\' dld: Undefined symbols found - no output written 不知道是怎么回事?…

查看全部问答>

如何得到某个usb接口上的U盘的盘符?

举个例来说明这个问题,假设一台PC上有编号1、2、3、4的4个usb port,分别插入4支u盘,我如何用程序来实现:得到编号x的usb port上U盘盘符?    因为插入u盘的次序不同,某个usb port上的U盘盘符可能会变化,如果按顺序插入U盘,编号1、 ...…

查看全部问答>

做个ARM系统,片内有64KRAM,还需要再外接一个RAM吗?

用STM32F103zet6做个zigbee手抄器板子,cpu内部有64k的ram,还需要再外接一个ram吗?…

查看全部问答>

毕业生求职该报以怎样的心态

实习过后,无论有没有拿到自己期望的OFFER,进入职场是无论如何也避免不了的。而初入职场,无论是有过实习经历的大学生,还是从未实习过的大学生,都不可避免的遇到一个心态转变的问题,也就是职业心态的培养问题。   由于之前没有真正进入过职 ...…

查看全部问答>

出手头几块开发板,全新,附链接

出手头几块开发板,全新。 1、黑金Cyclone II开发板,item.taobao.com/item.htm?spm=a1z10.1.11.8.4165ef&id=7463768228,黑金官方店的链接,配置需要的应该清楚,就不详细说了。一般价格660元,准备450出手。    2、micro2440 arm9开 ...…

查看全部问答>