[原创] ADuc7026学习-ADC

dj狂人   2015-1-11 22:32 楼主
ADuc7026-ADC
进度有点慢,手工做的东西不是很靠谱,不懂是不是JTAG接口电路的问题,有时候你随便插拔都用的好好的,可是有时候你动一下就下不了程序了,keil不是提示算法加载不成功就是提示TDO一直为高,可是有时候你放一晚或者插拔一下又能下了。郁闷...
好了,题外话不扯那么多,开撸.....
开撸之前咱来预热下,首先比较器,上图
比较器.jpg
比较比较顾名思义就是起到比较的作用。当比较器的同相端电压高于反相端电压时,输出端输出高电平,反之,当同相端电压低于反相端电压时,输出端输出低电平。这里我们先记住比较器的这个特性。
接着是DAC,上图
DAC.jpg
DAC又叫数模转化器,它能把数字信号转换成模拟信号。比如上图我们看到的是一个八位的DAC,这里假设它是电压型DAC,参考电压Vref = 5V,那么当我们从数据口D0~D7输入0-255之间的某个数字时,输出端输出相应的模拟电压Vo(0~5V)。比如通过D0~D7输入数字量0x00时,输出端电压Vo为0V,输入数字量为0xff时...输出端电压为5V。
好,基于以上的基础,现在要求我们用一个比较器、一个DAC和单片机实现测量一个外部电压,这个外部电压在0~5V范围内。那么我们可以这样做,上图
ADC.jpg
在上面的这个电路图中,DAC的参考电压为Vref= 5V,然后DAC为电压输出型DAC,它的输出端和比较器的反相端接在了一起,然后外部电压Vx从同相端输入,单片机通过给DAC输入不同的数字量控制DAC输出0~5V之间的模拟电压,同时通过引脚a检测比较器输出电压。那么要想测出外部电压Vx,我们可以这样编程实现:(假如Vx等于2V)
单片机先给DAC输入数字量0x00,控制DAC输出0V的模拟电压,然后单片机判断引脚a是否变为低电平,如果是高电平,加大输给DAC的数字量,每次加一,数字量依次为0x01、0x02、0x03...相应的DAC输出的模拟电压依次为20mv、40mv...只要引脚a电平为高,就一直加,直到引脚a变为低电平。当引脚a变为a电平的时候,因为我们的Vo是以20mv的电压为增量慢慢的接近Vx的,所以此时的反相端电压我们可以认为Vo=Vx,这样我们就测出了这外部电压Vx。
从上面可以看出比较器+DAC+其他器件 就可以做成一个ADC,ADC的精度由DAC决定,这种ADC我们叫逐次逼近型ADC。
PS:ADC又叫模数转换器,他能把模拟型号转换成数字信号。八位的ADC,参考电压 Vref = 5V的时候,是把5V电压分成了28 = 256份,一份为5/256mv约等于20mv(这个5/256我们通常叫最小分辨率),然后0~20mv范围内的模拟电压用数字量0x00表示,20~40mv范围内的模拟电压用0x01表示,以此类推......
本帖最后由 dj狂人 于 2015-1-12 17:28 编辑

回复评论 (10)

