面试 | #纸张计数显示装置项目#

嵌入式项目(不定期更新)

项目介绍

这个项目是校赛的一个项目,当时我们参加校赛有两种参赛方式,一种是从往年真题里选题制作,另一种是自主命题。当时我们小组都没有什么嵌入式开发的经验,所以就选了这个相对容易的控制类题目,这个也是我们第一次真正地去说接触一个嵌入式相关的项目。这个项目我们使用了STM32F103作为主控芯片,FDC2214作为主要的检测装置还有其他几个外设组合完成项目的一个实现要求,最后校赛结果测量能够达到40多张。

小组分工合作

校赛和省赛我都是担任组长。然后在校赛完成纸张测量的项目,我完成FDC传感器的配置,数据的测量和处理,主控芯片的一个业务逻辑代码编写。组员A完成的是矩阵键盘、OLED、蜂鸣器还有装置的一个设计。组员B由于某些原因,在校赛和省赛中参与度并不高。

项目的重点难点

这个项目的重点和难点我觉得主要有三方面。一个是FDC2214的使用,参考官方手册一开始不仅是全英文而且寄存器数量多,且换算为电容的公式较为复杂,我觉得这是一个难点。第二个是数据的处理拟合方面,如何将测量的数据通过数据拟合得到函数曲线实现更好的效果。第三个我觉得是装置的设计,因为在操作过程中装置很容易受影响,导致测量数据不准确。

遇到什么难题?怎么解决的?

首先就是一开始选材的问题,因为装置搭建对于测量的精度影响也是很大,在整个装置的设计中我们一开始就讨论了很久,一开始是采用的亚克力板作为底板,上面承载着使用黑胶布固定的各模块。后来发现在进行按键操作还有纸张存放的时候,由于底板太薄容易导致变形(极板上面为了压缩纸张空隙,加了一个变压器),在我们多次测量之后已经明显发现底板明显变形而且线路容易松动。最后我们决定用PP板还有热熔胶作为固定的工具。第二个的话是FDC传感器的上手,虽然资料多,但是更多的是官方数据而且是全英文,寄存器多而且公式换算复杂,一开始花了我很多时间才看明白那个手册,现在想起来光是理解手册我就看了五遍左右了,后面按照自己的理解去设置寄存器的时候也出差错,通过不断地试错、查资料最后才配置好FDC的初始化,然后通道数据的处理也是个难题,一开始使用的是分段拟合,但是由于拟合结果太精确,测量受环境影响比较大,导致如果一段范围内有偏差,则一整段范围都失效。所以后来为了解决这个问题,我是用多次取值然后去除最大最小取得平均值作为测量结果再去拟合,使得测量数量初步达到30张。

选用什么材料

根据题目的要求,我们选择了两块极板作为一个可变电容器,FDC2214作为电容电路的检测传感器,极板和电容传感器之间通过两条导线和通道相连,STM32作为主控芯片,剩下的还有源蜂鸣器和OLED显示屏。然后整个装置是搭在一块比较厚实的PP板上,线路之间的连接还有仪器的固定我们采用热熔胶将其固定。

为什么使用FDC2214

这个赛题是要求说检测纸张,但是题目要求里也给我们提示了,可以将纸张数量转换为对应的电容来进行测量,然后电容传感器性能比较好的就是FDC传感器,而且之前也有人用来作为手势识别的一个应用,有较为丰富的参考资料。总的来说就是既满足要求,又相对容易上手。

FDC2214的原理是什么

参考TI官方手册的话,看电路原理简化图可以看到,在检测通道的内部其实是有一个LC谐振振荡电路,通过外接电容来改变电路整体的一个谐振频率(高频电子),以此来测量所得电容。然后这个赛题又是改变纸张数量,也就是通过改变极板间的间距来改变电容,从而区分不同的纸张数量。

FDC2214的一个业务处理

首先是进行FDC2214的一个寄存器初始化操作。根据手册可以得到各个寄存器的地址,然后根据手册的介绍进行各个寄存器的一个初始化。初始化完成之后就是等待用户调用读取通道数据的一个接口。

STM32主程序的逻辑部分

在STM32里,我借助HAL库实现单片机的系统时钟、I2C、SPI、IO口等的初始化工作(通过图形化界面自动设置),主要完成的其实是程序的业务逻辑。主函数里实现一个循环,通过矩阵键盘读取用户的输入,匹配到对应的函数执行相应的操作。比如说测量纸张、预校准、返回主菜单。返回主菜单的实现比较简单,对OLED进行清屏并且重绘,接着就返回主函数。预校准采用的是数组存储需要校准的数据,先是正常测量纸张数量,然后将对应的频率和用户输入的纸张数量分别存放在两个数组中。这是我之前的设计,现在看来其实有很大的改进空间,可以通过哈希的方法将其降低到一个数组的开销而且可以实现O(1)复杂度的查找(以纸张数量作为下标索引,值为频率)。然后是测量纸张的函数,通过FDC测量所得的数据,经过函数曲线计算得到纸张数量,然后再在预校准数组里查找一个与其相差不超过一定阈值的频率,找到的话就认为该纸张数量经过校准,需要将其代替函数曲线拟合得到的结果进行输出。

