Cortex-M3学习LPC1768 - DAC实验

2019-12-02来源: 51hei关键字:Cortex-M3  LPC1768  DAC实验

终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便把DAC再好好复习一下了,或许能品出个什么味来^_^DAC是Digital to Analog Converter的缩写,中文名就是数模转换器,D/A转换器一般由数码寄存器、模拟电子开关电路、解码网络、求和电路及基准电压等几部分组成。如下图所示:

图1-1 DAC原理框图

数字量以串行或并行方式输入,存储于数码寄存器中,数码寄存器输出的名位数码分别控制对应的模拟开关,使数码为1的位在位权网络上产生与其值成正比的电流值或电压值,再由求和电路将各权值相加,即得到数字量对应的模拟量。按解码网络结构不同可以将DAC转换器分成T          型电阻网络D/A转换器、倒T型电阻网络D/A转换器、权电流D/A转换器、权电阻网络转换器。

1、  T型电阻网络D/A转换器,其简单模型如下图所示:



图1-2 T型电阻网络D/A转换器模型

2、  倒T型电阻网络D/A转换器简易模型


图1-3 倒T型电阻网络D/A转换器

3、  权电流D/A转换器简易模型如下图所示:


图1-4  权电流D/A转换器简易模型

4、  权电阻网络转换器简易模型如下图所示:


图 1-5 权电阻网络转换器简易模型

按模拟电子开关的电路的不同,也可以将D/A转换器分为CMOS开关型D/A转换器(速度要求不高),双极型D/A转换器。而双极型D/A转换器双可以划分为电流开关型(速度要求较高)与ECL电流开关型(转换速度更高)两种。如果对欧姆定律不陌生的话,我想上面各个模型是如何输出电压的应该就可以理解了,在这里就不总结公式了,因为这只是模型,对应,实际电路与模型是有所出入的,在实际应用中要着重关注一下以下几个参数:

1、  分辨率

D/A转换器的分辨率用最小分辨电压VLSB与满量程输出电压VFSV的比值来表示:


从上式可以看出D/A转换器的分辨率只与输入二进制数的位数n有关,因此大部分情况下我们直接把n做为分辨率如8位,10位,12位等,由此我们也可以知道分辨率值越小,分辨能力越高。

2、  转换精度

在D/A转换器中,一般用转换误差来描述转换精度。DAC转换误差是指实际输出模拟电压值与理想值的最大偏差。转换误差是一个综合性的静态指标,主要由三部分构成:

1)非线性误差:一般是由于模拟电子开关的导通电阻和导通压降及R、2R电阻值的偏差引起。

2)漂移误差:一般是由于运算放大器的零点漂移引起。

3)增益误差:一般是由于参考电压偏离标准值、运放增益不稳定引起。

3、  转换速度

转换速度一般由建立时间决定,从输入由全0突变全1起,到输出电压稳定(最大输出电压正负二分之一最小输出电压)止,称为DAC转换时间。它是DAC最大响应时间。例如,DAC 5G7520响应时间不大于500ns。


除了以上三个常见的指标D/A转换器的指标还包括电源抑制比、功率消耗、温度系数以及输入高、低逻辑电平的数值等技术指标。关于D/A的应用,应该说在电子系统中应用相当广泛,除了在微机系统中将数字量转换为模拟量典型应用之外,还常用于波形生成,名种数字式的或编程应用等。


好了,关于D/A转换器的知识暂时总结到这,更深入的知道还需要翻一下模电,信号与线性系统(好像里面有奈奎斯特定理,与采样有关),微电子,放大器等方面的书籍。下面简单总结一下LPC1768内部集成的D/A转换器。LPC1768内部集成的是10位模数转换器,它是电阻串联结构的,并且带有缓冲输出,最大输出频率为1MHz。电阻串联结构模型如下图所示:


图 1-6 电阻串联结构

涉及到D/A的引脚主要有DAC输出脚P0.26,参考电压引脚,用来给D/A转换器提供参考电压,模拟电源与数字电源VDD/VSS,这个两个电源要分开提供,再不使用DAC时也要将这两个引脚连接到电源,不能悬空,不然系统会不稳定。


DAC的配置也很简单,首先就是将P0.26设置为DAC模式,再一个就是配置DAC控制寄存器DACDR。DAC的控制寄存器DACDR的6-15位是DAC的输出电压数字值,这个数字决定了要输出的电压大小,DAC输出电压的计算方法是:


公式中VDAC即指AC的控制寄存器DACDR的6-15位的值,VREF指的是参考电压,在这次实验电路中用的是3.3V。LPC1768的DAC功能还有DAM中断和定时控制功能,它采用又缓冲方式输出。在这里简单总结一下DAM模式,所谓的DAM模式也就是Direct Memory Access,汉语的意思就是直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word DMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。DMA有两个技术特征,首先是直接传送,其次是块传送。


DMA工作过程

⑴     当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。

⑵     发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起。进程调度程序调度其他进程占据CPU。

⑶     输入设备不断地窃取CPU工作周期,将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。

⑷     DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。

⑸     中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。

DMA与中断的区别

⑴     中断方式是在数据缓冲寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU 进行中断处理。这就大大减少了CPU进行中断处理的次数。

⑵     中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。


在DMA方式中,由于I/O设备直接同内存发生成块的数据交换,因此I/O效率比较高。由于DMA技术可以提高I/O效率,因此在现代计算机系统中,得到了广泛的应用。许多输入输出设备的控制器,特别是块设备的控制器,都支持DMA方式。