好,预热完,接下来进入今天的主题
ADuc7026内部集成了一个12位的逐次逼近型ADC,它共有16的通道,工作电压为2.7V-3.6V,最高采样速率达1MSPS,7026还为其配置了一个片内基准源,该基准源为ADC、DAC共用,通过对 REFCON寄存器的最低位置位开启。
7026的这个ADC可以工作在三种模式下,分别为全差分模式、单端模式、伪差分模式。当工作在单端模式或伪差分模式下时,ADC模拟输入范围为0V至V REF 。在全差分模式下,输入信号共模电压V CM 在0 V至AV DD 之间、最大幅值不超过2 V REF。
跟ADC相关的寄存器共有八个寄存器,分别为 ADCCON、ADCCP、ADCCN、ADCSTA、ADCDAT、ADCRST、ADCGN、ADCOF。其中
ADCCON 是一个16位的ADC控制寄存器,通过它来使能ADC外设,配置ADC的工作模式和转换类型,其中
15~13 保留。
12~10 设置ADC 时钟速度。
000 fADC/1 。 该分频器用于在外部时钟频率小于
41.78MHz 时获得 1MSPSADC 。
001 fADC/2 ( 默认值 ) 。
010 fADC/4 。
011 fADC/8 。
100 fADC/16 。
101 fADC/32 。
9~8 设置ADC 采集时间。
00 2 个时钟。
01 4 个时钟。
10 8 个时钟 ( 默认值 ) 。
11 16 个时钟。
7 转换启动使能。
置 1 ,启动任意类型的转换。清 0 禁用转换启动(清 0 该位不能使正进行连续转换停止)。
6 使能 ADC BUSY 。
置 1 , 使能 ADC BUSY 引脚。 清 0 则禁用该引脚。
5 ADC 电源控制。
置 1 , 置 ADC 于正常模式 ( ADC 在上电至少 5微秒之后才能正确转换)清0 ,ADC 置于掉电模式。
4~3 设置ADC转换模式。
00 单端模式。
01 差分模式。
10 伪差分模式。
11 保留。
2:0 设置ADC转换类型。
000 CONVSTART引脚输入作为转换使能信号。
001 定时器 1 输出作为转换使能信号。
010 定时器 0 输出作为转换使能信号
011 单次软件转换。在转换后设为 000 (注意:为了避免CONV-START
引脚再一次触发转换,ADDCON MMR 的第 7 位在启动单次软件转换后应清 0 )。
100 连续软件转换。
101 PLA 转换。
其他 保留。
ADCCP 是一个八位的ADC正向通道选择寄存器,其中
7~5保留。
4~0 ADC正向通道选择位。
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 ADC8
01001 ADC9
01010 ADC10
01011 ADC11
01100 DAC0/ADC12
01101 DAC1/ADC13
01110 DAC2/ADC14
01111 DAC3/ADC15
10000 温度传感器。
10001 AGND (自诊断特性)。
10010 内部基准电压(自诊断特性)。
10011 AV DD /2 。
Others 保留。
本帖最后由 dj狂人 于 2015-1-12 17:29 编辑
点赞  2015-1-11 22:33
ADCCN 是一个八位的ADC反相通道寄存器,其中
7~5 保留。
4:0 反向通道选择位。
00000 ADC0
00001 ADC1
00010 ADC2
00011 ADC3
00100 ADC4
00101 ADC5
00110 ADC6
00111 ADC7
01000 ADC8
01001 ADC9
01010 ADC10
01011 ADC11
01100 DAC0/ADC12
01101 DAC1/ADC13
01110 DAC2/ADC14
01111 DAC3/ADC15
10000 内部基准电压(自诊断特性)
Others 保留。
ADCSTA是一个ADC状态寄存器,也是八位。它指示ADC转换结果已完成。
ADCSTA寄存器只有一个位Bit0(ADCReady),表示ADC的转换状态。在一次ADC转换完成后该位置1,并且产生一个ADC中断。当读取ADCDATMMR时,该位自动清0。在ADC进行转换时, 也可以通过外部ADC BUSY 引脚读取ADC的工作状态。 在转换期间, 该引脚上为高电平; 当转换结束后, ADC BUSY引脚变为低电平。如果通过ADCCON寄存器使能,则可以在P0.5引脚输出ADC BUSY 的状态 (参见 “通用输入/输出” 部分) 。
ADCDAT为ADC数据结果的32位寄存器。里面存放12位ADC转换结果,其中高四位存放符号位,底16位保留,27~16保存的是12位ADC转换结果。(在全差分模式下,其结果是二进制补码格式。在伪差分模式和单端模式下,结果是
标准二进制格式表示。)
ADCRST寄存器可以复位ADC的数字接口。通过向ADCRST中写入任意数据,可恢复所有ADC寄存器到默认值。
ADCOF是一个10位偏移校准寄存器。
本帖最后由 dj狂人 于 2015-1-12 17:29 编辑
点赞  2015-1-11 22:34
那好,我们下面来编程调用ADC进行电压测量
上面介绍了那么多个寄存器,但其实在一般的场合只用配置其中几个个就可以了,并不是全部都需要用到,比如最简单的
#include
int main(void)
{
int Result=0;
ADCCON = 0x20;//至少在开启电源5us之后再开始ADC转换
Delay(5); //5us短延时
ADCCP = 0x00; //选择ADC0转换通道
REFCON= 0x01;//使用内部基准源(建议使用内部基准源)
ADCCON = 0x07E4;/*配置ADC的工作模式并开启ADC转换,
000 001 11 1 1 1 00 100 ADC的时钟速度为fADC/2、ADC采样时间为16个时钟、启动ADC转换、使能ADCBUSY、打开ADC电源、选择单端模式、选择连续转换*/
While(1)
{
while (!ADCSTA); //等待转换结束
Result = ADCDAT>>16;//从数据结果寄存器中取出转换数据
DisPlay(Result); //通过串口或液晶显示转换结果
}
}
以上这个是比较简单的应用,除了这种之外,我们还可以用ADC来进行两个信号的比较或者平衡信号,比如全差分模式。我们还可以把ADuc7026的ADC配置成温度传感器,不过它只能测量芯片内部温度,无法用于进行外部温度测量。
这里我只是简单介绍了ADuc7026内部集成的这个ADC的皮毛内容,有兴趣的可以买一块或者申请样片回去玩玩,撸完,收工
本帖最后由 dj狂人 于 2015-1-12 17:30 编辑
点赞  2015-1-11 22:34
上几张图,已经受不了JTAG接口,现在改用串口下程序,没想到串口下载也是波折,还是焊接问题,顶层镜像的时候母头插座忘了处理下,结果悲剧,焊反反了!!!!!只能重新拆了焊,板子到现在已经面目全非,哎,说多都是泪 1.jpg 2.jpg 3.jpg 4.jpg 本帖最后由 dj狂人 于 2015-1-12 17:39 编辑
点赞  2015-1-11 22:46
谢谢楼主分享!
点赞  2015-1-20 21:44
感光板做的PCB啊,握握爪子  楼主写的真不错,看着也是一种享受啊,学习了  
如果天空是黑暗的,那就摸黑生存;如果发出声音是危险的,那就保持沉默...但不要习惯了黑暗就为黑暗辩护;不要为自己的苟且而得意;不要嘲讽那些比自己更勇敢热情的人们。人可以卑微如尘土,不可扭曲如蛆虫。
点赞  2015-2-3 12:55
感谢分享!
点赞  2015-9-25 10:10
看的非常舒服,赞一个
点赞  2015-10-4 19:51
引用: 周琦 发表于 2015-10-4 19:51
看的非常舒服,赞一个

谢谢
点赞  2015-10-12 12:36
ADCDAT 的高四位存放符号位,需要处理吗
点赞  2015-11-14 14:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复