泰克示波器TDS210更换IPS彩色屏幕


本文将介绍如何为泰克示波器TDS210更换当前流行的IPS彩色屏幕,甚至在以后准备将屏幕图像转换为HDMI输出,彻底对以往的老旧屏幕说拜拜。
文章如有侵权请联系我删除。

一、缘起

1.与TDS210的相遇

  2019年,那时本人还是电子信息工程专业的大一学生,一直梦想有一台属于自己的示波器,但因为还未工作经费不那么充足,于是想要在 “海鲜市场” 淘一台二手示波器。经过网上查询对比,发现二手示波器还是泰克的相对靠谱一些,于是乎就在 “海鲜市场” 买到了一台TDS210,60MHz的频率以及1GS/s的采样频率,虽然存储深度很低,折腾乐趣大于使用,但是对于我来说还勉强足够了。
TDS210示波器主视图

  就这样,使用了几年的时间,一直到现在。但是因为TDS210的生产时间实在是太早了,大约10年前的东西了,所以他的屏幕实在是惨不忍睹,哪怕我买的上家已经更换过一块黄底的屏幕,但是还是不可避免的老化了,而且就算没有老化,屏幕的视角也太差劲了,视角必须比示波器低才能看清显示的东西。所以我的想法是再去 “海鲜市场” 淘一个成色好的代换屏幕,就在前几天,经过一番搜索,发现了一款看起来还不错的白底黑显示替换屏幕,标价140软妹币。不过卖家实在是让人恶心的很:因为我的屏幕视角不行,只在一个方向上看不太清,所以我就想先了解下卖家的屏幕视角什么样(他的宝贝链接图片也只有一个视角方向的上机图),所以我就向卖家询问能否拍个实际的上机视频看看,视角怎么样。然后卖家就莫名其妙的直接三两句话就让人gun,事后还拉黑,逃避自己的行为后果。不知道这个卖家是什么原因做出的这种行为,可能是觉得我问的问题很傻,浪费他的宝贵时间,亦或者他遇到什么事情心情不好。本来我心想,只要他的屏幕显示效果比我的好,我就买了。结果,害。。。
海鲜市场与卖家聊天截图
  经过这个卖家的这一通行为,我也没了继续淘这种屏幕的想法。既然这种屏幕这么差劲,而且还要受个别卖家的气,我为什么不自己搞一块现在流行的IPS全视角彩屏接上去呢,甚至如果可以将信号转换为HDMI信号,以接到通用显示器上不更爽歪歪。于是乎,说干就干。先放一下当前已经实现的显示效果。实测,延迟几乎没有,与原屏幕显示的刷新效果完全乎一致,使用上完全没问题,长期运行也无异常情况出现。当前仅仅在4.3寸的480x272屏幕上显示的,接下来还会将其显示到5寸800x480的屏幕上并等比放大,然后实现背景替换,颜色更改,甚至设置一些常用主题等功能。
【已实现更好的效果,点此查看 2022/10/10】

TDS210示波器修改IPS彩屏试机效果

  当然还有很重要的价格问题,如果只是换用5寸 800x480 IPS全视角彩屏的话,屏幕加上自己设计的配套PCB板,全部价格会在100元以内。一个全新5寸 800x480 IPS全视角彩屏也就50元左右,使用的处理器也就15元,再加上其他电阻电容啥的最小系统组成器件,稳稳100元以内。

2.改装预想步骤

1.可以显示到常用的IPS全视角彩屏上(已基本完成,花费了两天时间)
2.可以将显示信号输出到HDMI上,以显示到通用显示器上(待实现,可实现机率90%,打算使用国产便宜的FPGA,已购买)
3.将TDS210的控制主板(控制板很小,巴掌大,大赞)拿出来,自己重新画一个按键板,自制新的外壳,将TDS210的体积缩小至少一倍,近似便携。(待实现,可实现机率70%)
4.改装为可以使用电池供电,或者外部独立供电的,更小的便携示波器。(待实现,可实现机率80%)
【注:实现机率为我的时间、是否继续下去的心以及其他影响,哈哈】

3.意义

  说了这么多,有人会说,你费这么多功夫,折腾这么一个实用性没有那么好的东西,有什么意义呢?所以,我觉得我认为的意义也有必要列一下:

1.首要意义就是换一款我看起来舒服的显示方案,以便我自己使用起来更舒心。
2.在这过程中会收获很多实践经验。
3.我在很多地方看到过其他电子爱好者有过IPS屏显示的需求。这个改装可以为其他电子爱好者提供一种其他的选择,这也是很有意义的一件事情。


因为时间并不是特别充裕,所以,进度会很龟速。[捂脸]😅,但是一旦有新的进度,我一定会第一时间更新。

