矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2523|回复: 14

基于stm32从10%开始diy一台crt显示器

[复制链接]
     
发表于 2024-12-24 20:51:40 | 显示全部楼层 |阅读模式
本帖最后由 SPKBL 于 2024-12-24 22:47 编辑

一楼先放部分成果图
3sj1j示波管的演示视频:
【世界最小示波管3SJ1J显示动画和时钟字符】https://www.bilibili.com/video/B ... 59cfca542c2cd572efd
图片1.png
图片3.png
图片2.png
图片5.png
图片9.jpg
图片7.png

评分

3

查看全部评分

     
 楼主| 发表于 2024-12-24 20:54:22 | 显示全部楼层
临近年末,各种考试考完了,4级也顺利通过了,看着我这一柜子的电子管和示波管,突然心血来潮要自己做一个示波管显示器,让它们重现昔日的荣光 ,特别是手上的几个国产3sj1j和苏联的3ЛО1И示波管,是世界上屏幕最小的示波管,它们到我手里的时候我还是个中学生,连单片机也不懂 ,因此一直没有能力过把它们点亮。
之前也见过几个用这种小示波管做crt时钟的作品,看得我不仅是心里痒痒的,手也痒痒的,这种crt的魅力确实是LCD和OLED比不了的。
但是,在查阅了网上几款crt时钟作品之后,发现它们无一例外都是采用矢量显示而不是扫描显示。
所谓矢量显示就是直接用电子枪做画笔在屏幕上绘制图形,例如要画一个圆就是x轴给正弦波,y轴给余弦波,也就是示波器的xy模式画李萨如图形的原理,这种方式画画简单的图形还好,但是如果要显示一些复杂的图案比如汉字,字母等等,脑子就转不开弯了,这样的优点是可以最大限度利用电子枪的亮度,显示清晰。
另外一种方式就是扫描显示,和crt电视机的显示原理一样,xy轴都给锯齿波做扫描信号,使得电子枪在屏幕上画出一个实心方块,此时只要控制z轴也就是电子枪的亮度就可以在这个方块里显示各种各样的图案,同时这样的显示方式也和点阵屏的扫描显示方式相似,可以把代码直接套用过来。
因此在这里选择扫描显示的方式
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-24 20:55:57 | 显示全部楼层
既然选择了扫描显示模式,就要事先计划好屏幕的尺寸,考虑到在圆屏示波管上显示2: 1或16: 9的画面太扁了,但是如果用1: 1的画面用在方屏示波管上又容易变形,所以综合考虑选用4: 3的画面比例

关于单片机的选用:
由于亮度信号,xy轴扫描信号都要由单片机生成,因此优先选择自带dac的单片机,xy轴生成锯齿波各要一个dac,亮度信号如果简单的采用黑白二值化只要一个io口就行了,但是我想要显示不同的灰度,所以亮度信号也要一个dac。总共要3个dac
同时,因为示波管的扫描驱动要全部由单片机完成,所以单片机要有足够的ram用于存放显存。
并且dac生成扫描锯齿波这种事不能停下来,CPU是不能干这种事的,不然就一直被中断打断做不了其他事,所以必须要由dma来完成这个工作。

基于以上几点考虑:
51单片机:ram太小,没有dac,没有dma
arduino:缺点同上而且我不会用
树莓派:我不会用
esp32:我不会用
stm32f103:没有dac并且国产仿冒品太多
stm32g431:32kb的ram,2个dac,有dma

因此选用stm32g431单片机,这个mcu工作频率最大170MHz,有两个dac外设,每个dac有2个通道,总共4个12bit的dac通道,满足要求,而且在淘宝上不到10块钱一片,价格十分亲民,并且由于是st近几年的新产品,市面上还没有国产仿冒,所以用起来也安心。
选好了单片机,接下来就开始规划一些具体的参数
关于屏幕分辨率:原本还想兼容pal或ntsc制式用525或625线的清晰度,然后灰度为8bit也就是256级灰度,但是这样算下来,以pal的垂直625线分辨率为例,4: 3的画面比例,水平像素点应该为833点,这样显存大小为833*625*1byte=520. 625kb,已经大大超出了单片机32kb的ram大小,但是能不能降低为16灰度也就是4bit灰度呢?这样也是不可行的,因为单片机最小存储单元是byte也就是char类型变量,为8bit,如果用4bit灰度,就要把两个像素的4bit灰度数据存在同一个byte中,但是dma搬移数据的地址步进最小只能为1个byte,所以这个8bit的灰度是不得已而为之。
综合考虑下来,选择168*120的分辨率,8bit灰度,帧率83.33hz,逐行扫描,显存大小为168*120*1byte=20. 16kb。由于x=160到168的区域留作电子枪消隐所以亮度始终保持为0,那么有效显示区域就是160*120像素,也就是4: 3的画面比例
如果选择其它的分辨率,要么定时器分频不到合适的频率,要么dac触发频率太高,要么显存超出单片机ram大小。
回复 支持 反对