通过上述分析可以看出,DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据的传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了时钟周期,CPU处理效率降低了,要想尽量少地窃取时钟周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU出理效率。


好了,关于DAM的知识先总结到这,要想使用LPC1768的DAM功能,需要配置D/A转换控制寄存器DACCTRL与DAC转换计数寄存器DACCNTVAL。这次实验只是简单的学习怎样使用DAC,所以没有用到DAM。下面说一下实验电路,就是把DAC转换的电压通过放大器输出到Speaker,电压值不同,则Speaker的响度就不一样,如下图所示:

图 1-7 DAC实验电路图

关于LM386M已经是烂大街的芯片,关于它的应用网上有成大堆的资料可供参考,这里就不总结它的用法了,下面贴上这次实验的程序:

关于LM386M已经是烂大街的芯片,关于它的应用网上有成大堆的资料可供参考,这里就不总结它的用法了,下面贴上这次实验的程序:


一、dac.c程序源代码

#include"includes.h"


/********************************************************************************


* 函数名称 :void DACInit( void )


* 函数功能 : DAC初始化


* 入口参数 : 无


* 出口参数 : 无


* 备    注 :无


*******************************************************************************/


void DACInit( void )


{


  PINCON -> PINSEL1 = 0x00200000;          /* 设置 p0.26 为DAC输出脚 */


}




void DacOut(unsigned int val)


{


              DAC -> DACR = ((val << 16)/3300) | DAC_BIAS;


}


二、main.c程序部分源代码


/********************************************************************************


* 函数名称 :void DacConver(unsigned int val)


* 函数功能 : DAC转换函数


* 入口参数 : unsigned int val -- 要转换的电压值,单位mv


* 出口参数 : 无


* 备    注 :无


*******************************************************************************/


void DacConver(unsigned int val)


{


  


   unsigned int hi = 0;


   unsigned int low = 0;


   hi  = val/1000;                        /* 求电压的整数部分 */


low = val%1000/100;

[1] [2] [3] [4]
关键字:Cortex-M3  LPC1768  DAC实验 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481691.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ARM小记
下一篇:Linux及Arm-Linux程序开发笔记(零基础入门篇)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)
SVC异常是? PendSV异常是? ucos 任务切换时机? ucos 如何满足实时性(实现)? ucos中,systick的优先级?SVC和PendSVSVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。SVC:SVC 用于产生系统函数的调用请求。 例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。 因此, 当用户程序想要控制特定的硬件时,它就会产生一个SVC 异常, 然后操作系统提供的SV
发表于 2019-12-11
Cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)
基于ARM Cortex-M0+内核的bootloader程序升级原理及代码解析
,对应三种处理方式 5. 查询BootLoader标志 6. 是否跳转 最后一步很关键的是跳转函数。跳转函数跳转函数的基本思想是将芯片的pc指针指向应用程序烧写的起始地址APP_START_Flash,然后sp调到APP_START_Flash + 4的位置也就是复位向量所在的地方,然后开始执行。下面是跳转函数的代码,该方法对于M0+核的芯片均适用,前提是sp和PC要正确。static void vControlSwitch(unsigned int sp,unsigned int pc){  asm("ldr   r0, [r0]");  asm
发表于 2019-12-11
基于ARM Cortex-M0+内核的bootloader程序升级原理及代码解析
STM32学习之路入门篇之指令集及cortex——m3的存储系统
; 3、Cortex-CM3的地址空间是4GB,程序可以在代码区,内部SRAM区以及RAM区执行。4GB粗线条划分:   1)、内部SRAM区的大小是512MB,用于让芯片制造商连接片上的SRAM,这个区通过系统总线来访问。在此区的下部,有一个1MB的位带区,该位带区还有一个对应的32MB的“位带别名区”,容纳了8M个“位变量”。位带区对应的是最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适用与取指操作。   2)、地址空间另一个512范围由片上外设(的寄存器)使用。这个区也有一条32MB的位带别名,以便于快捷的访问外设寄存器。 
发表于 2019-12-03
STM32学习之路入门篇之指令集及cortex——m3的存储系统
Cortex-M3之SysTick
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK
发表于 2019-12-02
Cortex-M3之SysTick
Cortex-M3学习LPC1768 - TFT实验
自己用的LPC1768的开板带有一块2.4寸的TFT彩色液晶屏,虽然自己工作中还用不过显示屏,但是晚上闲着也是闲着,于是继续玩咱的LPC1768吧。我的开发板上的液晶屏的用的是SPI接口,当然你也可以把它设计成并行口,其接口电路如下所示:话说这个液晶屏的驱动芯片是ILI9325,在网上下载了该芯片的数据手册,好家伙有111页,全是E文呀,没办法,谁让咱是小电工呢,就慢慢啃吧。ILI9325这个芯片的寄存器比较多,不过没关系,我们暂时用到的不是太多,这里只要简要的总结,剩下的还是日后用到了再好好研究吧。1、寄存器03H(Entry Mode),该寄存器主要设置图像的显示模式,包括屏幕的扫描方式(水平扫描或垂直扫描),这直接影响
发表于 2019-12-02
Cortex-M3学习LPC1768 - TFT实验
LPC11XX驱动1602程序_12MHz
LCD.c文件:#include "LPC11XX.h"#include "gpio.h"#include "main.h"#include "Delay.h"#include "LCD.h"/*-----------设置D0-D7为输出口-------------*/void Set_GPIO_Output(void){        LPC_GPIO2->DIR |= (0x1<<0);            
发表于 2019-11-30
小广播
何立民专栏 单片机及嵌入式宝典

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

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