二、我的DIY实现过程

1.查询屏幕通讯协议

  首先拆开示波器,发现了屏幕的型号为LM32P07,然后搜索LM32P07的datasheet(注意,不要使用baidu引擎,否则搜不到,推荐必应。并且要直接搜索 “LM32P07 datasheet”,才能找到。),找到手册并打开,手动将手册重要部分翻译为中文。

1.首先查看屏幕的引脚。

[屏幕控制引脚]

引脚编号符号说明电源等级
1V0LCD对比度调整电压-
2VEELCD电源(-24V)-
3D3显示数据信号高电平点亮,低电平熄灭
4D2显示数据信号高电平点亮,低电平熄灭
5D1显示数据信号高电平点亮,低电平熄灭
6D0显示数据信号高电平点亮,低电平熄灭
7NC--
8VSS信号地(0V)-
9VDD逻辑电源(+5V)-
10CP2数据输入时钟信号下降沿
11CP1输入数据锁存信号下降沿
12S扫描启动信号高电平

[屏幕灯管引脚]

引脚编号符号说明
1VFT1CCFT背光电源
2VFT2CCFT背光电源

  屏幕使用4线并口进行数据的传输,一个时钟信号、一个锁存信号以及一个扫描信号。具体每个信号是什么意思,可以在看协议时详细分析。

2.屏幕显示像素点分布

  因为屏幕是个单色屏幕,可以近似认为是单色led点阵(便于理解,以下也说是led点),所以从图上可以看出,分布非常简单,由左向右,由上向下的顺序排序,以此组成一个平面二维坐标点。每行有320个led点,共有240行。1.1就表示第一行第一列的点,这样标记后有利于后面协议的分析。
请添加图片描述

3.查看协议,分析协议,将协议搞明白。

  值得庆贺的是,这种屏幕的协议超级简单,很容易就能够看明白。根据下图可以看出,CP1来一个高脉冲,表示将要传输1行的数据,经过一点点间隔后,CP2信号开始传输。在CP2信号的下降沿处依次取D3、D2、D1、D0的数据,放置到此行的第1、2、3、4点上,以此类推。每个CP2下降沿传输4个数据,这样经过80个CP2下降沿,即可传输完4x80=320个点,即1行的显示数据。1表示点亮此处的led,0表示熄灭此处的led点。这样就知道一行的开始以及每个数据的传输,但是如何确定当前数据是哪一行呢?所有有了S信号,当传输完第1行数据后(注意是第1行),S信号会发送1个脉冲,告诉屏幕现在已经将第1行的数据保存进缓冲区了,可以进行刷新了,然后屏幕就开始从第1行数据开始显示,一次刷新1行的数据。依次刷新完一帧的数据。然后再传输第1行的数据,再来1个S信号,屏幕再次开始刷新,循环以往。这样就确定了屏幕数据的开始和每1行的开始。

在这里插入图片描述

4.配合处理器的通俗理解

  因为屏幕的驱动是纯数字芯片构成的,所以tds210发送给屏幕的1行数据,可以暂时锁存到屏幕的缓存器上,并且只能暂存1行的数据。然后S信号高电平来后,屏幕会不断的将缓存器上的数据,从第1行开始,发送给具体的led点进行显示,直至240行刷新完,再次等待S信号。所以CP1引脚叫做输入数据锁存信号,S叫做扫描启动信号。这也是为什么S信号会在第1行数据发送完毕后产生。

  如果使用处理器对协议进行交互的话,就可以保存所有的数据,而不是只能锁存1行的数据,这时这些引脚就又可以有一个通俗的理解:

信号意义行为
S帧开始信号高电平表示开始传输一帧的第2行
CP1行开始信号下降沿表示开始传输1行数据
CP2数据时钟信号下降沿表示传输4个数据

  这样一来,控制信号就明朗了起来,开局等待S信号下降沿表明开始新的一帧图像,等待CP1信号下降沿表示开始1行,根据CP2下降沿获取4个数据,循环以往就可稳定刷新数据。需要注意的是,S表示从第2行开始刷新,直至刷新到下一帧的第1行,这样也是完整的320x240数据。

2.根据协议选取合适的处理器以及屏幕

  使用逻辑分析仪,将S、CPP1、CPP2以及D3-D0全部接上,捕捉屏幕的控制接口协议波形。优先查看的应该是频率最快的CPP2信号,可以看到一个CPP2信号的脉宽343.75ns,周期687.5ns,频率达到了1.45MHz。如果要对这么多信号同时进行采样捕捉、根据协议解码、并且实时将数据显示到320*240的彩色屏幕上的话,使用像如STM32f1、STM32f4等常见单片机,将会非常吃力,并且带LCD控制器的型号价格又非常的昂贵。显然对于使用常见单片机完成来说,是非常愚蠢的行为。那么找到一款运行主频高,带有LCD控制器,价格低廉,并且简单易用的处理器,就是非常必要的了。