使用道具 举报

     
发表于 2024-12-24 21:10:15 | 显示全部楼层
支持,等后续,楼主看样子是专业学生了
我既不会单片机又没有示波管,只能当观众
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-24 21:44:53 | 显示全部楼层
因为x轴(水平)范围是0~168,y轴(垂直)范围是0~120,亮度范围是0~256,所以3个dac的分辨率只要8bit即可,stm32的dac刚好也提供了8bit的分辨率的选项,但是如果后续要提高分辨率的话,dac就要设置为12bit了
dac生成锯齿波的基本思路是由单片机主时钟,经过定时器分频后得到x轴和z轴dac触发时钟,这个时钟再分频,得到y轴触发时钟,这三个时钟分别触发对应的dac,同时dma将指定地点的数组数据依次搬运到dac中,dma搬运到数组末尾后又自动跳回数组头部,整个过程周而复始,不需要cpu介入,cpu只需要操作z轴dac对应的数组,也就是显存,在这个显存里就可以完成各种各样的显示和画图操作。
行频设置为10kHz,那么x轴dac触发的时钟为168像素*10kHz=1.68MHz,场频设置为83.33Hz,那么y轴dac触发的时钟为120像素*83.33Hz=10kHz,z轴dac的触发频率和x轴一样也是1.68MHz
在这里把单片机的时钟设置为168MHz,就可以通过定时器分频获得这些时钟。

部分代码:
struct
{
  uint8_t TV_mode_X_buf[CRT_WIDTH_X];//x轴dac的数据数组
  uint8_t TV_mode_Y_buf[CRT_HEIGHT_Y];//y轴dac的数据数组
  uint8_t CRT_VRAM[CRT_WIDTH_X*CRT_HEIGHT_Y];//显存
}CRT;

void CRT_TV_mode_init(bool rotate_x, bool rotate_y)//选择是否反转x或y轴
{
  uint8_t i,j;

  for(i=0;i<CRT_WIDTH_X;i++)
  {
    CRT.TV_mode_X_buf[i]=rotate_x ? 255-(i+50) : i+50;//生成锯齿波数据
  }
  for(j=0;j<CRT_HEIGHT_Y;j++)
  {
    CRT.TV_mode_Y_buf[j]=rotate_y ? 255-(j*2) : j*2+15;//生成锯齿波数据
  }
  
  HAL_OPAMP_SelfCalibrate(&hopamp1);//校准片内运放
  HAL_OPAMP_Start(&hopamp1);//启动片内运放
}
void CRT_TV_mode_start_XY_scan(void)
{
  __HAL_TIM_SET_COUNTER(&htim3,0);//定时器初始值清零
  __HAL_TIM_SET_COUNTER(&htim2,0);//定时器初始值清零

  HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t*)CRT.TV_mode_Y_buf, CRT_HEIGHT_Y, DAC_ALIGN_8B_R);//启动y轴dac和dma生成锯齿波

  HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2, (uint32_t*)CRT.TV_mode_X_buf, CRT_WIDTH_X, DAC_ALIGN_8B_R);//启动x轴dac和dma生成锯齿波

  HAL_DAC_Start_DMA(&hdac3, DAC_CHANNEL_1, (uint32_t*)(CRT.CRT_VRAM), CRT_VRAM_SIZE, DAC_ALIGN_8B_R);//启动z轴dac和dma生成亮度信号

  HAL_TIM_Base_Start_IT(&htim3);//10kHz的定时器,用于触发y轴dac
  HAL_Delay(0);
  HAL_TIM_Base_Start(&htim2);//1.68MHz的定时器,用于触发x和z轴dac
}
(由于在芯片上,z轴dac(dac3)没有直接的管脚引出,只能通过片内的运放作为跟随器连接到外部,)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-24 21:51:12 | 显示全部楼层
单片机上配置完成后,dac生成的信号:
蓝色是x轴10kHz的锯齿波行扫描信号,黄色是y轴83.333Hz的y轴锯齿波场扫描信号,紫色是z轴的亮度信号
编写了字符和图形显示的代码后,这个信号可以直接连接到示波器上,(前提是示波器有xy模式和z轴亮度信号输入)就能看到出现了正确的图案
视频演示:
【示波器之crt显示器】https://www.bilibili.com/video/B ... 59cfca542c2cd572efd
图片11.jpg
图片12.jpg
图片9.jpg
图片8.png
图片10.jpg

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2024-12-24 21:55:25 | 显示全部楼层
看不懂也前排留名
回复 支持 反对

