原创 【博客大赛】【原创】示波器显示时钟(一)

2012-3-7 11:24 3292 15 15 分类: 测试测量

 

示波器显示时钟

tziang@hotmail.com

2011-8-17

CRT上画圆的基本方法就是使用Lissajous pattern

李萨如图形由相位不同的正弦波输入到CRT的XY轴形成

Y轴正弦波,X轴余弦波会形成一个圆,

如果相位差为零,圆会变成一个斜短线

如果Y=0,斜线会变成水平线等

 

主要芯片

Atmega168, TLC7528,PCF8563

 

TLC7528:双路8bit DAC, REFA(pin4) REFB(pin18)分别接示波器CH1和CH2

和ADI的AD7528完全兼容

 

主要硬件连接关系

 

PCF8563

SCL

SDA

INT

 

SW1

LED

DACZX

 

 

 

 

 

ATMEGA

PC5

PC4

PD2

 

PD7

PD6

PD5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TLC7528

REFA

REFB

DACA#/DACB

WR#

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

ATMEGA

CH1

CH2

PD3

PD4

PB3

PB2

PB1

PB0

PC3

PC2

PC1

PC0

 

软件代码学习,参考代码

ScopeClockSourceV3.0/

|-- AvrBuild.bat #dos下的编译指令

|-- ChangeMenu.asm

|-- DSTime.asm

|-- FlashSupport.asm

|-- Flashtabs.asm

|-- LICENSE.TXT

|-- Readme.txt

|-- UsrCommand.asm

|-- VectTableGen.c

|-- VectTableGen.exe

|-- avr.inc #一些宏定义,操作更接近自然语义,便于理解

|-- constants.h #整个系统定义的各种常量

|-- dac.asm

|-- dac.h #只定义了DACZX(PD5), ZINVERTED,显示亮度控制

|-- data.h

|-- demomode.asm

|-- font8x5.asm

|-- gps.asm

|-- rtc.asm

|-- rtc.h

|-- scopeclock.asm

|-- scopeclockconfig.h #硬件连接关系定义

`-- uart.asm

 

Readme.txt关键信息

DAC,RTC,RS-232相关配置在Scopeclockconfig.h中

对于RTC,使用PC4,PC5的I2C功能,不访问时,设置为输入

由于bootloader(word地址为:0..0x3bff)的原因,代码大小限制在15KBytes,

avr.inc为宏定义

 

2011-8-18

汇编看起来比较累,单那一个主文件的汇编就有4300多行了。

今天找到了V4.0,已经用C重新写过了,开始从这个来学习

 

主要芯片

Atmega328p(MCU), DS1307(RTC),AD7302(DAC)

 

主要硬件连接关系

DS1307

SCL

SDA

PPS

 

 

ZLINE

LED

DACZX

SW1

SW2

 

 

 

ATMEGA

PC5

PC4

PD2

 

 

PD7

PD6

PD5

PB4

PB5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

AD7302

VOUTA

VOUTB

AB

LDAC

WR#

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

ATMEGA

XOUT

YOUT

PD3

PD5

PD4

PC3

PC2

PC1

PC0

PB3

PB2

PB1

PB0

 

 

软件代码学习,参考代码树

ScopeClockSourceV4.0/

|-- Atmegaboot_328.hex

|-- ClkCmd.c #命令交互接口

|-- ClkConfig.h #系统使用的宏定义

|-- ClkDSTime.c

|-- ClkData.c

|-- ClkData.h

|-- ClkDebug.c

|-- ClkDebug.h

|-- ClkDemo.c

|-- ClkFlash.c

|-- ClkFlash.h

|-- ClkGPS.c

|-- ClkGen.c

|-- ClkISR.h

|-- ClkMenu.c

|-- ClkRender.s

|-- ClkSupport.c #RTC相关的函数定义,初始化RTC等

|-- ClkSupport.h

|-- ClkTerm.c #terminal控制台接口的相关函数定义

|-- LICENSE.TXT

|-- ScopeClock.aps

|-- avr.inc #汇编指令的宏定义

|-- clkapp.c #主控软件,main()在这边

|-- clkisr.c

|-- default #编译代码的文件夹以及生成的目标文件

|   |-- ClkApp.o

|   |-- ClkCmd.o

|   |-- ClkDSTime.o

|   |-- ClkData.o

|   |-- ClkDebug.o

|   |-- ClkDemo.o

|   |-- ClkFlash.o

|   |-- ClkGPS.o

|   |-- ClkGen.o

|   |-- ClkISR.o

|   |-- ClkMenu.o

|   |-- ClkRender.o

|   |-- ClkSupport.o

|   |-- ClkTerm.o

|   |-- Makefile

|   |-- ScopeClock.eep

|   |-- ScopeClock.hex

|   |-- dep

|   |   |-- ClkApp.o.d

|   |   |-- ClkCmd.o.d

|   |   |-- ClkDSTime.o.d

|   |   |-- ClkData.o.d

|   |   |-- ClkDebug.o.d

|   |   |-- ClkDemo.o.d

|   |   |-- ClkFlash.o.d

|   |   |-- ClkGPS.o.d

|   |   |-- ClkGen.o.d

|   |   |-- ClkISR.o.d

|   |   |-- ClkMenu.o.d

|   |   |-- ClkRender.o.d

|   |   |-- ClkSupport.o.d

|   |   |-- ClkTerm.o.d

|   |   `-- twimaster.o.d

