一、项目背景 本项目是在原有的《小水电站远程控制》项目基础上实施的,远程控制是通过互联网摄像机远程查看水位情况,然后用手机APP通过网络继电器来控制水轮发电机组进水闸门的开大或者关小。相关的电气、机械部分是早已完成了的,本项目是在原来的基础上增加单片机控制模块,自动根据水位情况来调节进水闸门,取代原来的人工操作。增加的单片机控制模块只要能按照水位情况输出开大或者关小的电信号,就可以通过已有的中间继电器来控制进水闸门。 项目由两大部分组成,一是安装在进水池的水位监测装置,另外就是安装在机房的自动控制装置,安装在进水池的水位监测装置也已完成,是用51单片机通过超声波模块检测进水池的水位变化,然后将相关的水位信息传输到机房,传输的信息内容由仪器安装高度和当前水位两项组成,数据的格式为“#XXX*YYYc”,其中XXX是仪器的安装高度(单位cm)、YYY是当前的水位(单位cm)、c是和校验码,传输的频率是大约0.8秒左右一次,传输的方式为有线或无线。本项目重点是安装在机房的自动控制装置。
二、项目方案 本项目主要由基本设置模块、显示模块、数据接收模块、数据处理模块和输出控制模块组成,各模块之间关系的框图如下:
1、基本设置模块 本模块是提供给用户设置标准水位和偏差范围两项数据使用,通过八位DIP拨码开关(实际使用七位)分别接在PB0~PB6引脚上,其中PB0~PB3为设置标准水位数据,每0.5米为一档,从2.0米到9.5米共十六档。PB4~PB6为设置水位正负偏差数据,每0.2米为一档,从0.2米到1.6米共八档。实际水位与标准水位相比,在正负偏差范围内被认为是正常水位,超过正负偏差范围的被认为是偏高(或偏低)水位,超出2倍的被认为是超高(或超低水位),控制输出模块根据不同情况输出闸门开大或关小的信号和输出信号的时长,达到控制进水闸门的目的。水位判定的标准参见下图:
2、显示模块 显示屏选用LCD5110无字库型,屏幕有84*8点阵,可以显示简单的图形,项目是通过软字库来显示ASC!!字符和12*14点阵的汉字子集。屏幕显示内容安排如下图:
屏幕的左半部分是模拟水位柱状图及高度数值,水位柱状图按照当前水位的高低通过点阵模拟显示,在高度数值显示区域,顶行显示进水池检测仪器的安装高度,底行固定显示0m,实际水位的数据则在2~5行显示,在超高水位时数值显示在第2行,偏高水位及略高于标准水位时数据显示在第3行,略低于标准水位和偏低水位时数值显示在第4行,超低水位时数值显示在第5行。 屏幕的右上部显示“水位仪”,屏幕右下部显示用户设置的标准水位“BZ=XX.X”和正负偏差,屏幕右中部则显示当前的状态,在单片机启动时会显示“等待信号”,接收信号失败或校验出错则显示“信号错误”,若用户设置的标准水位高于仪器安装高度时会显示“设置错误”,其他情况下则分别显示“超高水位”、“偏高水位”、“正常水位”、“偏低水位”和“超低水位”等内容。
3、数据接收模块 数据接收的频率大约每秒一次,每次接收9个字节的数据(SPI方式)或8个字节的数据(串口方式),远期可根据需要考虑增加无线收发传输功能,通过购置射频模块来实现。
4、控制输出模块 本项目通过PB8的PB10引脚(即开发板上的LED2和LED3)输出低电平信号,驱动5V的四路微型继电器模块(目前使用两路,其余留作今后扩展用),再通过微型继电器驱动12V的中间继电器控制闸门电机动作,达到闸门开大或关小的目的。如前所述,中间继电器控制部门电机动作的部分早在《小水电站远程控制》项目中已经实现,本项目仅需要购置四路微型继电器模块,通过控制LED2和LED3的亮灭,即可达到控制闸门的目的。
5、数据处理模块 数据处理不涉及直接与外部设备联系,主要是对接收到的数据进行检验,然后对当前的水位数据进行判别,将判别结果输出到屏幕上,并根据需要控制继电器动作。
三、项目实施过程 1、开发环境的建立和点亮LED 从8月初大赛尚未开始时,我已经在观看《我要自学网》上的有关STM32教学视频,下载和安装好了IAR V7.20版本的软件,并按照视频建立好了工程模板。8月26日收到开发板后,下载了DEMO程序后才发现IAR V7.2的版本过低,网上搜索了几个所谓的高版本IAR,下载安装后发现全都是挂羊头卖狗肉,需要的软件没有,却给安装了十多个乱七八糟的软件。找不到合适版本的IAR,只好将目光转向KEIL。我的电脑原安装了KEIL C51开发平台,尝试安装KEIL MDK,多次安装、卸载都不成功,两个版本会产生冲突,造成两个软件都无法正常使用,期间还曾发帖《不能同时安装Keil C51和keil MDK吗?》求助(链接https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=852424&extra=)。折腾了几天,最后按照坛友anger0925的指引,下载安装了KEIL V5版本的MDK,才与KEIL V4版本的C51相安无事、和平共处。 又通过几天的学习、分析DEMO程序,终于在8月31日下载了自己在DEMO程序基础上改写的控制LED灯程序,顺利地点亮了LED灯。 2、LCD5110的驱动及主屏幕的设计 从9月1日开始调试LCD5110的驱动程序,这个程序是从C51移植过来的,这个过程相对比较顺利,只花了两天多的时间就点亮了屏幕。开始是使用PB2~PB6引脚来驱动LCD5110的,后来因故改为PC5~PC9引脚来驱动。 到9月6日已经完成了主屏幕的设计和ASCII码字库及12*14点阵汉字库子集的编写和调试工作。ASCII字模是全集,程序处理时只要将字符的内码减去32,就是字模数组的行号,在程序中可以直接写入字符;汉字字模是子集,没有借用内码,因此只能按照字模数组的行号引用,在程序中不直观。 3、基本设置模块的调试 从9月7日到9月10日的四天时间里完成了DIP拨码开关设置程序的调试工作。开始拨码开关接在PC0~PC6引脚上,反复调试无效后又改接在PB0~PB6引脚上,仍然不能正常读取到拨码开关的设置数据,读入的数值不稳定,会周期性跳动。在这期间还曾发帖《怎么读不到引脚的状态?》求助(链接https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=925982&extra=),最后通过反复测量引脚电压,才发现虽然设置引脚为上拉电阻输入,但仍得不到高电平输入信号,实测引脚高电平电压只有0.8~1.2V之间,明显达不到数据手册中1.69~2.11V的标准,只好在相应的引脚外加上拉电阻才达到目的。 4、数据接收模块的调试 这是我花费时间和精力最多的模块,从9月11日开始到9月28日,共计花费了半个多月的时间,期间几乎筋疲力尽、几近绝望,在大赛负责人nmg的关心和帮助下,通过发帖求助,得到许多坛友的热心指教,最后才完成了SPI和串口接收数据的问题。 究其原因,主要是我接触单片机的时间不长,这次才开始接触32位单片机,还处于入门学习的阶段。举例来说,开始我连MOSI都不清楚,还以为这个M是指当前的单片机。期间通过上网搜索资料、整理打印资料、按照资料对照分析调试程序、观看逻辑分析仪抓取的时序,在调试程序的过程中也学到了不少知识,积累了一些经验。为了排除51单片机高电平引脚对对32单片机的影响,还专门搭接了信号转换电路。通过不懈努力和发大家的热心帮助,最终成功地接收到了数据。 调试过程中首先遇到的问题是串口助手不能正确接收51单片机发出的数据,收到的全是0,为此曾经在多个论坛发帖《单片机发送数据,串口助手收到的是0\》求助(链接https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=903790&fromuid=709956),最后全面检查程序才发现是我在超声波检测程序中清定时器0时误将TH0=0写成了TH1=0,造成串口的波特率严重偏差,当然串口助手接收到的全是0了。 在51单片机能正确发送数据到串口助手后,我对照范例开始调试GD32单片机串口接收程序,我将串口收到的信息通过重定向prints输出到串口助手,也许是我的数据格式不正确,输出的全是数字。调试了几天均无结果后,我就换用SPI接收程序。又是搜索、整理、打印、分析程序代码,几天时间一晃就过去了,程序调试仍毫无头绪。无奈之下,我只好改用软件模拟读取SPI数据。又是几天过去了,期间大赛负责人nmg先生主动询问项目的进展情况,得知我遇到的困难之后,鼓励我发帖求助,同时还在群里呼吁大家相助。我在9月26日发帖《SPI接收不到数据,请各位帮忙》(链接https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=976860&extra=),在大家的热心帮助下,通过仔细分析程序代码及时序图,发现我将读取的代码错写在了等待片选信号的循环中了。乌云总算过去了,看到了明媚的阳光,软件模拟SPI终于调试完成,最后检查串口接收程序,将接收到的信息输出到屏幕上,才发现其实串口早就接收到了正确信息,只是在重定向打印时变成了数字。至此,串口接收数据和软件模拟SPI接收数据均调试成功,但单片机的SPI1的接收尚未调试好,不过这无关紧要,不影响项目的基本功能。 在数据接收模块调试过程中,还出现过单片机干扰笔记本电脑的现象,电脑鼠标、键盘无任何操作,但打开的窗口在不断地变化,或者在各窗口之间切换,就象鼠标被劫持了一样。我曾怀疑无线鼠标发射或接收被单片机干扰,关闭鼠标电源并拔下鼠标接收头都无济于事,只有拔掉连接单片机的USB线才行。最后是在连接单片机USB线的瞬间,趁电脑尚未受到单片机干扰时,立即下载程序,用重新编译的程序覆盖才解决问题。这种情况已经碰过两次,原因尚不清楚。
5、数据处理模块的调试 数据处理模块调试过程相对顺利,其大部分代码都是在调试数据接收模块时,为了缓解一筹莫展的窘境,调节情绪和大脑的思维,顺带写了这部分代码,只是调试过程是在数据接收模块完成之后进行的。整个调试过程仅花了两天时间,于9月30日完工。 此过程遇到的第一个问题是将接收到的字符数据转换成数值变量,我先将接收到的字符分解成安装高度和当前水位两个字符串,用于在屏幕上直接显示输出,然后再分别将这两个字符串转换成数值变量,不清楚是什么原因,实际得到的数值与字符有很大的差异。最后就改为直接从接收到的字符串取出对应位的字符,再转换成数值,这样就一次通过了。由于当时的代码没有保存下来,所以至今还不知道出错的原因。 遇到的第二个问题是无符号整数运算,我在编写模拟水位柱状图时,用当前水位除以仪器安装高度,得到当前水位在屏幕上显示的百分点,再乘以48(屏幕高的点阵数),得到的结果一直都是零,最后恍然大悟,因为我定义的中间变量是无符号整型,对于小于1的小数一律视为零,我改为先乘后除才解决问题。为了确保数据无误,我又将中间变量改为16位无符号整型,确保不会出现溢出情况。 6、输出控制模块的调试 输出控制模块调试相对简单,我利用了开发板上的LED2和LED3两个引脚,程序直接控制这两个LED灯亮灭就行。开始我沿用51单片机的习惯,采用的是低电平触发继电器,但在调试过程中发现单片机在启动时会置这两个引脚为低电平,引发这两个继电器同时动作,这在实际应用中是绝对禁止的,因为开大和关小是同一个直流电机,同时触发就会引起短路,尽管在中间继电器上已经作了互锁的逻辑处理,确保两个继电器不能同时动作,在单片机上也不应该出现同时发出控制信号的现象。经过测试,修改为高电平触发就避免了这个现象。 7、项目整体调试 数据接收和数据处理模块完成后,整个项目就基本完成了。为了方便演示,我找了一个塑料盒临时给开发板安个“家”,LCD5110显示屏固定在盒盖上,开发板和焊接在万能板上的辅助线路一并放置在盒内,数据输入和输出控制则通过杜邦线引到盒外。项目正式投入实际使用时还需要根另外再设计好线路图和PCB板,并且还要加装屏蔽盒,防止单片机受到机房的强电信号干扰。 四、项目展示 1、项目背景——之前对小水电站进行远程控制改造。
图4-1-1、之前对小水电站进行远程控制改造过程
图4-1-2、小水电站配电控制柜(左侧为远程控制机柜)
图4-1-3、远程控制机柜内的网络继电器、中间继电器等电气装置
图4-1-4、配电控制柜面板上添加的机械控制装置
图4-1-5、使用51单片机制作的超声波水位检测仪
2、项目开发环境及GD32F350开发板
图4-2-1、收到的GD32F350开发板
图4-2-2、开发板焊接好接口后上电测试通过
图4-2-3、安装好了KEIL V5.23 MDK开发环境
图4-2-4、用KEIL编译通过的DEMO程序
3、扩展板、显示屏及继电器模块
图4-3-1、配合项目开发测试用的扩展板
图4-3-2、LCD5110显示屏及焊接的背光电路连线
图4-3-3、输出控制用的四路继电器模块
4、项目开发测试过程
图4-4-1、项目开发调试(用杜邦线连接各模块)
图4-4-2、调试LCD5110显示屏(通过逻辑仪)
图4-4-3、LCD5110显示屏调试通过,显示正常
图4-4-4、用户设置调试通过,加装外部上拉电阻后读取到设置的数据
图4-4-5、分析调试51单片机输出的SPI时序图
图4-4-6、调试GD32单片机的SPI接收
图4-4-7、第四行是模拟MOSI引脚的电平,与第二行的波形一致
图4-4-8、第四行模拟SPI接收的时间,发现接收时间短于一个字节发送时间,从而可以有针对性分析代码。
图4-4-9、通过调整代码后正确接收到SPI数据
图4-4-10、主控制模块代码的调试
图4-4-11、主控模块调试完毕——显示正常水位
图4-4-12、主控模块调试完毕——显示偏高水位
图4-4-13、主控模块调试完毕——显示超高水位
图4-4-14、主控模块调试完毕——显示偏低水位
图4-4-15、主控模块调试完毕——显示超低水位
图4-4-16、开发测试装置暂时用塑料盒固定
图4-4-17、开发板通过杜邦线与上位机连接进行SPI传输
图4-4-18、联合调试全貌
图4-4-19、联合调试之输出控制模块
图4-4-20、联合调试之显示输出内容
五、项目存在的问题及今后拓展方向 本项目的测试已经完成,达到了预期的目的,但离实际应用还有一定的距离。下一步首先需要设计线路图和PCB板,加装屏蔽盒以防电磁干扰后才能投入实际应用。其次要选择合适的射频模块,添加无线传输功能,以适用用户不同的需要,因为无线传输更能适应小水电站的地形环境,减少日常维护工作量。 根据水位高低自动控制进水闸门仅仅是小水电站自动控制的一个很小的部分,这个装置还有很大的扩展空间,大致方向有: 1、要具备检测闸门当前大小位置的功能,防止调节器开(或关)到尽头时单片机仍继续发出操作信号的现象发生; 2、增加flash存储芯片,以便能保存更多的用户设置数据,除了现在标准水位和正负偏差外,还可以保存每次动作的时长、信息接收方式等; 3、增加检测水轮发电机组的输出电压、电流和相位等运行参数,并具备用户通过互联网远程查询功能,利用物联网技术,让管理者可以随时了解电站的运行状况; 4、增加故障检测、紧急停机、自动开机和智能并网等功能,提高自动化和智能化水平,朝电站无人值守的方向发展; 4、增加多台机组的智能调度功能,合理利用水资源,达到效益最大化。 本项目除了应用于水电站外,稍加改变还可以应用在水库管理、水箱自动供水等方面。
|