为什么使用STM32

使用该单片机是因为相关资料多,而且价格低廉,性能也能够满足。更重要的是官方支持的库很丰富,不需要通过寄存器对单片机进行操作,官方提供了标准库还有更容易上手的HAL库,而且支持图形化界面的一键配置参数,这个对于当时零基础的我们很合适。

了解I2C协议吗

I2C协议是两线串行通信协议,支持主从机之间的半双工通信(同一时刻只能单向通信),任意时刻只能有一台主机但是可以有多台从机,其传输速率较慢,传输数据时是从高位到低位(大端模式)。两条总线,一条是串行数据线SDA用来传输数据,一条是串行时钟线SCL用来控制电路的时序,两条总线都需要上拉电阻将其拉到高阻态(开路)避免影响其他设备之间的通信。发布命令称为主机,接受命令称为从机。启动信号是时钟线在高电平期间,数据线由高电平跳转到低电平,结束信号则刚好相反。在数据传输的时候,当时钟线位于高电平时,数据线不能发生任何电平跳动,同时在数据线发送完8位数据时,会发送一个应答位作为结束标志。I2C通信地址是7位从机地址一位读写位。0写1读。先传送地址接着进行数据传输。项目我是采用硬件I2C和HAL库,实现传输只需要指定I2C地址和数据内容即可。

了解SPI协议吗

SPI协议是串行外设接口协议,是一种高速、串行、同步全双工(具有时钟线进行同步,以及单独的发送接收线实现全双工),支持主从设备(一主多从)之间通信的通信总线。其数据传输采用三条总线和一条片选线,分别是SCK信号线控制数据传输的时序(由主机设备产生),MOSI主输出从输入数据线用于主机设备发送数据,MISO主输入从输出数据线用于从机设备接收数据,CS片选线用于选中数据传输的从机设备(低电平有效)。传输数据时高位在前,低位在后。每个SPI时钟周期都会发生全双工数据传输,即使没有数据需要发送。时钟极性控制空闲时时钟线的高低电平选择,时钟相位决定数据传输时采样是在第一个跳变沿还是第二个跳变沿。

说一说串口通信

串口通信是通过UART通用异步接收器进行数据传输的。采用的是串行通信方式,通信双方遵循相同的通信方式,起始位校验位结束位和空闲位划分一组数据。数据的发送是从低位到高位。(波特率是每秒传送的二进制位数)

有进行调试吗?怎么调试的?

有。进行调试操作我是通过stlink加openbcd片上调试还有串口打印进行调试。具体的话,我一开始是帮助我组内成员进行一个OLED的调试,一开始的话我是采用片上调试打断点帮我成员调试字符显示,这里还因为OLED遇到了点问题,就是打断点时会影响OLED的正常显示导致显示错乱,后面发现是OLED的问题换了就好。还有另一个用串口调试的就是矩阵键盘的输入,需要验证程序的正确性,将读取的输入通过串口打印到终端上验证。然后因为有了OLED,所以在调试测量FDC传感器的时候,有用过上位机但是其频率测量波动较大不稳定,我就直接使用OLED输出测量数据也不用通过串口去打印数据。

数据是怎么处理的?怎么将测量的频率转换为电容?使用什么进行拟合操作?

FDC测量得到的数据是传感器频率(通道LC谐振电路产生且分频的频率)和参考时钟频率(主时钟信号分频之后的频率)的比值。在这个项目里我并没有将其转换为电容值去进行计算拟合,而是采用取巧的方式,项目的目的是为了测量纸张数量,而纸张数量又和测量出来的比率存在一一对应的函数关系,所以这里我省略了通过手册的电容转换计算公式,直接将其频率的比值和纸张数量两者之间建立函数关系,在matlab上通过多项式拟合得到函数关系曲线,最终得到的是一个一元四次方程。在数据处理的过程中,一开始使用的是分段拟合,但是由于拟合结果太精确,测量受环境影响比较大,导致如果一段范围内有偏差,则一整段范围都失效。所以后来为了解决这个问题,我是用多次取值然后去除最大最小取得平均值作为测量结果再去拟合

#百度#
全部评论
基础平台研发上海有岗位吗
点赞 回复
分享
发布于 2020-01-16 23:02
m
点赞 回复
分享
发布于 2020-01-16 23:09
联易融
校招火热招聘中
官网直投
请问一下,基础平台研发工程师具体工作内容是什么啊
点赞 回复
分享
发布于 2020-01-17 23:34
感谢,已投
点赞 回复
分享
发布于 2020-01-18 09:55
请问base哪里
点赞 回复
分享
发布于 2020-01-19 01:12

相关推荐

1 12 评论
分享
牛客网
牛客企业服务