大佬们 捷德奥特曼12资源第17集百度云资源免费的 啊有?谢谢大佬求告知

后使用快捷导航没有帐号?
查看: 3472|回复: 2
第10/15原创:事无巨细,DAC应用
在线时间426 小时
威望2149分
芯币3883枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2149, 距离下一级还需 1351 积分
五彩晶圆(初级), 积分 2149, 距离下一级还需 1351 积分
本帖最后由 dontium 于
13:10 编辑 事无巨细,DAC应用
大家虎年大吉,我们继续来学习AVR Mega16单片机,年后的第一篇,我们来学习DAC。DAC,英文全称是digital-to-analog converter,即数字模拟转换器,简称数模转换。与ADC刚好相反,DAC是把数字量转变成模拟量的器件。
我们处在一个数字时代,而我们的视觉、听觉、感觉、嗅觉等所感知的却是一个模拟世界。如何将数字世界与模拟世界联系在一起,正是模拟数字转换器(ADC)和数字模拟转换器(DAC)大显身手之处。任何一个信号链系统,都需要传感器来探测来自模拟世界的电压、电流、温度、压力等信号。这些传感器探测到的信号量被送到放大器中进行放大,然后通过ADC把模拟信号转化为数字信号,经过处理器、DSP或FPGA信号处理后,再经由DAC还原为模拟信号。所以ADC和DAC在信号链的框架中起着桥梁的作用,即模拟世界与数字世界的一个接口。
DAC的原理稍微有点复杂,下面我列出一段话,如果无法理解,可以暂时跳过,不理解原理不一定会影响我们对DAC的简单应用:
DAC主要由数字寄存器、模拟电子开关、位权网络、求和运算放大器和基准电压源(或恒流源)组成。用存于数字寄存器的数字量的各位数码,分别控制对应位的模拟电子开关,使数码为1 的位在位权网络上产生与其位权成正比的电流值,再由运算放大器对各电流值求和,并转换成电压值。
我讲点个人的理解,不准确但是有助于建立一个思维模型:上述的模拟电子开关都分别接着一个分压的器件,比如说电阻。模拟开关的个数取决于DAC的精度。那么N个电子开关就把基准电压分为N份(并不是平均分哦),而这些开关根据输入的二进制每一位数据对应开启或者关闭,把分压的器件上的电压引入输出电路中。
但是如果无论如何你都不明白的话,请保持参考电压的值符合器件要求,并且尽可能的稳定。
DAC有几个必须要懂得的参数:
1.转换精度 :
在DAC中一般用分辨率和转换误差来描述转换精度。
一般用 DAC 的位数来衡量分辨率的高低,因为位数越多,其输出电压V的取值个数(2^n个)就越多,也就越能反映出输出电压的细微变化,分辨能力就越高。
此外,也可以用DAC能分辨出来的最小输出电压1 LSB与最大输出电压FSR之比定义分辨,即:
该值越小,分辨率越高。
2>.转换误差
转换误差是指实际输出的模拟电压与理想值之间的最大偏差。常用这个最大偏差与FSR之比的百分数或 若干个LSB表示。实际上它是三种误差的综合指标。
2.转换速度
转换速度一般由建立时间决定。从输入由全0突变为全1时开始,到输出电压稳定在FSR±½ LSB范围(或以FSR±x%FSR指明范围)内为止,这段时间称为建立时间,它是DAC的最大响应时间,所以用它衡量转换速度的快慢。
CEPARK AVR开发板上集成了TLC5615数字模拟转换器,10位精度,两倍参考电压输出,支持SPI协议,只需要外接三个IO口便可以控制。以下是原理图:
如图所见:
DIN:串行数据输入口,在这个引脚输入我们想要输出的模拟电压的数字量;
SCLK:时钟信号输入口,在这个引脚产生数据传输时钟,每一次下降沿写入数据
CS:片选端,低电平有效。
DOUT:串行数据输出口,用于级联,本例不使用,所以不做论述。
首先说这个时序图并不是非常的清晰,我一开始看的时候也看不太明白,于是找来下面这样一段话:
“由时序图可以看出,当片选CS为低电平时,输入数据DIN由时钟SCLK同步输入或输出,而且最高有效位在前,低有效位在后。输入时SCLK的上升沿把串行输入数据DIN移入内部的16位移位寄存器,SCLK的下降沿输出串行数据DOUT,片选CS的上升沿把数据传送至DAC寄存器。
当片选CS为高电平时,串行输入数据部能由时钟同步送入移位寄存器;输出数据DOUT保持最近的数值不变而不进入高阻态。由此想要串行输入数据和输出数据必须满足两个条件:第一时钟SCLK的负跳变;第二片CS为低电平。这里,为了使时钟的内部馈通最小,当片选CS为高电平时,输入时钟SCLK应当为低电平。”
再附上详细注释的程序和器件资料,感谢这些资料的作者(请下载附件):
照旧的提取一些关键点:
★首先是端口设置,“为了使时钟的内部馈通最小,当片选CS为高电平时,输入时钟SCLK应当为低电平。”
★TLC5615是10位精度DAC,所以写入的最大数据为(2^10-1),就是1023,所以定义DAC写数据函数的时候,注意输入数据最好是unsigned int的,而不是unsigned char。
★写入的数据是从最高位开始,但是要知道unsigned int是16位宽度,所以我们写入数据的最高位并不是在16位宽度的最左边,所以程序中,先将数据左移6位,将最高位在16位宽度里左对齐。
★因为写入的数据是16位形式,所以分离数据时也要用16位数据分离,即(&0x8000),这个与我们常用的8位器件有区别。
★器件资料里面提到,如果不用TLC5615的级联方式,则需要在写入10位数据之后连续写入两个0数据。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
<p id="rate_222" onmouseover="showTip(this)" tip="加油&威望 + 10 分
" class="mtn mbn">
在线时间42 小时
威望20177分
芯币6246枚
TA的帖子TA的资源
裸片初长成(中级), 积分 20177, 距离下一级还需 9823 积分
裸片初长成(中级), 积分 20177, 距离下一级还需 9823 积分
等着楼主更新 哈哈 相当赞赏这种分享的感觉
DIY是一种信仰~~
在线时间2 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
一粒金砂(中级), 积分 142, 距离下一级还需 58 积分
谢谢楼主分享~!
Powered by
逛了这许久,何不进去瞧瞧?& & & 由于DAC7512串行数模转换器可选择供电电源来作为参考电压,因而具有很宽动态输出范围,此外,DAC7512数模转换器还具有三种关断工作模式。正常工作状态下,DAC7512在5V电压下功耗仅为0.7mW,而省电状态下功耗为1&W。因此,低功耗DAC7512无疑是便携式电池供电设备理想器件。
& & & DAC7512组成框图如图1所示。图中输入控制逻辑用于控制DAC寄存器写操作,掉电控制逻辑与网络一起用来设置器件工作模式,即选择正常输出还是把输出端与缓冲放大器断开,而接入固定电阻。芯片内缓冲放大器具有满幅输出特性,可驱动2k&O及1000pF并联。
图1 DAC7512结构图
& & & DAC7512主要特点如下:
& & & ●微功耗,5V时工作消耗为135&A(DAC7512);
& & & ●在掉电模式时,如果采用5V电源供电,其电流消耗为135nA,而采用3V供电时,其电流消耗仅为50nA;
& & & ●供电电压范围为+2.7V~+5.5V;
& & & ●上电输出复位后输出为0V;
& & & ●具有三种关断工作模式可供选择,5V电压下功耗仅为0.7mW;
& & & ●带有低功耗施密特输入串行接口;
& & & ●内置满幅输出缓冲放大器;
& & & ●具有SYNC中断保护机制。
图2 DAC7512引脚图及引脚说明
& & & 接口工作模式
& & & DAC7512采用三线制(/SYNC,SCLK及Din)串行接口。其串行写操作时序如图3所示。写操作开始前,/SYNC要置低,Din数据在串行时钟SCLK下降沿依次移入16位寄存器。在串行时钟第16个下降沿到来时,将最后一位移入寄存器,可实现对工作模式设置及DAC内容刷新,从而完成一个写操作。此时,/SYNC可保持低或置高,但在下一个写周期开始前,/SYNC必须转为高电平并至少保持33ns?以便/SYNC有时间产生下降沿来启动下一个写周期。若/SYNC在一个写周期内转为高电平,则本次写操作失败,寄存器强行复位。由于施密特在/SYNC高电平时电流消耗大于低电平时电流消耗,因此,在两次写操作之间,应把/SYNC置低以降低功耗。
图3 DAC7512写时序图
& & & DAC7512片内移位寄存器宽度为16位,其中DB15、DB14是空闲位,DB13、DB12是工作模式选择位、DB11~DB0是数据位。器件内部带有上电复位电路。上电后,寄存器置0,所以DAC7512处于正常工作模式,模拟输出电压为0V。
& & & DAC7512四种工作模式可由寄存器内DB13、DB12来控制。其控制关系如下图所示:
DAC7512的工作模式
掉电模式下,不仅器件功耗要减小,而且缓冲放大器的输出级通过内部电阻网络接到1k&O、100k&O或开路。而处于掉电模式时,所有的线性电路都断开,但寄存器内的数据不受影响。
& & & 与接口
& & & DAC微控制器接口如图4所示。图中,8051TXD驱动DAC7512 SCLK,而RXD则驱动DAC7512串行数据线。设计时可用8051一个I/O位(如P3.3)作为/SYNC信号。在数据传输期间,P3.3要保持低电平。由于8051TXD脚输出时是低位在前,而DAC7512片内寄存器接收时是高位在前,故在传送数据前,应当用软件把数据调整好。
图4 DAC7512与51单片机的连接
& & & 由于8051一次只能传输8位数据。因此,在一个写周期内,应当用8个时钟在其下降沿把数据写入DAC7512。写数据时,MSB在前。由于DAC7512内有16位寄存器,故在写完第一个字节后,P3.3仍然要保持低电平,以便传输第二个字节。
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民???或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&21ic官方微信-->
后使用快捷导航没有帐号?
查看: 490|回复: 12
&&已结帖(0)
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
& & & & STM32F4的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压Vref+(通ADC共用)以获得更精确的转换结果。 & & & & STM32F4的DAC模块主要特点有: & & & & ① 2个DAC转换器:每个转换器对应1个输出通道&&& & & & ② 8位或者12位单调输出&&& & & & ③ 12位模式下数据左对齐或者右对齐&&& & & & ④ 同步更新功能&&& & & & ⑤ 噪声波形生成&&& & & & ⑥ 三角波形生成&&& & & & ⑦ 双DAC通道同时或者分别转换 & & & & ⑧ 每个通道都有DMA功能&&& & & & 单个DAC通道的框图如图26.1.1所示:& & & &
& & & &&&& & & & 图26.1.1 DAC通道模块框图 & & & & 图中VDDA和VSSA为DAC模块模拟部分的供电,而Vref+则是DAC模块的参考电压。DAC_OUTx就是DAC的输出通道了(对应PA4或者PA5引脚)。 & & & & 从图26.1.1可以看出,DAC输出是受DORx寄存器直接控制的,但是我们不能直接往DORx寄存器写入数据,而是通过DHRx间接的传给DORx寄存器,实现对DAC输出的控制。前面我们提到,STM32F4的DAC支持8/12位模式,8位模式的时候是固定的右对齐的,而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通道1,采用12位右对齐格式,所以采用第③种情况。 & & & & 如果没有选中硬件触发(寄存器DAC_CR1的TENx位置’0’),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。如果选中硬件触发(寄存器DAC_CR1的TENx位置’1’),数据传输在触发发生以后3个APB1时钟周期后完成。一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间file://C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image004.jpg之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。我们可以从STM32F407ZGT6的数据手册查到file://C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image004.jpg的典型值为3us,最大是6us。所以DAC的转换速度最快是333K左右。 & & & & 本章我们将不使用硬件触发(TEN=0),其转换的时间框图如图26.1.2所示: & & & &
& & & & 图26.1.2 TEN=0时DAC模块转换时间框图 & & & & 当DAC的参考电压为Vref+的时候,DAC的输出电压是线性的从0~Vref+,12位模式下DAC输出电压与Vref+以及DORx的计算公式如下: & & & & DACx输出电压=Vref*(DORx/4095) & & & & 接下来,我们介绍一下要实现DAC的通道1输出,需要用到的一些寄存器。首先是DAC控制寄存器DAC_CR,该寄存器的各位描述如图26.1.3所示: & & & &
& & & & 图26.1.3 寄存器DAC_CR各位描述 & & & && && &&&DAC_CR的低16位用于控制通道1,而高16位用于控制通道2,我们这里仅列出比较重要的最低8位的详细描述,如图26.1.4所示: & & & &
& & & & 图26.1.4 寄存器DAC_CR低八位详细描述 & & & && && &&&首先,我们来看DAC通道1使能位(EN1),该位用来控制DAC通道1使能的,本章我们就是用的DAC通道1,所以该位设置为1。 & & & && && &&&再看关闭DAC通道1输出缓存控制位(BOFF1),这里STM32F4的DAC输出缓存做的有些不好,如果使能的话,虽然输出能力强一点,但是输出没法到0,这是个很严重的问题。所以本章我们不使用输出缓存。即设置该位为1。 & & & && && &&&DAC通道1触发使能位(TEN1),该位用来控制是否使用触发,里我们不使用触发,所以设置该位为0。 & & & && && &&&DAC通道1触发选择位(TSEL1[2:0]),这里我们没用到外部触发,所以设置这几个位为0就行了。 & & & && && &&&DAC通道1噪声/三角波生成使能位(WAVE1[1:0]),这里我们同样没用到波形发生器,故也设置为0即可。 & & & && && &&&DAC通道1屏蔽/复制选择器(MAMP[3:0]),这些位仅在使用了波形发生器的时候有用,本章没有用到波形发生器,故设置为0就可以了。 & & & && && &&&最后是DAC通道1 DMA使能位(DMAEN1),本章我们没有用到DMA功能,故还是设置为0。 & & & && && &&&通道2的情况和通道1一模一样,这里就不不细说了。在DAC_CR设置好之后,DAC就可以正常工作了,我们仅需要再设置DAC的数据保持寄存器的值,就可以在DAC输出通道得到你想要的电压了(对应IO口设置为模拟输入)。本章,我们用的是DAC通道1的12位右对齐数据保持寄存器:DAC_DHR12R1,该寄存器各位描述如图26.1.5所示: & & & &
& & & & 图26.1.5 寄存器DAC_DHR12R1各位描述
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
该寄存器用来设置DAC输出,通过写入12位数据到该寄存器,就可以在DAC输出通道1(PA4)得到我们所要的结果。 & & & && && &&&通过以上介绍,我们了解了STM32F4实现DAC输出的相关设置,本章我们将使用DAC模块的通道1来输出模拟电压。这里我们用到的库函数以及相关定义分布在文件stm32f4xx_dac.c以及头文件stm32f4xx_dac.h中。实现上面功能的详细设置步骤如下:&&& & & & 1)开启PA口时钟,设置PA4为模拟输入。 & & & & STM32F407ZGT6的DAC通道1是接在PA4上的,所以,我们先要使能GPIOA的时钟,然后设置PA4为模拟输入。 & & & & 这里需要特别说明一下,虽然DAC引脚设置为输入,但是STM32F4内部会连接在DAC模拟输出上,这在我们引脚复用映射章节有讲解。 & & & &&&RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 & & & && && & & &&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; & & & &&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入 & & & &&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉 & & & &&&GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 & & & & 对于DAC通道与引脚对应关系,这在STM32F4的数据手册引脚表上有列出,如下图:& & & &
& & & & 图26.1.6 DAC通道引脚对应关系 & & & & 2)使能DAC1时钟。 & & & & 同其他外设一样,要想使用,必须先开启相应的时钟。STM32F4的DAC模块时钟是由APB1提供的,所以我们先要在通过调用函数RCC_APB1PeriphClockCmd来使能DAC1时钟。&&& & & &&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC时钟 & & & & 3)初始化DAC,设置DAC的工作模式。 & & & & 该部分设置全部通过DAC_CR设置实现,包括:DAC通道1使能、DAC通道1输出缓存关闭、不使用触发、不使用波形发生器等设置。这里DAC初始化是通过函数DAC_Init完成的:void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);复制代码跟前面一样,首先我们来看看参数设置结构体类型DAC_InitTypeDef的定义: typedef struct
&&uint32_t DAC_T
&&uint32_t DAC_WaveG
&&uint32_t DAC_LFSRUnmask_TriangleA
&&uint32_t DAC_OutputB
}DAC_InitTypeD 复制代码
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
这个结构体的定义还是比较简单的,只有四个成员变量,下面我们一一讲解。
第一个参数DAC_Trigger用来设置是否使用触发功能,前面已经讲解过这个的含义,这里我们不是用触发功能,所以值为DAC_Trigger_None。
第二个参数DAC_WaveGeneratio用来设置是否使用波形发生,这里我们前面同样讲解过不使用。所以值为DAC_WaveGeneration_None。
第三个参数DAC_LFSRUnmask_TriangleAmplitude用来设置屏蔽/幅值选择器,这个变量只在使用波形发生器的时候才有用,这里我们设置为0即可,值为DAC_LFSRUnmask_Bit0。
第四个参数DAC_OutputBuffer是用来设置输出缓存控制位,前面讲解过,我们不使用输出缓存,所以值为DAC_OutputBuffer_Disable。到此四个参数设置完毕。看看我们的实例代码: DAC_InitTypeDef DAC_InitT& && &
DAC_InitType.DAC_Trigger=DAC_Trigger_N& & //不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_N//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_D& & //DAC1输出缓存关闭
DAC_Init(DAC_Channel_1,&DAC_InitType);& & //初始化DAC通道1 复制代码
4)使能DAC转换通道
初始化DAC之后,理所当然要使能DAC转换通道,库函数方法是: DAC_Cmd(DAC_Channel_1, ENABLE);&&//使能DAC通道1 复制代码
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
5)设置DAC的输出值。
通过前面4个步骤的设置,DAC就可以开始工作了,我们使用12位右对齐数据格式,所以我们通过设置DHR12R1,就可以在DAC输出引脚(PA4)得到不同的电压值了。设置DHR12R1的库函数是:DAC_SetChannel1Data(DAC_Align_12b_R, 0);&&//12位右对齐数据格式设置DAC值复制代码
第一个参数设置对齐方式,可以为12位右对齐DAC_Align_12b_R,12位左对齐
DAC_Align_12b_L以及8位右对齐DAC_Align_8b_R方式。
第二个参数就是DAC的输入值了,这个很好理解,初始化设置为0。
这里,还可以读出DAC对应通道最后一次转换的数值,函数是:DAC_GetDataOutputValue(DAC_Channel_1);复制代码
设置和读出一一对应很好理解,这里就不多讲解了。
最后,再提醒一下大家,本例程,我们使用的是3.3V的参考电压,即Vref+连接VDDA。
通过以上几个步骤的设置,我们就能正常的使用STM32F4的DAC通道1来输出不同的模拟电压了。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
26.2 硬件设计 & & & & 本章用到的硬件资源有: & & & & 1)&&指示灯DS0 & & & & 2)&&KEY_UP和KEY1按键 & & & & 3)&&串口 & & & & 4)&&TFTLCD模块 & & & & 5)&&ADC & & & & 6)&&DAC&&& & & & 本章,我们使用DAC通道1输出模拟电压,然后通过ADC1的通道1对该输出电压进行读取,并显示在LCD模块上面,DAC的输出电压,我们通过按键(或USMART)进行设置。 & & & & 我们需要用到ADC采集DAC的输出电压,所以需要在硬件上把他们短接起来。ADC和DAC的连接原理图如图26.2.1所示: & & & &
& & & & 图26.2.1 ADC、DAC与STM32F4连接原理图 & & & && && &&&P12是多功能端口,我们只需要通过跳线帽短接P14的ADC和DAC,就可以开始做本章实验了。如图26.2.2所示: & & & &
& & & & 图26.2.2 硬件连接示意图 & & & && && & & & 26.3 软件设计 & & & & 打开本章实验工程可以发现,我们相比ADC实验,在库函数中主要是添加了dac支持的相关文件stm32f4xx_dac.c以及包含头文件stm32f4xx_dac.h。同时我们在HARDWARE分组下面新建了dac.c源文件以及包含对应的头文件dac.h。这两个文件用来存放我们编写的ADC相关函数和定义。打开dac.c,代码如下: //DAC通道1输出初始化
void Dac1_Init(void)
&&GPIO_InitTypeDef&&GPIO_InitS
DAC_InitTypeDef DAC_InitT
&&RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//①使能PA时钟
&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//②使能DAC时钟
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
&&GPIO_Init(GPIOA, &GPIO_InitStructure);//①初始化GPIO
DAC_InitType.DAC_Trigger=DAC_Trigger_N //不使用触发功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_N//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
//屏蔽、幅值设置
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_D/输出缓存关闭
&&DAC_Init(DAC_Channel_1,&DAC_InitType); //③初始化DAC通道1
DAC_Cmd(DAC_Channel_1, ENABLE);&&//④使能DAC通道1
&&DAC_SetChannel1Data(DAC_Align_12b_R, 0);&&//⑤12位右对齐数据格式
//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
& && & double temp=
& && & temp/=1000;
& && & temp=temp*;
& && & DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式} 复制代码
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
& & & & 此部分代码就2个函数,Dac1_Init函数用于初始化DAC通道1。这里基本上是按我们上面的步骤来初始化的,我们用序号①~⑤已经标示这些步骤。经过这个初始化之后,我们就可以正常使用DAC通道1了。第二个函数Dac1_Set_Vol,用于设置DAC通道1的输出电压,实际就是将电压值转换为DAC输入值。 & & & & 其他头文件代码就比较简单,这里我们不做过多讲解,接下来我们来看看主函数代码: int main(void)
& && & u16
& && &u8 t=0,& &
& && & u16 dacval=0;
& && & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
& && & delay_init(168);&&//初始化延时函数
& && & uart_init(115200);& && && &//初始化串口波特率为115200
& && & LED_Init();& && && && && && && && && && &&&//初始化LED
& && &LCD_Init();& && && && && && && && && && &&&//LCD初始化
& && & Adc_Init();& && && && && && && && & //adc初始化
& && & KEY_Init();& && && && && && && && &//按键初始化
& && & Dac1_Init();& && && && && && && &&&//DAC通道1初始化& &
& && & POINT_COLOR=RED;
& && & LCD_ShowString(30,50,200,16,16,&Explorer STM32F4&);& && &
& && & LCD_ShowString(30,70,200,16,16,&DAC TEST&);& &
& && & LCD_ShowString(30,90,200,16,16,&ATOM@ALIENTEK&);
& && & LCD_ShowString(30,110,200,16,16,&&);& && &
& && & LCD_ShowString(30,130,200,16,16,&WK_UP:+&&KEY1:-&);& &
& && & POINT_COLOR=BLUE;//设置字体为蓝色& && && && &
& && & LCD_ShowString(30,150,200,16,16,&DAC VAL:&);& && && &
& && & LCD_ShowString(30,170,200,16,16,&DAC VOL:0.000V&);& && && && &
& && & LCD_ShowString(30,190,200,16,16,&ADC VOL:0.000V&);
& & DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//初始值为0& &
& && & while(1)
& && && && &&&t++;
& && && && &&&key=KEY_Scan(0);& && && && && && && &
& && && && &&&if(key==WKUP_PRES)
& && && && &&&{& && && &&&
& && && && && && && &if(dacval&4000)dacval+=200;
& && && && && && && &DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
& && && && &&&}else if(key==2)& &
& && && && &&&{
& && && && && && && &if(dacval&200)dacval-=200;
& && && && && && && &else dacval=0;
& && && && && && && &DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
& && && && &&&}& &
& && && && &&&if(t==10||key==KEY1_PRES||key==WKUP_PRES)
& && && && && && && && && && && && & //WKUP/KEY1按下了,或者定时时间到了
& && && && &&&{& && &
& && && && && && &&&adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
& && && && && && && &LCD_ShowxNum(94,150,adcx,4,16,0);& && && & //显示DAC寄存器值
& && && && && && && &temp=(float)adcx*(3.3/4096);& && && && && && && &//得到DAC电压值
& && && && && && && &adcx=
& && && && && && &&&LCD_ShowxNum(94,170,temp,1,16,0);& && && & //显示电压值整数部分
& && && && && && &&&temp-=
& && && && && && && &temp*=1000;
& && && && && && && &LCD_ShowxNum(110,170,temp,3,16,0X80);& &&&//显示电压值的小数部分
& && && && && && &&&adcx=Get_Adc_Average(ADC_Channel_5,10);& & //得到ADC转换值& && &&&
& && && && && && && &temp=(float)adcx*(3.3/4096);& && && && && && && &//得到ADC电压值
& && && && && && && &adcx=
& && && && && && &&&LCD_ShowxNum(94,190,temp,1,16,0);& && && & //显示电压值整数部分
& && && && && && &&&temp-=
& && && && && && && &temp*=1000;
& && && && && && && &LCD_ShowxNum(110,190,temp,3,16,0X80);& &&&//显示电压值的小数部分
& && && && && && && &LED0=!LED0;& && && &
& && && && && && && &t=0;
& && && && &&&}& && &&&
& && && && &&&delay_ms(10);
& && & }& &
} 复制代码此部分代码,我们先对需要用到的模块进行初始化,然后显示一些提示信息,本章我们通过KEY_UP(WKUP按键)和KEY1(也就是上下键)来实现对DAC输出的幅值控制。按下KEY_UP增加,按KEY1减小。同时在LCD上面显示DHR12R1寄存器的值、DAC设计输出电压以及ADC采集到的DAC输出电压。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
& & & & 在代码编译成功之后,我们通过下载代码到ALIENTEK探索者STM32F4开发板上,可以看到LCD显示如图26.4.1所示: & & & &
& & & & 图26.4.1 DAC实验测试图 & & & & 同时伴随DS0的不停闪烁,提示程序在运行。此时,我们通过按KEY_UP按键,可以看到输出电压增大,按KEY1则变小。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
助理工程师, 积分 1065, 距离下一级还需 935 积分
附件是代码实例
本帖子中包含更多资源
才可以下载或查看,没有帐号?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4481, 距离下一级还需 519 积分
中级工程师, 积分 4481, 距离下一级还需 519 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4481, 距离下一级还需 519 积分
中级工程师, 积分 4481, 距离下一级还需 519 积分
很详细的帖子,这种贴越多越好啊。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
主题帖子积分
专家等级:结帖率:100%打赏:9.00受赏:9.00
主题帖子积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
STM32F4的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
主题帖子积分
专家等级:结帖率:100%打赏:9.00受赏:9.00
主题帖子积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
中级工程师, 积分 4147, 距离下一级还需 853 积分
这个ADC用库函数操作很方便的。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级工程师, 积分 2577, 距离下一级还需 423 积分
初级工程师, 积分 2577, 距离下一级还需 423 积分
主题帖子积分
专家等级:结帖率:0%打赏:0.00受赏:15.10
主题帖子积分
初级工程师, 积分 2577, 距离下一级还需 423 积分
初级工程师, 积分 2577, 距离下一级还需 423 积分
第一个参数设置对齐方式,可以为12位右对齐DAC_Align_12b_R,12位左对齐
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:37.00
主题帖子积分
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
技术领袖奖章
人才类勋章
时间类勋章
坚毅之洋流
发帖类勋章
荣誉元老奖章
等级类勋章

我要回帖

更多关于 捷德奥特曼11集资源 的文章

 

随机推荐