示波器显示时钟
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方向上同时作用于电子束而描绘出波形。通常用来观察两个信号间的相位关系,比如前面提到的李萨如图形,如果两个信号没有相关的频率关系,则不会获得稳定的图形显示
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的字库比较适用,
显示字符:
将字符映射到示波器的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,不过根据其规格书
没有类似max5820同时更新输出的功能,也就是说更新显示点时,XY是有一个时间差,最终验证确实是这样
DAC器件本身就不用怎么说了,因为是并口的操作起来更加简单,
说说高通那边,使用camera接口信号连接DAC的控制和DATA线
与之前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的抗干扰差一点。
到此为止吧,大概原理和框架就是这样,END.
文章评论(0条评论)
登录后参与讨论