前言
本文的用途
最近感觉对STM32开发最基本的东西稍微有点上手了,想要开始找工作,打算把毕业设计的内容写出来(其实基本上是把我毕业论文的内容搬上来),然后简历上写个概述留个链接方便用人方查看详细内容。
毕业设计背景
我们学院的实验室里有一堆某个公司送的实验箱一直在柜子里吃灰,直到有一天我的指导老师把它拿出来用了一下,欸,感觉还可以,再加上手上也有人家给的一些资料,于是想把它用作教学。不过有一个问题是实验箱上的主控芯片是ATmega128,是AVR内核的(开发软件用的AVR Studio),我们学校的单片机教学只教C51(用keil C51开发)。实验箱上的主控芯片在一个小板子(一个最小系统板)上,这个小板子通过排针和实验箱上的排母连接,它这个设计很明显就是让MCU可以换的。那么要做的事就很明显了,画一个C51的系统板代替原来的系统板,并写相应的程序驱动实验箱上的外设,于是我的毕业设计内容就这样诞生了。
硬件设计
需求分析与单片机选型
首先明确应用需求,也就是看看原来的系统板是个啥功能,它那些引脚都是干啥的,这样子可以确认替换它的芯片要些什么资源。原芯片引脚及其功能如下:
在这些引脚中,JTAG接口我打算放弃,新的系统板将没有JTAG接口,引脚中只有两个串口对片上外设有要求,其他的都可以用普通IO来实现。这样就得到单片机选型的要求:2个串口,50个IO口,速度和功耗方面也没什么特殊要求。我打算购买STC公司的芯片,他们的芯片在国内用得还算多(尤其是教学),资料应该挺丰富的,况且我们学校教学的时候就是用的他们的STC89C52。他们的stc-isp软件有提供选型功能,打开stc-isp选型,选了个STC15W4K32S4。
原理图与PCB图绘制
查看STC15W4K32S4数据手册发现值得注意的一些特点: 1、内部高可靠复位,ISP编程时16级复位门槛电压可选,可彻底省掉外部复位电路 2、内部高精度R/C时钟,ISP编程时内部时钟从5MHz~30MHz可设置 3、不需外部晶振和外部复位,还可对外输出时钟和低电平复位信号 4、芯片上电后所有与PWM相关的IO口均为高阻态需将这些口设置为准双向口或强推挽模式方可正常使用 5、开发环境:在KeilC开发环境中,选择Intel8052编译,头文件包含<reg51.h>即可[11] 6、对指令集及其实现进行了优化,指令的速度是传统8051的12倍,写涉及到软件延时的程序时需要注意(内核是在传统8051上进行了修改,STC取了个名字叫STC-Y5内核)
(STC官网和他的数据手册前几页风格真是…以前接触的少觉得没啥,还以为大家都这样,后来看过一些别的IC手册和别的厂商的官网之后发现原来只有他们家的风格是这样的…)
大二的时候学过Protel99,不过忘得差不多了,想重新学习于是问指导老师有没有什么建议,他推荐我用立创EDA,这个简单些,于是花了两天熟悉了一下立创EDA画图的基本操作。然后我参考数据手册里的最小系统电路在立创EDA上画了原理图和PCB(实际上原理图我就是画了电源线和USB转串口电路,然后简单地加了个电源开关和指示灯,画PCB图基本就是打过孔连线…)。
画完后我的指导老师看PCB还有挺多空间的,就在原理图里加了两个按键和一个蓝牙模块,我的毕业设计不需要用到,这是为以后可能的应用而加上去的,然后我重新画了PCB图(下图中有飞线提示说还有网络没连,这个在实验箱上面是连起来的,所以这里可以不连,连的话好麻烦;另外这里把铺铜取消显示了,实际上有GND网络的铺铜)。
因为是要替换原有的板子,板子大小和几个排针之间的相对距离比较严苛,稍微有些误差可能就插不进实验箱的插孔了,所以用数显游标卡尺量好尺寸后把PCB图按实物大小打印出来对一对,确保打出来的板子就可以对的上实验箱。
元器件焊接与测试
从原理图中导出了物料清单,然后购买元器件,如果元器件没有现货的话可能会需要等非常久才能有货,所以元器件优先选择现货供应的。PCB是在嘉立创下单制作的。元器件买好,PCB也制造完后就可以开始焊接了,元器件基本都是贴片,用锡膏和加热平台焊的正面,反面以及排针就只能锡丝加刀头电烙铁焊了,感觉锡丝有点粗,不太好焊。 焊的第一块板子出了问题,下载不了程序,排查了好些时候感觉应该是单片机(可能是焊的时候加热时间太长?)出了问题或者USB转串口焊接有问题。 焊的第二块板子的USB转串口有问题,但是看原理图和PCB总感觉没问题(像TXD、RXD有没有搞反、驱动有没有安装之类的常见问题都检查了一下),依然没有定位问题原因…
手上的物料只够焊两块板,那只能用下载器(核心就是一个USB转串口模块)直接连芯片引出的VDD、GND、RXD、TXD来下载了,下载了一个自己写的非常简单的点灯程序,然后把板子插到实验箱上,可以正常工作。后面我都是用下载器下载程序然后插到实验箱上验证。
其他
我的导师对我画的PCB图进行了调整,把电源线调粗了,滤波电容靠近电源引脚放置。 总的来说我对硬件设计并不怎么了解,只能看懂一些简单的逻辑功能并且连一连线。 这个硬件设计并不完善,目前而言发现了以下问题:USB转串口无法正常工作、IO驱动能力无法开启LCD的背光灯(解决:我后面把这个引脚接到5V电源上)、RESET引脚作普通IO输出的电平不稳定(解决:我后面换了其他IO口)、蓝牙模块的PCB封装与实际尺寸有出入(实际焊的时候没焊蓝牙部分的电路,在EDA上面重新画了封装)。按理来说应该需要重新画图焊板的,但是时间和物料都有限,STC15芯片只买到两片(不知道是不是这个芯片没什么人用,淘宝问了好几家都没现货,本来是打算买5片的,毕竟嘉立创打样5块钱5片PCB板),板子能用就先把功能先实现。
软件设计
总体框图如下: 其中与NJU6676芯片(LCD12864的液晶驱动IC)和AD574A芯片(ADC芯片)的通信需要查看IC数据手册中的读写时序并以此控制I/O口来进行通信。接下来对键盘、LCD12864、ADC分别进行介绍与软件测试。 要实现的功能:按键更改AD采样率,屏幕画点显示AD采样值。
按键
首先按键部分的原理图如下: 键盘的控制芯片是广州周立功公司的ZLG7290B,其中跟MCU连接的引脚是SDA、SCL(IIC通信用,ZLG7290B的从地址是0x70)、INT_K(有按键按下后会拉低,键值被读出后会被硬件拉高,接单片机中断引脚,也可以接个IO引脚循环读取,我这里接的是外部中断0)、/RST(持续一段时间的低电平可以让ZLG7290B复位)。下载了ZLG7290B的数据手册看了一下,这里大致介绍一下:
ZLG7290是I2C接口键盘及LED驱动器,可驱动8位共阴数码管或64只独立LED和64个按键,可控扫描位数可控任一数码管闪烁,提供数据译码和循环移位段寻址等控制,8个功能键可检测任一键的连击次数,无需外接元件即直接驱LED可扩展驱动电流和驱动电压。
尽管该芯片有驱动LED的相关功能,但本设计并未涉及,所以只介绍键盘部分(LED控制相关的功能和寄存器就不必在意了)。
ZLG7290可采样64个按键或传感器可检测每个按键的连击次数其基本功能如下
- 键盘去抖动处理
当键被按下和放开时可能会出现电平状态反复变化称作键盘抖动,若不作处理会引起按键盘命令错误,所以要进行去抖动处理以读取稳定的键盘状态为准。 - 双键互锁处理
当有两个以上按键被同时按下时ZLG7290只采样优先级高的按键(优先顺序为S1>S2>…>S64,如同时按下S2和S18时采样到S2)。 - 连击键处理
当某个按键按下时输出一次键值后,如果该按键还未释放,该键值连续有效,就像连续压按该键一样,这种功能称为连击。连击次数计数器可记下连击次数。 - 功能键处理 功能键能实现2个以上按键同时按下来扩展按键数目或实现特殊功能,如PC机上的“Shift”“Ctrl”“Alt”。
ZLG7290B寄存器介绍
-
键值寄存器(Key)地址01H,复位值00H,Key表示被压按键的键值,当Key=0时表示没有键被按压。 -
连击次数计数器(RepeatCnt)地址02H,复位值00H,RepeatCnt=0时表示单击键,RepeatCnt大于0时,表示键的连击次数,用于区别出单击键或连击键,判断连击次数可以检测被按时间。
ZLG7290的I2C接口传输速率可达32kbit/s,ZLG7290的从地址(slaveaddress)为70H(01110000B)。芯片上没有硬件IIC外设(好像STC的芯片都没有硬件IIC,选型那里都没看到IIC的资源),所以我找了C语言模拟IIC的程序来用。读取键值的程序是这样的:
unsigned char Read_Keyboard_Value()
{
unsigned char num;
I2cStart();
I2cSendByte(0x70);
respons();
I2cSendByte(0x01);
respons();
I2cStart();
I2cSendByte(0x71);
respons();
num=I2cReadByte();
I2cStop();
return num;
}
写这部分程序的时候其实遇到了问题,就是怎么都读不出键值,后来把iic的延时增加了就可以了,ZLG7290B数据手册里写着最高通信速率32kbit/s。之后把键值通过串口发送到电脑的串口助手显示,测出每个按键的编码值。
按键:IIC读出的键值
1:0x04 2:0x0C 3:0x14 4:0x1C 5:0x03 6:0x0B 7:0x13 8:0x1B 9:0x02 A:0x0A B:0x12 C:0x1A D:0x01 E:0x09 F:0x11 O:0x19
LCD12864屏幕
先看看LCD屏的原理图: 我一开始单片机选型时也看了这里,看到这30引脚的LCD还挺惊讶的(网上搜资料LCD12864模组基本是20脚的),还问老师能不能拆一下LCD屏,我看看它型号写的啥,想找找它的资料。结果拆了一下发现要把整个实验箱拆了才行,非常麻烦,想了想感觉各个引脚的意义都知道了(看了原理图,RL为高电平是打开背光灯,/CS(低电平有效)用于使能液晶显示屏,/WR(低电平有效)是LCD写引脚,/RD是LCD读引脚,A0是LCD数据/指令引脚(0代表指令,1代表数据),/RST是LCD复位引脚,DIS0~7是LCD数据/指令输入或读出的引脚。),LCD12864之间应该都没太大区别,顶多就是有的屏幕控制芯片存储够大带了字库,写程序应该没太大问题,实际写的时候才发现原来显示控制命令是没有统一标准的,不同的控制芯片可能不一样!好在这时候老师手上的资料就发挥作用了。资料里有这个产品的源程序,用了μCOS-II操作系统,这个源程序文件还挺多,但是没有关系,找到main函数顺藤摸瓜找到LCD初始化的部分,发现LCD初始化那里有一段注释“// F-51852”,我寻思着这不是LCD型号就是芯片型号,搜了一下发现是LCD,30引脚的,好像已经停产了(顺带一提,这个实验箱应该是2007年左右设计的,老古董了。另外,我是在Visual Studio Code里面阅读的代码,在keil里面找代码比较麻烦…)然后我在网上找到模组的说明手册,里面有这么一张图:
这样就知道主控芯片的型号是NJU6676,新日本无线(NJR)制造的,找到它的数据手册,看了一遍。NJU6676大致介绍
NJU6676是一个位图LCD驱动芯片来显示图形或字符。它包含8580位显示数据RAM,微处理器接口电路,指令解码器,132段驱动,64公共驱动和1图标通用驱动。位图像显示数据通过串行或8位并行接口显示数据RAM。可显示65x132点图形。 要显示什么内容直接往Display Data RAM里面写就好了。(配合换页与换列命令) 读写时序(实际上我只写了数据写入驱动,因为不需要读数据)至于写入的是命令还是数据则由前文所述的A0引脚的电平来控制。
然后剩下的就比较简单了,就是配置LCD芯片的寄存器以使其初始化(话说最近看了TFT屏幕的液晶驱动IC手册,联咏的NT35510,真的头大,比这个复杂好多,初始化代码要模组厂商提供,毕竟里面电源控制相关的寄存器该如何配置我们无从得知),用字模软件得到字符的数组,写一写显示字符的程序,用开发板测试了一下屏幕(测试的时候第二块板子还没焊,所以先用开发板把程序先写好验证好): 关于画点程序实现:
void LCD_Display_Wave(unsigned char wave_data)
{
static unsigned char wave_column=0;
unsigned char i=0;
for(i=0;i<8;i++)
{
Lcd_Write_Command(0xB0+i);
Lcd_Write_Command(0x40);
Lcd_Write_Command(0x10+wave_column/16);
Lcd_Write_Command(0x00+wave_column%16);
Lcd_Write_Data(0x00);
}
Lcd_Write_Command(0xB0+wave_data/32);
Lcd_Write_Command(0x40);
Lcd_Write_Command(0x10+wave_column/16);
Lcd_Write_Command(0x00+wave_column%16);
Lcd_Write_Data(0x01<<((wave_data%32)/4));
wave_column++;
if(wave_column>=132)
{
wave_column=0;
}
for(i=0;i<8;i++)
{
Lcd_Write_Command(0xB0+i);
Lcd_Write_Command(0x40);
Lcd_Write_Command(0x10+wave_column/16);
Lcd_Write_Command(0x00+wave_column%16);
Lcd_Write_Data(0xFF);
}
}
效果(这里的波形是MCU直接对一个数递增、递减然后送给画点函数得到的)
ADC
原理图: 我看了AD574A的数据手册,结合实验箱的硬件连接确定读取数据的时序: 这两种都可以,我两种都用了一下(ADC开启转换的条件是R/C出现下降沿)。写了个程序把AD采集数据通过串口发送到电脑测试了一下(采样率用定时器控制,测量范围是+5V~-5V),效果: 然后把前文的键盘、LCD、AD转换结合起来,配合实验箱上带的信号发生电路(这是一个波形生成电路,可输出正弦波、方波、三角波,只需要调一调电阻电容和就可以改变输出信号的频率,幅度是固定的。原理图里面有个引脚连到DAC芯片的那个是低版本的原理图,我也是后来才发现有另一个版本,一开始还奇怪怎么原理图的DAC芯片怎么在实验箱上面找不到。),实现以下功能:
AD采集信号发生电路的电压并转换为数字信号;LCD屏幕可以显示采样率或者波形;键盘可以切换LCD的显示,并在显示采样率时可以切换采样率。 效果: 显示AD采样率(此时可更改采样率) 较低采样率效果 较高采样率效果
其他
这个实验箱的教学目标主要是教一些放大电路和滤波电路(实验箱上面有一些电阻电容、放大器构成的放大电路和滤波电路,有一些电阻是可调的),上面还有一些接生理信号传感器的接口,这些生理信号可以通过连线送入到不同的滤波电路。LCD就是用来显示这些过程中的电压信号的,想显示哪里的电压就把哪里的插孔连到AD采集的插孔。
它有个实验箱说明书,一开始我以为是跟开发板的教程一样会介绍各种板载资源,后来一看基本是放大电路和滤波电路介绍…
也不知道这实验箱现在有没有拿出来用…
|