请添加图片描述
  还好,在此之前已经用过一个全志的ARM9芯片–F1C100S,但是这个芯片主要是面对主线linux的场景使用,所以程序代码就要在linux环境上编写。又还好,因为我也没学过linux,所以在此之前就研究如何当作单片机一样使用,经过各种网络搜索和学习,在其他大佬的肩膀上[非常非常感谢挖坑网上的大佬们],已经在裸机和RTOS环境实现基本常用的所有功能,完全可以当作一个单片机来使用了。并且也根据其原理图,添加用得到的外设电路,画了一块PCB板,全部器件也可以手动焊接完成,也编写了一套固件成功运行,相当于对这个芯片已经算是比较熟了。
  F1C100S,标准主频408MHz,但是可以超频,在本DIY中实际运行在720MHz。其内置了32MB的DDR1 RAM,且带有LCD-RGB控制器,甚至内部还包含I-Cachel和D-Cachel缓存,对于逻辑判断、数值运算等的运行性能可以提升非常大。最主要的还是其价格,某宝一片仅需15元左右,而且常规应用场景下,仅使用2层板即可PCB布线成功,可以说是超超超超(x100)值了。

3.编写程序,实现显示

  全部开始前的准备工作现已准备完毕,接下来就是根据协议写程序了。首先,如果程序在flash中运行,每次执行都要去flash中读取,这样会导致程序执行效率大幅下降,所以芯片开始时运行bootloader,不要在bootloader内直接编写应用代码程序,而是在bootloader内将用到的基础外设初始化,将flash中的应用代码全部读取到ram中,然后跳转到ram中的应用代码开始执行,这样程序的运行效率最高。
请添加图片描述
  进入应用程序代码后,首先要初始化MMU,开启I-Cachel和D-Cachel。将系统频率初始化到720MHz,此时AHB总线360MHz、APB总线180MHz。然后初始化LCD-RGB控制器,设置显示缓存区域,可以进行显示即可。之后就是循环的协议解析和向显示缓存发送数据,LCD-RGB控制器会自动控制显示,无需CPU干预。我将S接到GPIOE4,CPP1接到GPIOE5,CPP2接到GPIOE7,D3接到GPIOE8,D2接到GPIOE9,D1接到GPIOE10,D0接到GPIOE11。如下所示。

F1C100S引脚屏幕引脚
GPIOE4S
GPIOE5CPP1
GPIOE7CPP2
GPIOE8D3
GPIOE9D2
GPIOE10D1
GPIOE11D0

  主代码如下,对其他各平台不通用的硬件相关代码就不贴了。代码还会存在BUG、执行效率等问题,大家仅作为参考。

volatile unsigned int * PE_Dat;											//用于保存GPIOE的DAT寄存器地址
volatile unsigned int x=320;											//显示位置
//dstc1为显示缓存,为了减少运算,直接定义四个相连的地址,直接对应存放D3-D0shuju 
__align(4) unsigned short *BT1 = (unsigned short *)dstc1;				//D3存放地址
__align(4) unsigned short *BT2 = (unsigned short *)dstc1+1;				//D2存放地址
__align(4) unsigned short *BT3 = (unsigned short *)dstc1+2;				//D1存放地址
__align(4) unsigned short *BT4 = (unsigned short *)dstc1+3;				//D0存放地址