|   `-- twimaster.o

|-- font8x5.inc #8row*6bit ASCI字库(32-127),每行的最后2bit都是0

|-- i2cmaster #MCU的I2C初始化,读写函数的定义等

|   |-- i2cmaster.h

|   `-- twimaster.c

|-- readme.txt

|-- scopeclock.aws

|-- vectsamples.inc

`-- vecttable.inc

 

 

 

2011-8-19

 

X-Y 偏转或XY模式是示波器的另一种显示方式,此时示波器将时基关闭,用另一个与产生垂直偏转信号不同的信号来使电子束偏转。这就是说用两个信号在X,Y方向上同时作用于电子束而描绘出波形。通常用来观察两个信号间的相位关系,比如前面提到的李萨如图形,如果两个信号没有相关的频率关系,则不会获得稳定的图形显示

 

图片1.jpg
图片2.jpg

X-Y模式用适当的传感器把物理量变换成示波器能显示的信号,就可以显示两个物理量,例如位移和压力之间的关系,在任何涉及两个相互关联的物理量场合都可以使用X-Y显示模式。

简单的说就是加到X轴上的电压使电子束在X轴上产生偏移,加到Y轴上的电压使电子束在Y轴上产生偏移,

比如设置X,Y轴每格代表1V,

不外加电压(X,Y输入电压分别为0V),此时在示波器上会显示一个亮点,代表的就是坐标原点(0,0);

当2V直流电压分别加到X和Y上,亮点便会移动到相对坐标(2,2)上去,根据人眼视觉暂留的特性,不停的刷新坐标,便会得到相关图形显示,到此基本原理比较清楚了

 

 

2011-8-22

暂到此,等芯片到了再试验,先把前段时间申请的温度传感器加到lightning上去

 

2011-8-26

ADI的温度传感器试验不成功,能够访问到设备,设备有应答,但是读出的寄存器内容不对,

美信的DAC-max5820能够正常工作了,可以输出正弦,余弦,三角,方波,锯齿等波形,XY模式下由于串行I2C的速率导致,显示圆时有闪烁;

 

根据规格书,显示一个点需要:

1.X和Y通道:各需3*(byte+1bitACK)

2.同时输出:需要2*(byte+1bitACK)

也就是显示一个点Tdisp至少要5*9个I2C时钟周期

标准I2C 100kHz时:Tdisp=10uS*45=0.45mS

快速I2C 400kHz时:Tdisp=2.5uS*45=0.1125mS

显示圆时,8bit DAC,256个量化点,

100kHz时需要256*0.45mS=115.2mS;

400kHz时需要256*0.1125mS=28.8mS;

 

 

2011-8-29

 

能够在示波器上任意位置显示字库中的任意字符

参照ScopeClockSourceV4.0/

中的font8x5.inc #8row*6bit ASCI字库(32-127),每行的最后2bit都是0

参考代码写得比较复杂,注释比较少,看不懂,不过这个8*6的字库比较适用,

 

图片3.jpg

显示字符:

将字符映射到示波器的XY坐标上去,从上到下,从左到右逐位扫描判断,遇到红色标记的位(对应bit为1)时,送相应的坐标到XY显示,bit位为0时,不送坐标到XY显示 ,

从左到右的同一行中,Y对应的坐标值不变,X坐标增加;

向下换行时,X坐标赋回初始值,Y坐标减小;

 

部分代码

static int max5820_disp_char(char c,unsigned char CHX,unsigned char CHY){//X Y为偏移量

    unsigned char *data,tmp,tmp1,X,Y;

    int i,j;

data=Newfonttbl+(c-33)*8;

//定位字符c在Newfonttbl数组中的起始位置, *8是因为每个字符由8个byte表示

X=CHX;

Y=CHY;

for(i=0;i<8;i++){ //每个字符由8个byte组成

tmp=*data;

for(j=0;j<8;j++){ //每个byte逐位(从高位到低位)判断

tmp1=tmp;

if((tmp1&0x80)==0x80){//这一位有内容,准备显示

max5820_write(this_client,0x4000,X); //送X坐标

max5820_write(this_client,0x5000,Y); //送Y坐标

max5820_output(this_client); //同时输出XY坐标对应的模拟量 }

X=X+3; //同一行中,Y不变,X增加;

tmp=tmp<<1; //byte内容左移一位,向右扫描

}

data++; //取下一个byte,准备换行

X=CHX; //换行,X赋回初始偏移值

Y=Y-3; //换行,Y坐标减小

}

return 0;

}

 

2011-8-30

编写测试程序同时操作max5820和SPI-LCD

加载这两个模块后,只要在应用程序中打开对应的文件指针,就可以操作了,测试没有问题;

 

2011-8-31

TI的DAC tlc7528今天收到了,来说下样片申请的事,

8-28申请的,样片速度确实比较快,申请之后的一个工作日,TI会有专人和你联系了解下申请样片的项目情况,TI不对个人制作提供样片

美信的样片申请,只要你提供申请后,通常1个星期就可以拿到;

ADI的样品申请,通常需要2个星期以上;

ScopeClockSourceV3.0 DAC用的就是tlc7528,不过根据其规格书

 

图片4.jpg

没有类似max5820同时更新输出的功能,也就是说更新显示点时,XY是有一个时间差,最终验证确实是这样

 

图片5.jpg
图片10.jpg

DAC器件本身就不用怎么说了,因为是并口的操作起来更加简单,

说说高通那边,使用camera接口信号连接DAC的控制和DATA线

 

图片6.jpg

与之前max5820主要不同地方就是如何把需要的数据反映到DAC的并口数据上,

static int tlc7528_write(uint8_t AorB, uint8_t val) //AorB为A,B通道选择,val为要送的数据

{

int i=0;

uint8_t tmp;

gpio_set_value(DACA_B,AorB); //选择通道

for(i=4;i<12;i++){ //4-11为GPIO4-GPIO11对应连接到DAC的B0-B7

tmp=val;

if((tmp&0x01)==0x01){ //从低位开始判断,设置对应的GPIO位

gpio_set_value(i,1);

// printk(KERN_ERR DRIVER_NAME"gpio_%d=1\n",i);

}

else{

gpio_set_value(i,0);

// printk(KERN_ERR DRIVER_NAME"gpio_%d=0\n",i);

}

val=val>>1;

}

//ndelay(10);

gpio_set_value(DAC_WR,0); //写寄存器使能

//ndelay(60);

gpio_set_value(DAC_WR,1); //输出使能

return 0;

}

测试结果发现打印的log没有问题,但是最终测试GPIO4,GPIO5,GPIO11不对,应该是camera初始化对其有影响,重编内核,去掉camera部分的初始化,任然不对,最后修改board.c中的camera初始化GPIO内容,全部改成GPIO输出后测试正常。

如果保留上面的打印语句,正弦波的周期为30mS左右,相差如此之大。

 

那么这颗并行DAC显示一个点需要多长时间,

显示正弦波时,测量到周期大概是2mS左右,也就是说显示1个点耗时为2mS/256=7.8125uS

那么在XY模式下,显示一个点由于要先后送X和Y坐标,也就是大概7.8125uS*2=15.625uS

 

 

现在我们来算显示时钟是否可行,

具体显示方案为:

1.显示表盘,使用李萨如图形 2mS;

2.显示数字12/3/6/9:使用字库字符扫描方式,5*(8*8)*15.625uS=5mS;

3.显示指针,使用画直线方式100*3*15.625uS=4.687mS

4.刻度盘,画短直线,大概也就是5mS左右,这个暂没有做。

 

最终效果如下

显示的圆有点不规整,实际是对应的正弦波和余弦波幅度有差异导致,同样的数据用max5820是能够显示正圆的,可能是tlc7528的抗干扰差一点。

 

图片7.jpg
图片8.jpg
图片9.jpg

到此为止吧,大概原理和框架就是这样,END.

文章评论0条评论)

登录后参与讨论
我要评论
0
15
关闭 站长推荐上一条 /2 下一条