
欢迎和简介在“录像”的“LiuZhiyong-Welcome.mp4”里面,可以通过电子邮件里面的地址联系。
录像 LiuZhiyong-Welcome.mp4
照片一 LiuZhiyong-Photo-1.jpg
照片二 LiuZhiyong-Photo-2.jpg
照片三 LiuZhiyong-Photo-3.jpg
水印标记 liuzhiyong.me
电子邮件 moonforce@qq.com
目录
IRS2092S
用这个芯片实现D类放大器,第二版完成:
第二版俯视:
第一版完成:
第一版俯视:
第一版更换电感,进行调试:
第一版焊接使用的BOM:
第二版焊接使用的BOM:
低通滤波器之前:
低通滤波器之后,第一版存在问题:
(存在高频信号,低通滤波不彻底,所以更换高级电感,制作第二版)
USB
目的是实现有“隐藏分区”的USB读卡器,方框图就两根数据线:
电路设计文件列表:
四层板PCB打样组装:
(设计失误,添加飞线上拉电阻)
PCB另外一面:
USB连接到Windows 7:
先计算100MB数据的校验和:
Windows 7读取数据:
计算校验和,核对数据完全正确:
深度系统读取数据:
计算校验和,核对数据完全正确:
小米安卓读取数据:
计算校验和,核对数据完全正确:
传输速度为 6.0 Mbps 到 6.5 Mbps。
SDIO
目的是实现有“隐藏分区”的USB读卡器,方框图MicroSD卡连接到MCU:
“隐藏分区”的大小为MicroSD卡实际大小的一半:
RAK439
设计一个设备的时候,需要高速WIFI模块,选择RAK439。最后完成的PCB的图纸:
(主要元件:U1是RAK439,U2是STM32F207ZGT6,P5是ST-LINK的SWD调试端口,P1连接OV7670摄像头,P2连接433MHz电波发送模块,P3连接433MHz电波接收模块,P4连接12864屏幕,右下角是开关电源)
把主要元件焊接上去:
RAK439模块在这里:
RAK439的官方库是没有源代码的,编程有点麻烦。运行起来是这样的:
(扫描WIFI网络,加入WIFI网络,获得IP地址——其中“0xc0a80108”就是“192.168.1.8”)
然后它和Web服务器通信:
(发送请求给Web服务器,接收Web服务器的回应)
使用大功率电阻,测试电源:
安装到盒子里面:
最后完成:
5506
5506是一种光敏电阻,用它实现一个设备:远程开灯,远程确认灯已经打开(这样可以防贼)。全部搞定,然后安装到网上买的盒子里面……
最后版本的PCB:
(主要元件是:开关电源的芯片,EE13的变压器,ESP8266的WIFI,3V的继电器)
最后版本的PCB的另一面,其中“R6”,就是有弯曲线条的元件,是5506光敏电阻:
第一版的PCB:
第一版的PCB的另一面:
(第一版的PCB有根线出错,用刀片废掉后,飞线代替。变压器T1的插座很紧,插上去就能用,测试的时候没有必要焊接。)
经过调试之后,第一版的PCB安装到网上买的盒子里面:
手机登录这块板子的WIFI热点,可以配置WIFI参数。ESP8266的WIFI热点分配IP比较奇怪,是“192.168.4.*”:
设置好了后,就会看门狗重启:
STM8的代码很普通,只有一个地方要特殊处理:因为程序涉及网络操作,要求卡死数秒(时间比较长),然后看门狗重启,用定时器实现:
这是显微镜检查焊接:
(文字“R1”附近有两对引脚短路,是PCB设计时候连的线)
nRF52832
搞到nRF52832的模块,支持编程,连接到J-Link:
(四根线,没有“复位”线)
nRF52832的一个GPIO引脚连接LED:
编程前准备工作:
(恢复、擦除、写入SoftDevice)
手机蓝牙扫描到设备:
手机蓝牙控制LED:
(“LED Enabled”)
设备LED点亮:
手机蓝牙连接UART服务,发送数据,并且接收数据:
(发送数据为“liuzhiyong.me”,接收数据为“Reverse: 【发送数据倒序】”)
查看手机蓝牙的记录:
(从发送到接收用了17毫秒)
手机蓝牙和设备配对密码:
“BONDED”绑定好了:
“BONDED”之后,手机蓝牙发送和接收数据:
(发送数据为“123”,接收数据为“Reverse: 321”)
查看手机蓝牙记录:
(从发送到接收用了17毫秒)
如果没有密码,那么不能访问服务:
(尝试发送123“0x313233”,不能发送,没有响应,并且断开连接)
msmbps
msmbps可以测量本地到多个云服务的速度,用来选择机房非常方便。它是一个Web App,网址是 https://www.msmbps.com/
代码是开源的 https://github.com/msmbps/msmbps (https://github.com/msmbps/about 有签名)
最终效果的截图:
V File Name
这是一个C#的WPF应用程序,实现了有趣的UI界面效果,例如缩放:
例如表格:
代码是开源的 https://github.com/vfilename/vfilename (https://github.com/vfilename/about 有签名)
这个应用程序的网址 https://www.vfilename.com/
UTA0302
UTA0302是USB转I2C/SPI的工具,先用它驱动I2C的24C02,连线:
读取存储地址0x66的数据(0x88):
发送从机地址(0x50左移1位,所以A开头):
数据内容0x88:
这是时间点0,发送第一个比特的高电平:
接着驱动SPI的W25Q64,连线:
读取存储地址0x66的数据(0x88):
这是时间点0,发送0x03:
逻辑分析仪探测到非常短暂的低电平,应该是电磁兼容问题。
12864
12864是一种屏幕,我的这块屏幕的控制器是ST7920。先搞原理图,连接它的引脚:
然后移植代码,测试显示效果:
OV7670
OV7670是一种摄像头,先搞原理图,连接它的引脚:
摆放好摄像头,拍照:
在IAR里面获得图像数据(HEX文件):
用hex2bin工具把HEX文件转换为BIN文件:
用RAW Pixels工具加载BIN文件,查看效果:
(用的MCU是STM32F207ZGT6,内存有限,一次只能读取这些图像数据)
修改程序,变成两次读取,然后合并数据:
然后查看效果:
ESP8266
ESP8266用来让机器上WIFI,打算让STM8S207CB读取温度数据,再上传给Web服务器。搞定PCB,再把器件都焊接上去:
(右下角是LM75A温度传感器)
然后把ESP8266连接上去:
P2是ST-LINK端口(RST/GND/SWIM/VCC),把程序写入STM8。然后它就连上手机WIFI:
SRD03VDC
SRD03VDC是3V的继电器,用它控制220V电器。MCU就用前面的板子,读取温度,驱动继电器和蜂鸣器(前面的板子有两个GPIO连到4X2插座)。单面板PCB搞定:
(继电器面积比较大,在它PCB背面放置元件,节约PCB面积)
把元件都焊接上去:
然后把它连接到前面的MCU板子:
PT4455
PT4455是电磁波发射芯片,用它制作433MHz的电磁波发射模块,先搞原理图:
设计PCB:
最后完成:
(经过测试,能够满足短距离通信的要求)
480R
480R是电磁波接收芯片,用它制作433MHz的电磁波接收模块,先搞原理图:
设计PCB:
最后完成:
(经过测试,能够满足短距离通信的要求)
TOP221Y
TOP221Y是Power Integrations的开关电源芯片。用它制作AC/DC,先上180V交流电:
(输出是4.93V直流)
再上220V交流电:
(输出是4.97V直流)
然后上240V交流电:
(输出是4.98V直流——输入电压从180V变为240V,输出电压的变化只有0.05V,非常稳定)
EE25
EE25是一种变压器磁芯,用它搞AC/DC开关电源。首先制作开发板(关键元件都是插座形式,方便更换):
(稳压管的引脚太细,不能使用插座连接,所以电线焊接。同样很容易更换。)
然后制作EE25变压器:
再准备大负载5欧姆:
通电运行:
(AC输入220V,DC输出4.76V)
TDA2030A
ST TDA2030A是主要用于音频的运算放大器。打算用它制作一个简单的音响。先搞原理图:
主要就是让运放在负反馈工作,放大输入信号。接着搞PCB,几个元件Altium没有封装,要自己做封装。TDA2030A有DATASHEET,查阅后做封装:
(这个元件是向后靠的,也就是管脚不垂直)
电位器连DATASHEET都没有,用游标卡尺测量后做封装:
大电容测量后做封装:
终于设计PCB了,希望做成单面板(家里有制作单面板的设备),面积尽可能小。最后PCB设计成这样:
(贴片的元件在一面,插接的元件在另一面,这样非常节约PCB面积)
最后完成的照片:
再看看插接的元件:
(很明显,最大的失误就是没有考虑TDA2030A的散热片,所以有个电容必须“躺下”)
电脑通过这个设备播放音乐,音质非常好,远超我的预期。他奶奶的,音响公司肯定利润高呀。
BTA41600B
BTA41600B是ST公司的双向可控硅(TRIAC):
用它做导通角,用示波器测量负载:
(每个半周的后半截在负载上)
再用示波器测量双向可控硅:
(每个半周的前半截在可控硅上)
DB3
DB3是一种双向触发二极管(DIAC):
用示波器测量:
(击穿电压大约30V——电压剧烈垂直下降)
示波器测量串联的元件:
(电压剧烈垂直上升)
Multisim
“Multisim”是非常好用的电路模拟工具,先搞个“单电源运放”的模拟:
(放大倍数是5)
再搞个复杂点的模拟:
互补对称:
(交越失真)
使用二极管的压降弥补交越失真:
MATLAB
计算以下电路的“R3”电流:
(模拟软件已经给出结果)
使用“MATLAB”计算方程组:
(结果和模拟软件一致)
使用“MATLAB”可以直观看到傅立叶变换的效果:
(三个正弦,已经比较像方波了)
推导反馈的公式:
得到公式的结果:
可以有具体数值:
FreeRTOS
一个简单的RTOS实验,先配置4个线程、1个队列:
一个线程250毫秒闪烁LED:
另一个线程500毫秒闪烁LED:
还有一个线程1000毫秒闪烁LED:
按钮中断的函数发送123给队列:
线程从队列拿到123,就改变LED状态:
FreeRTOS UART
一个简单的RTOS收发实验,准备硬件(STM32F103C8T6板子、ST-Link、USB串口):
STM32CubeMX配置FreeRTOS:
STM32CubeMX打开UART中断:
手工创建收发的Semaphore:
手工初始化收发Semaphore:
接收完成的回调,执行SemaphoreGive:
接收线程的变量:
接收线程的死循环(中断型接收、SemaphoreTake等待接收好了、QueueSend把接收到的显示出来、if-else处理接收数据):
发送线程(QueueReceive拿到发送的数据、中断型发送、SemaphoreTake等待发送好了):
发送完成的回调,执行SemaphoreGive:
运行效果(输入数字,得到加123的结果):
IAP
做STM32的IAP(程序升级),先准备硬件(STM32F103C8T6板子、ST-Link、USB串口、另外PA11可选择连接GND):
(PA11连接插针,GND连接杜邦线,可以选择让此端口低电平)
准备启动程序(它负责升级用户程序),先把X-CUBE-IAP-USART主要文件弄进Keil工程:
如果PA11低电平,就进入IAP升级模式:
flash_if.h修改配置,让它合乎这个ST芯片:
稍微修改ST范例的UART代码,老代码不合乎新HAL:
准备用户程序,main第一件事就设置中断向量表:
配置一下用户程序的地址:
生成用户程序的BIN文件:
(没有BIN,生成BIN,列出BIN)
先写入一个闪烁LED的小程序:
再升级写入FreeRTOS_UART程序(一个有实时操作系统的UART程序,就是“FreeRTOS UART”小节):
运行起来了:
处理好Deinit,启动程序的菜单可以直接运行它,不必重启:
STM32
“STM3220G-EVAL”是ST公司的评估板,搞了个程序操作 FSMC LCD GPIO SD FATFS ETH LWIP HTTP,程序启动:
(LCD显示IP和LED初始状态)
然后用浏览器访问“STM3220G-EVAL”的IP,在网页中输入新的LED数值(二进制):
“STM3220G-EVAL”收到数据:
(控制了屏幕下方的LED,屏幕显示新的数据,并且记录到SD卡“LOG: OK”)
这时候取出SD卡在电脑上查看记录:
(最新的记录在文件的最后)
如果没有SD卡的时候,“STM3220G-EVAL”收到数据:
(SD卡在评估板的左上方,屏幕显示“LOG: NO”)
STM8
ST使劲给某公司的核心技术人员送开发板,希望选用他们的芯片嘛。最后根本用不了这么多,于是我搞到几块STM8S105S4-PKT。相关资料:
STM8S105S4-PKT原理图
STM8S105S4-PKT用户手册
开发板的照片:
(白色的线,还有面包板上的元件都是我加上去的)
面包板上添加了一个按钮,上拉电阻,滤波电容——连接到PA4。其他都没有改动。即使没有额外添加这些元件,代码照样运行,也就少了点功能。这块板子的晶振没有焊接,是可以扯下来更换的。我用的是8Mhz。
STM8操作 CLK GPIO ADC TIM2 UART I2C。几乎都是直接读写寄存器实现功能(I2C例外,因为它的寄存器比较复杂,所以用官方库搞定)。编译器用的Cosmic(4.2.4),开发用ST Visual Develop(4.1.2)。
通过RS232连接到开发板的参数:
然后接通开发板的电源,终端上显示:
(切换到HSE,一定时间内按回车键可以进菜单,TIM2每5秒调用ISR一次,读取ADC的结果是48%)
这个时候LED在闪烁,按下按钮就停止闪烁(可能是点亮的,也可能没有点亮,再按一次继续闪烁)。调整电位器可以让它闪烁频率改变(快到看不清,慢到非常低的频率)。终端的显示:
(调整电位器,6次按下按钮LED停止闪烁)
按下面包板上的按钮,GPIO中断会改时钟:
(LED闪烁频率变了,蜂鸣器音乐的音调变了,改时钟源的话TIM2频率变了。如果用的是内部时钟,扯下晶振后LED仍然闪烁。如果用的是外部时钟,扯下晶振LED停止闪烁)
搞了个作弊模式,按RESET再终端回车键,菜单里面选择1——这样不管LED怎么闪烁,结果永远是点亮:
I2C
将开发板上PE1(就是SCL)和PE2(就是SDA)连接到另一块开发板。电脑通过RS232发数据给I2C主模式的开发板,它再发数据给I2C从模式的开发板:
(数据内容是点亮左边的LED)
点亮中间的LED:
点亮左边和中间的LED:
示波器:
(起始条件,0x50,W,应答位,0x5,应答位,停止条件)
CD4069
一个UART信号,nRF芯片可以读取,USB-TTL不能读取。初步判断是电平的电压问题,用CMOS的CD4069解决:
(RX通过两个CMOS的非门连接到USB-TTL的接收引脚USB_RX,其他输入引脚确保有固定电平)
暴力焊接:
胶枪固定到USB-TTL:
另一面:
(老的接收引脚剪掉,然后“自发自收”测试)
ST24512
ST公司的24512芯片是512千位(64千字节,0x10000字节)的EEPROM。这芯片只有8个脚,虽然家里就能制作单面板,还是决定直接焊接:
(VCC连接到STM8S105S4-PKT开发板的5V,VSS连接到开发板的GND,SCL/SDA连接到开发板上芯片的SCL/SDA,其他四脚浮空)
然后读写数据:
(在地址0写入10字节的“0123456789”,从地址0读取10字节,在地址5写入3字节的“ABC”,最后从地址0读取10字节)
EEPROM断电再通电,数据不会丢失:
(断电后通电,读取地址0的10字节)
LM75A
NXP公司的LM75A是温度传感器,分辨率为 0.125 °C,精度为 ±2 °C(一般情况下,也就是 −25 °C 到 +100 °C)。暴力焊接:
(A0 A1 A2 连接到VCC,所以I2C地址是0b1001111)
读取温度数据(两个字节):
空调制冷后,再次读取温度数据:
(温度下降了 3 °C)
SIM900A
SIM900A是SIMCOM公司搞的一个GPRS模块,让机器连接到手机网络。它的开发板:
然后RS232连接电脑,先测试一下AT命令:
(其中“223.5.5.5”和“223.6.6.6”是阿里巴巴的DNS服务器,算是国内很好使的;最后的命令是查询域名“www.qq.com”的IP,确认已经在线)
把初始化搬到STM8上:
(“sim900a_AT”第一个参数是AT命令,第二个参数是期待的响应)
最终STM8通过SIM900A和Web服务器通信,自己通过手机访问网页来远程控制。
DAC
用PWM做DAC,电路要添加滤波:
(二阶RC低通滤波器,输入是PD3,也就是TIM2_CC2,输出是“DAC”标签的线)
占空比100%……
(开发板用78XX稳压到5V,实际上有误差;而STM8的输出又要略低于芯片VDD)
占空比50%……
占空比25%……
SPI
示波器:
设置……
主设备:STM8用8Mhz的HSE
时钟频率:fMASTER/16(8Mhz/16=500KHz,示波器测量5个周期的频率是100KHz,也就是1个周期500KHz)
时钟极性:空闲状态时,SCK保持低电平
时钟相位:数据采样从第二个时钟边沿开始,就是下降沿
帧格式:先发送MSB
(数据长度是1个字节,数据内容是0b00000101=5)