int main(void)
{ 
	sys_mmu_init();																				//MMU初始化,包含
	Sys_Clock_Init(720000000);																	//系统初始化
	Sys_LCD_Init();																				//屏幕初始化
	
	display_colour(0,0,320,240,BLACK);															//清屏
	
	GPIO_Congif(GPIOE,GPIO_Pin_4,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.4  下拉输入模式  S
	GPIO_Congif(GPIOE,GPIO_Pin_5,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.5  下拉输入模式  CPP1
    GPIO_Congif(GPIOE,GPIO_Pin_7,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.7  下拉输入模式  CPP2
	GPIO_Congif(GPIOE,GPIO_Pin_8,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.8  下拉输入模式  D3
	GPIO_Congif(GPIOE,GPIO_Pin_9,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.9  下拉输入模式  D2
	GPIO_Congif(GPIOE,GPIO_Pin_10,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.10 下拉输入模式  D1
	GPIO_Congif(GPIOE,GPIO_Pin_11,GPIO_Mode_IN,GPIO_PuPd_DOWN);									//GPIOE.11 下拉输入模式  D0

	PE_Dat = &(GPIOE->DAT);																		//获取GPIOE的DAT的寄存器地址
	
	while(1)
	{
											
		
		b:x=320;																				//在发送第一行数据后,帧开始信号S才会发出,则会导致第一行在上一帧的最后才能检测到
		
		while(((*PE_Dat)&0x00000010)==0);														//等待开始一帧图像
		while((*PE_Dat)&0x00000010);															//等待一帧开始信号结束
	
		while(((*PE_Dat)&0x00000010)==0)														//在一帧之内
		{
			do																					//因为帧开始信号S来的时候,行开始信号CPP1也会来,会错过行开始信号CPP1,所以直接进行一行显示
			{
				while(((*PE_Dat)&0x00000080)==0)												//CPP2为低电平,等待高电平到来
				{
					if((*PE_Dat)&0x00000020) goto a;											//如果在此期间,因为一些错误缘故导致丢失一些数据,到了刷新下一行的时间,跳转到下一行处出刷新
				}																		
				if((*PE_Dat)&0x00000100)*(BT1+x) = WHITE;										//如果D3=1,则写白色
				else *(BT1+x) = BLACK;															//如果D3=0,则写黑色
	
				if((*PE_Dat)&0x00000200)*(BT2+x) = WHITE;										//如果D2=1,则写白色
				else *(BT2+x) = BLACK;															//如果D2=0,则写黑色

				if((*PE_Dat)&0x00000400)*(BT3+x) = WHITE;										//如果D1=1,则写白色
				else *(BT3+x) = BLACK;															//如果D1=0,则写黑色

				if((*PE_Dat)&0x00000800)*(BT4+x) = WHITE;										//如果D0=1,则写白色
				else *(BT4+x) = BLACK;															//如果D0=0,则写黑色
				x+=4;																			//地址一次+4
				
				if(x>=76800)x=0;																//写完最后一行后,写第一行
				
				if(x==320)goto b;																//写完第一行后,跳转到刷新新一帧处
				
			}while(((*PE_Dat)&0x00000020)==0);													//在一行之内
			
			a:if(x%320)x = (x/320+1)*320;														//如果一行数据有错失,设置到对齐位置
			while(((*PE_Dat)&0x00000020)==0);													//等待开始一行图像
			while(((*PE_Dat)&0x00000020));														//等待开始一行图像
		}
	}
}

  因为涉及频繁的IO操作,任何一点耗时操作都会影响代码的执行效率,所以在上面代码中,尽量直接操作寄存器,使用寄存器地址处理问题,尽量少使用判断语句等。最终,终于实现了简单的同步显示效果。
请添加图片描述

  大家有需要的,可以先根据本文所述的代码和协议,移植到自己熟悉的平台上进行实现。等我做到一个算是合格的显示时,在整理整理资料全部开源。[比如在5寸屏上等比例放大显示,或者全屏显示,绘制配套的专用电路板后,在开源]

三、改装步骤

1.拆开示波器

  因为示波器是220V供电,拆之前,请先断电,并打开开关放置一段时间,让电源板上电容内部的余电释放一下,以防止出现触电意外。在整个改装过程中,可以不拆电源板,也尽量不用去动他。

  为保安全,非专业人员请勿私自拆开!!!
  为保安全,非专业人员请勿私自拆开!!!
  为保安全,非专业人员请勿私自拆开!!!

  1.在示波器上方的提手下面藏着外壳上唯二的两颗螺丝,需要先小心翼翼的将提手拿下,才能将螺丝拧下。在拆提手时一定要小心一点,因为经过10几年的时间,已经变得比较脆,老化了,很容易断。我的就断了[捂脸]😅。
   [待补图]
  2.拆下螺丝后,要先将示波器按键面板上所有的旋钮拔下来,将电源开关的帽也拔下来。前面板的上方没有卡扣,在下方有几个卡扣,轻轻用塑料片撬开即可。
  [待补图]
  3.将示波器主体从壳内整个拿出,将屏幕排线、屏幕背光灯线、按键板排线从主板上拔下。要先拆下按键电路板,才能拆下屏幕。
  [待补图]
  4.屏幕排线由左向右依次为1-12引脚,与手册引脚对应。
  [待补图]

2.自己DIY

  此时,可根据自己的需求选择直接替换掉屏幕,或者两块屏幕共存等。因为在项目此时,还不适合直接改装到可以使用的地步,所以不提任何建议,大家自行脑洞即可。

四、最后

  本文会不断添加新的进度,请耐心等待,如有大的进度改进,会另起博客,但是会在此设置跳转。本人技术水平有限,可能出现错误等问题,请大家多多指教。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级网吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值