简介
RAM 是计算机系统中保存临时结果的器件,它的大小也决定了计算机处理数据的规模。在嵌入式计算机(单片机中),由于受到价格、功耗等原因,内部的 RAM 的容量往往比较小,比如从几百字节到十几 k 字节不等。这能够满足大部分单片机应用的需求了。
但是在一些特殊的应用情况下,有时需要大容量的 RAM 来存储采集到的数据,或者缓存通信数据。此时则需要通过外扩内存来完成。比如最近实验声音信标信号[1]相关系统测试和算法优化,则需要采集到多路音频信号。此时需要通过外扩 RAM 来解决。
通常静态 RAM 芯片接口包括有数据、地址和控制总线,与单片机对应的端口相连便可以加成数据的写入和读出。
▲ MCU 外部 RAM
有的单片机在扩展外部 RAM 的时候,为了节省有限的 IO 端口,通过使用外部锁存器来复用同一八位地址端口来扩展地址总线到 16 位的目的。比如 8051 单片机。这样设计的代价就是需要增加外部锁存器芯片 74LS372。
▲ 8051 外部数据总结接口
虽然数据总线和地址总线按照逻辑都标有数据位的顺序:比如 16 位地址总线按照 A0~A15,8 位数据总线表明 D0-D7。但是在访问静态 RAM 的时候,数据总线,地址总线内部的这些位的顺序是可以任意调整的。
比如在下面设计的单片机系统中,为了满足能够尽量减少 PCB 布线的交叉,就是通过调整数据线和地址总线内部位的顺序来满足的。
扩展 STC8H8K 外部 32k 字节 RAM
1. 设计说明
STC8H8K 单片机具有 16 路 12 位的 AD 转换器,在本实验中用于采集信标发出的 Chirp 声音,并传送给计算机加以处理。
在博文“基于 STC8G8K64U 三通道高速 ADC 采集板[2]"给出了利用 STC8H8K 内部的 8kRAM 进行声音信号采集电路设计方案。但是受限于内有 8KRAM 的空间限制,所能够采集音频信号的路数和时间长度都无法满足研究的目的。所以此次通过外部扩一片 32k 字节的 SRAM 来扩展信号采集的容量。
同样通过 WiFi-UART 转换模块,实现采集数据与 PC 机之间的数据传送,这一点设计与前面博文中的设计方案是一致的。
2. 原理图
所使用的 STC8H8K 芯片的封装为 TSOP48。使用 P2 端口作为数据总结,使用 P0,P4 端口作为地址总线。不需要外部的锁存器。
使用 UART3 与 WiFi-UART 模块通信。将 ADC 中的 AD0~AD2 引到输入端口接收外部被采集的信号。
具体的电路图如下图所示:
▲ 实验板的原理图
外部接口设计:
(1) ISP 端口:
序号 | 符号 | 功能 |
---|---|---|
1 | VCC | +5V 工作电源 |
2 | GND | 工作电源地 |
3 | TXD | MCU 串口输出 |
4 | RXD | MCU 串口输入 |
(2) ADC 端口:
序号 | 符号 | 功能 |
---|---|---|
1 | ADC0 | ADC 通道 0 |
2 | ADC1 | ADC 通道 1 |
3 | ADC2 | ADC 通道 2,可以作为普通 IO |
2. PCB 板
这里需要需要说明的是,为了能够适应快速制版的实验需要。使用了单面 PCB 板工艺。为了消除在布线中的交叉部分(因为交叉部分则需要过孔和双面布线),对数据总线和地址总线的顺序进行了调整,由此可以仅仅使用一面 PCB 便将所有的数据和地址总线完成连接。
下面给出了具体的 PCB 连接方式。前面原理图中显示了调整后(总线错乱)的地址线和数据线的逻辑设计。
在实际电路设计工程中,有的时候为了方便布线,需要对引线的顺序进行调整。在复杂电路设计中,优势会通过 FPGA、CPLD 等大规模可编程逻辑器件来对芯片外部引线的顺序进行调整,方便进行布线。当然这也需要付出设计的复杂度和额外增加的芯片价格。
硬件调试
1. 扩展 RAM 实验
通过设计,电路板腐蚀、焊接与安装,很快得到实验电路。下面对其进行测试。
▲ 通电之后的实验电路板
STC8H 单片机硬件编程选项配置如下:
▲ 单片机编程硬件选项参数
单片机工作的主要指标:
- 内部工作主频:40MHzISP UART1 波特率:500000bps;WiFI-UART 波特率:460800bps
(1)访问外部 RAM 时间长度
使用 MCU 的端口来测量访问外部 RAM 的时间,下面是测量写入外部 RAM 的时间,为 534ns(包括对 FLAG_PIN 的操作时间。)
ON(FLAG_PIN);
ExtSramWrite(0x0, 0x0);
OFF(FLAG_PIN);
▲ 写入外部 RAM 数据时间长度
使用相同的方法,测试 ExtRamRead()的时间为 490ns。
2. AD 转换实验
(1)AD 的通道设置:
使用了 P1.0, P1.1 来采集两路外部模拟信号。
▲ ADC 通道设置
(2)AD 转换时间:
- AD 参数设置:STC8H 内部转换启动 AD 转换时间:通过 ADC2(P1.4)输出脉冲来测量。测量结果:两次 ADC 转换,时间为 5 微秒;
▲ P1.4 脉冲表明两次 AD 转换之间的时间
ON(FLAG_PIN);
ADCSetChannel(0);
g_nADResult1 = ADCConvert();
ADCSetChannel(1);
g_nADResult2 = ADCConvert();
OFF(FLAG_PIN);
采集实际信号
1. 采集两路测试信号
下图显示了采集两路测试信号的波形:
2. 采集 Chirp 音频信号
采集两路分别来自于调频接收模块以及麦克风传感器的 Chirp 信号并求取它们的相关信号,来判断时间延迟。
下图是采集到的声音信号,长度为 0.8192 秒。包含了两个 Chirp 信号周期的数据。
▲ 采集的 Chirp 声音信号使用相关运算,获得两个信号之间的相关信号。
▲ 两个信号的相关信号
通过判断中间峰值的位置,可以获得声音传播过程中的时间延迟:
▲ 两个信号的相关信号中心位置波形
公众号留言
卓大大,实话实说,这次比赛实在是太太太太太赶了,学校大概六月初左右返校,然后还要准备期末考试。我们队伍参加的是直立节能组。别的组别或许还可以在没有仪器的情况下就把车做出来,但是我们是万万不可能的。充电板和车模一旦有一点问题更正周期是以周计算的,按照以往学长的进度,正常比赛留给软件调试的时间也不过就是半个月左右,现在准备时间压缩到两个月,这次规则的软件又比以往都要难一些,感觉除非开学之后每天通宵,不然实在是不能确保小车的稳定性。
求大大考虑考虑节能的兄弟们。
回复:现在,我只能说:兄弟们加油。
卓老师好,深夜打扰。请问这款芯片可以在信标组中使用,还是说只要涉及到控制的微处理器都要用 infineon 的呢?
▲ 电机控制单片机
回复:这款芯片如果只是专用于电机驱动设计,不参与其它运动控制,是可以应用到信标组别的。
卓老师,我听说了一种想法,有些同学在群里讨论用 1064 自制 openmv,事实上偷偷用 1064 跑信标,我虽然没有验证过可行性,但是不希望有这种想法伤害到比赛的公平性,也不愿意看到 openmv 因此而被禁止,所以也跟卓大提及一下这种想法。
再提出一个建议:音标比赛只允许使用成品 openmv
▲ 自制的 OpenMVP 模块
回复:谢谢你反映的这种情况,以及提出的建议。
参考资料
[1]声音信标信号: https://blog.csdn.net/zhuoqingjoking97298/category_9689868.html
[2]基于 STC8G8K64U 三通道高速 ADC 采集板: https://zhuoqing.blog.csdn.net/article/details/105731860