使用道具 举报

     
发表于 2024-12-25 00:36:35 | 显示全部楼层
有屏幕就能播放  Bad Apple  

https://www.bilibili.com/video/B ... 72fdebe7dad8ea9b72d
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-25 01:36:50 | 显示全部楼层
whyljh3333 发表于 2024-12-25 00:36
有屏幕就能播放  Bad Apple  

https://www.bilibili.com/video/BV1xTmbYmEvN/?vd_source=06c1d5bf44 ...

这个就是典型的矢量显示,而且没有消隐信号,仔细看能看到回扫线
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-29 00:54:08 | 显示全部楼层
本帖最后由 SPKBL 于 2024-12-29 01:06 编辑

在示波器上实验成功后,就可以开始绘制驱动电路了。
对于示波管的驱动,有这几个基本要点:
从阴极向屏幕方向看,示波管内含的电极通常包括但不限于:
阴极K,
调制极M,或者叫栅极G
第一阳极A1
第二阳极A2
第三阳极A3
垂直方向偏转板一对Y1,Y2(距离更靠近阴极,偏转灵敏度高)
水平方向偏转板一对X1,X2(距离更靠近屏幕,偏转灵敏度低)

为了形成电子透镜对电子束聚焦,它们的电位通常服从如下规律:
设阴极为0V
栅极为0~-100V(注意是负压)
第一阳极为600~1500V
第二阳极为30~150V
第三阳极的电压和第一阳极相同
垂直和水平方向偏转板的电压要接近第三阳极的电压

因为第三阳极和第一阳极的电压相同,所以在大部分示波管中,第一阳极和第三阳极在管内就已经连接起来了
并且第二阳极的电压会对聚焦性能有非常大的影响,因此它通常也叫聚焦极
栅极的电压不会对聚焦性能有很大影响,但是对电子束亮度的影响很大,亮度调制信号通常从这里输入
垂直和水平方向偏转板的电压要接近第三阳极的电压,因为如果电子离开第三阳极飞进偏转区域时,电场强度变化过大可能就会导致电子束发散从而使聚焦性能变差

了解了以上要点之后,如果直觉比较敏锐的话,首先想到的应该是利用差分放大电路来驱动偏转板,这样可以最大化利用两个偏转电极,但是细想一下的话就会发现不对,因为偏转板的平均电位要和第三阳极接近,而第三阳极相对阴极有几百上千的直流电压,如果差分放大电路也要输出这么高的共模电压的话,对于电路设计是非常不便的,因此所有示波器的示波管驱动电路都是采用负高压供电的,例如阴极给-1kV高压,但是第一第三阳极接地为0V,这样也满足示波管内部电极的电位差关系,差分放大电路输出的共模电压可以接近于0V,这样简化了对偏转放大电路的要求,并且负高压可以利用倍压整流电路轻松的获得,可谓是一举两得。
但是也别忘了灯丝的供电,如果阴极是负高压,而和它距离非常近的灯丝的电位也不能相差太多,否则就会发生击穿把管子损坏,通常的做法就是给灯丝悬浮供电,在变压器上单独绕一个灯丝绕组并且和其它绕组良好绝缘,这个绕组单独给示波管的灯丝供电。

(部分示波管有第四阳极A4,偏转板间屏蔽极P,或者并没有直接在管内连接A1和A3等等,后面遇到了再讨论)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-12-29 20:59:18 | 显示全部楼层
怎么突然发带图片的回复要审核好久,都一天了还没审核好
回复 支持 反对

使用道具 举报

     
发表于 2025-1-2 10:40:09 | 显示全部楼层
所谓审核就是不让发,我从来没见过审核通过的帖子
回复 支持 反对

使用道具 举报

     
发表于 2025-2-26 09:05:51 | 显示全部楼层
国家后继有人啊
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2025-2-26 11:46:33 来自手机 | 显示全部楼层
近期开学了,新的驱动板也打样好在路上了,过几天更新
回复 支持 反对

使用道具 举报

     
发表于 2025-2-26 12:34:01 | 显示全部楼层
路过收藏关注
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表