矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 13238|回复: 36

【参赛】带记忆功能的高度显示器

[复制链接]
     
发表于 2017-11-22 19:43:11 | 显示全部楼层 |阅读模式
本帖最后由 LHZ07206 于 2017-11-22 20:34 编辑

  本人学习单片机,断断续续也有好几年的时间了,也进行过一些简单的小制作,本次制作主要是进行一些技术验证,比如数码管驱动、I2C器件的使用以及C语言编程方面的一些技巧等等,手工太差,还请大家多包涵。下面对本次制作进行一下说明:
一、显示器功能:
利用单片机,对编码器反馈脉冲或其它脉冲信号进行计数,如果用于起重机械,可以显示起升的高度,如果用于其它方面,可以显示行程距离或对物品进行计数。
二、技术要点:
1、由于数据需要连续动态显示,而且显示的位数不固定,要从一位数逐步跳变为多位数,因此设计了加一、减一程序,用C语言编程成为独立的函数模块,在中断程序中根据需要进行调用。
2、使用电源监控芯片监测系统工作电压,在掉电的瞬间通知单片机对数据进行存储操作。
3、无需内置电池,利用I2C总线,使用E2PEOM元件AT24C08对当前数据进行存储,实现了断电记忆。
三、设计思路:
本装置由以下几部分组成:数字脉冲输入电路(包括光电耦合、方向判别)、计数及运算控制电路(脉冲计数、零点设置、断电记忆)、驱动电路(数码管显示及预置报警)。
1、获取编码器反馈脉冲,根据电机转速、编码器脉冲数、减速箱变比和钢丝卷筒直径,可以测算出钢丝绳每运行0.01米所需的脉冲个数,将此数值作为单片机计数中断值固化在程序中,通过数码管将高度值以厘米级的精度动态显示出来,最大可显示到正负999.99米(根据需要可以任意扩展)。
2、设“零点设置”按钮,此按钮的作用在于:(1)更换钢丝绳后用来校准取物装置的零点位置。(2)无论吊钩在什么位置,都可利用此按钮将显示器置零,以当前位置为零点,显示某一段起升或下降的距离。
3、断电记忆当前位置。如果不采取措施,在起重机工作中出现断电的情况下,则需重新设置零点位置。为了保存掉电前吊钩的位置数据,利用电源监控芯片MAX708监测工作电压,在掉电的瞬间触发外部中断,单片机执行中断服务程序,将现场实时数据写入E2PEOM中。上电复位后,则先从E2PEOM中读出数据送到显示器,实现了现场数据的恢复。
4、I2C总线的软件实现。由于E2PEOM元件AT24C08与AT89S52单片机的连接采用I2C总线,而廉价的普通单片机不带有I2C总线接口,因此本系统采用普通I/O口通过软件模拟I2C总线协议,虽然软件编程上稍微复杂一些,但是与自带锂电池的NVRAM芯片相比,降低了成本,是一种廉价、实用的方法。

图片说明显示不全。

使用LG5011AH共阴极数码管

使用LG5011AH共阴极数码管

显示驱动芯片MAX7219是一种高集成化的串行输入输出的共阴极LED显示驱动器。每片可驱动8位7段加小数点的共阴 ...

显示驱动芯片MAX7219是一种高集成化的串行输入输出的共阴极LED显示驱动器。每片可驱动8位7段加小数点的共阴 ...

MAX708是一种电源监控芯片,兼有上电复位功能。具有域值为1.25 V、用于电源失效或低电源警告的独立比较器, ...

MAX708是一种电源监控芯片,兼有上电复位功能。具有域值为1.25 V、用于电源失效或低电源警告的独立比较器, ...

AT24C08是电可擦写只读存储器EEPROM,用二线串行接口存取数据。与AT89S52单片机的连接采用I2C总线,采用普 ...

AT24C08是电可擦写只读存储器EEPROM,用二线串行接口存取数据。与AT89S52单片机的连接采用I2C总线,采用普  ...

6N137是一钟高速光耦合器,转换速率高达10MBits,在此处用于编码器脉冲信号的隔离输入。

6N137是一钟高速光耦合器,转换速率高达10MBits,在此处用于编码器脉冲信号的隔离输入。

74HC74是一款双D触发器,A、B两路脉冲信号经过光耦输出分别接至74HC74 的时钟端CLK和控制端D,通过对两路脉 ...

74HC74是一款双D触发器,A、B两路脉冲信号经过光耦输出分别接至74HC74 的时钟端CLK和控制端D,通过对两路脉 ...

白色的是P521光耦,用来对清零按钮信号进行隔离输入。

白色的是P521光耦,用来对清零按钮信号进行隔离输入。

采用洞洞板加飞线,实在是对不起观众。

采用洞洞板加飞线,实在是对不起观众。

内部安装变压器,用7805和7812输出两路电压。

内部安装变压器,用7805和7812输出两路电压。

这线走的太伤心,就别看了,唉!

这线走的太伤心,就别看了,唉!

其实也没多少元件,主要是软件的编制。

其实也没多少元件,主要是软件的编制。

上电显示正常,下面是清零按钮和电源开关。

上电显示正常,下面是清零按钮和电源开关。

模拟了编码器的输入,加减数正常。

模拟了编码器的输入,加减数正常。

准备停电,验证数据是否能保存。

准备停电,验证数据是否能保存。

停电了

停电了

重新上电,数据恢复正常。

重新上电,数据恢复正常。

准备清零

准备清零

清零按钮按下,数据清零。

清零按钮按下,数据清零。

按要求手书字条

按要求手书字条
     
 楼主| 发表于 2017-11-22 20:03:30 | 显示全部楼层
本帖最后由 LHZ07206 于 2017-11-22 20:37 编辑

由于图片说明字体显示不全,发个完整文档:

一、显示器功能:
利用单片机,对编码器反馈脉冲或其它脉冲信号进行计数,如果用于起重机械,可以显示起升的高度,如果用于其它方面,可以显示行程距离或对物品进行计数。
二、技术要点:
1、由于数据需要连续动态显示,而且显示的位数不固定,要从一位数逐步跳变为多位数,因此设计了加一、减一程序,用C语言编程成为独立的函数模块,在中断程序中根据需要进行调用。
2、使用电源监控芯片监测系统工作电压,在掉电的瞬间通知单片机对数据进行存储操作。
3、无需内置电池,利用I2C总线,使用E2PEOM元件AT24C08对当前数据进行存储,实现了断电记忆。
三、设计思路:
本装置由以下几部分组成:数字脉冲输入电路(包括光电耦合、方向判别)、计数及运算控制电路(脉冲计数、零点设置、断电记忆)、驱动电路(数码管显示及预置报警)。
1、获取编码器反馈脉冲,根据电机转速、编码器脉冲数、减速箱变比和钢丝卷筒直径,可以测算出钢丝绳每运行0.01米所需的脉冲个数,将此数值作为单片机计数中断值固化在程序中,通过数码管将高度值以厘米级的精度动态显示出来,最大可显示到正负999.99米(根据需要可以任意扩展)。
2、设“零点设置”按钮,此按钮的作用在于:(1)更换钢丝绳后用来校准取物装置的零点位置。(2)无论吊钩在什么位置,都可利用此按钮将显示器置零,以当前位置为零点,显示某一段起升或下降的距离。
3、断电记忆当前位置。如果不采取措施,在起重机工作中出现断电的情况下,则需重新设置零点位置。为了保存掉电前吊钩的位置数据,利用电源监控芯片MAX708监测工作电压,在掉电的瞬间触发外部中断,单片机执行中断服务程序,将现场实时数据写入E2PEOM中。上电复位后,则先从E2PEOM中读出数据送到显示器,实现了现场数据的恢复。
4、I2C总线的软件实现。由于E2PEOM元件AT24C08与AT89S52单片机的连接采用I2C总线,而廉价的普通单片机不带有I2C总线接口,因此本系统采用普通I/O口通过软件模拟I2C总线协议,虽然软件编程上稍微复杂一些,但是与自带锂电池的NVRAM芯片相比,降低了成本,是一种廉价、实用的方法。
四、具体电路及程序:
1、具体电路如图所示:

(1)本装置采用MAX7219驱动数码管显示器实现数据的连续显示,MAX7219是一种串行接口8位LED显示驱动器,仅需使用单片机3个引脚,即可实现对8位LED数码管的显示控制和驱动,线路非常简单,控制简单方便。对MAX7219的控制编程主要分为:初始化子程序(主要是对MAX7219的显示模式、显示亮度、显示位数等进行初始化),以及送显子程序。
(2)数据信号的采集,将编码器的反馈信号,输入高速光耦6N137,6N137是一款用于单通道的高速光耦合器,转换速率高达10MBit/s。A、B两路脉冲信号经过光耦输出分别接至双D触发器74HC74 的时钟端CLK和控制端D,正转时,A信号的相位超前B信号90°,Q输出端始终为高电平。反转时,A信号的相位延后B信号90°,Q输出端始终为低电平。因此,通过读取Q的电压高低,就可以判别光电编码器的转向,进行加、减计算,同时将A脉冲输入到单片机的P3.2引脚进行计数。根据电机的转速、减速箱的变比、钢丝卷筒的直径,可以测算出经过多少个脉冲,等于实际高度1厘米的距离。将此脉冲数作为单片机的外部中断计数计数值,在中断程序中调用加一或减一函数。
(3)为了保存掉电前吊钩的位置数据,利用E2PROM元件AT24C08和电源监控芯片MAX708实现掉电数据保存。24C系列串行EEPROM具有断电以后存储的数据不消失的特点,而且体积小、功耗低、占用I/O口线少,读写操作相对简单。既可由软件对其内容进行随机读写,又可在芯片断电的情况下长期保存片内信息,本系统采用普通I/O口通过软件模拟I2C总线协议,在掉电前将实时数据写入E2PEOM中,上电复位后,则先从E2PEOM中读出数据送到显示器,实现了现场数据的恢复。掉电检测功能由芯片MAX708实现,MAX708是一种微处理器电源监控芯片,可同时输出高电平有效和低电平有效的复位信号。复位信号可由VCC 电压、手动复位输入或由独立的比较器触发。独立的比较器可用于监视第二个电源信号,域值为1.25 V、用于电源失效或低电压报警,为处理器提供电压跌落的预警功能。
2、程序设计:(MAX7219、AT24C08通信协议及部分函数定义省略)根据某种起重机的需要,计算出127个脉冲进行加一操作。
#include <AT89X52.H>
#include <intrins.h>
#include <absacc.h>
#define  uchar unsigned char
uchar sh[6]={0x00,0x00,0x00,0x00,0x00,0x00};
uchar ql[6]={0x00,0x00,0x00,0x00,0x00,0x00};
void timer0(void)interrupt 1 /*计数器中断服务函数,判断正转,调用*/
/*加、减1程序*/
{
while((sh[0]==0)&&(sh[1]==0)&&(sh[2]==0)&&(sh[3]==0)&&(sh[4]==0))
{
  if(p1_5==1)
   {
    sh[5]=0x00;
    jia_yi();
   }
  else
   {
    sh[5]=0x0a;
    jia_yi();
   }
}
  
if(sh[5]==0x00)
{
  if(p1_5==1)
   jia_yi();
  else
   jian_yi();
}
else
{
  if(p1_5==1)
   jian_yi();
  else
   jia_yi();
}
}

void int0(void) interrupt 0    /*外部中断服务函数, 判外部清零按键*/
{
uchar *w;
w=ql;
write_nbyte(0xa0,0x00,w,6);
sh[0]=0;
sh[1]=0;
sh[2]=0;
sh[3]=0;
sh[4]=0;
sh[5]=0;
p3_2=1;
}

void int1(void) interrupt 2  /*用MAX708检测电源电压,掉电时触发*/
/*中断程序*/
{
uchar *s;
s=sh;
write_nbyte(0xa0,0x00,s,6);   
}
void main()
{
uchar *s;
s=sh;
EX1=0;       /*关外中断1*/
IT1=1;       /*设外中断1为后沿负跳有效*/
IT0=1;       /*设外中断0为后沿负跳有效*/
EX0=1;       /*允许外中断0*/
IE1=1;
IE0=0;
p3_2=1;
p1_5=1;
TMOD=0x06;   /*计数器工作在方式2*/
TH0=0x81;    /*对TH0 TL0 赋值,计满127进入中断*/
TL0=0x81;
TR0=1;
ET0=1;       /*允许计数中断*/
EA=1;
Init_Max7219();
x24c02_init();
read_nbyte(0xa0,0x00,s,6);  /*从总线读取数据*/
EX1=1;                      /*读完数据后再开预警中断*/     
  while(1)
{
  Init_Max7219();
  Write_Max7219(0x01,sh[0]);
  Write_Max7219(0x02,sh[1]);
  Write_Max7219(0x03,sh[2]);
  Write_Max7219(0x04,sh[3]);
  Write_Max7219(0x05,sh[4]);
  Write_Max7219(0x06,sh[5]);
}
}

回复 支持 反对

使用道具 举报

     
发表于 2017-11-22 20:20:36 | 显示全部楼层
请把原理图也发上来。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-11-22 20:28:22 | 显示全部楼层
lq19512003 发表于 2017-11-22 20:20
请把原理图也发上来。

原理图:
原理图.jpg
回复 支持 反对

使用道具 举报

     
发表于 2017-11-22 21:09:18 | 显示全部楼层
见到图了,多谢了!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-11-22 21:38:02 | 显示全部楼层
lq19512003 发表于 2017-11-22 21:09
见到图了,多谢了!

谢谢版主
回复 支持 反对

使用道具 举报

     
发表于 2017-11-23 22:38:38 | 显示全部楼层
东西做的不错,但是我提几个问题,善意的
1.断电人家起重机上下了,你怎么恢复高度
2.编码器掉数据了怎么校准

以上问题都是小问题,但是需要解决的
回复 支持 反对

使用道具 举报

     
发表于 2017-11-24 09:49:50 | 显示全部楼层
外行看起来好复杂
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-11-24 19:08:23 | 显示全部楼层
本帖最后由 LHZ07206 于 2017-11-24 19:37 编辑
291680852 发表于 2017-11-23 22:38
东西做的不错,但是我提几个问题,善意的
1.断电人家起重机上下了,你怎么恢复高度
2.编码器掉数据了 ...


问题提的好,1,如果起重机断电,手动松开制动盘让货物下降,这属于特殊情况,上电后只需将吊钩触地,按清零按钮置零即可。另外,如果是固定式的起重机,使用工业电源,那么此装置可以从控制电源取电,如果控制电源断电,那么起重机是不可能动作的。如果是移动式的起重机,可以从电瓶取电,当然要通过总开关之后的,如果起重机在工作,发动机一定是工作的,电瓶当然是有电的,如果遇到特殊情况电瓶线断了,那就只有重新置零解决了。2,编码器只要与电机连接可靠,是不会掉数据的,但是绝对值编码器确实存在累计误差的问题,长时间使用后可以置零调整,平时也可以用设置好的吊钩零位位置来进行验证,这个误差很小的,精度要求不高的话可以忽略不计。
此外还有一点需要说明,如果您看图仔细,可以发现,数据开始累加之后,怎么最高位的数码管熄灭了?其实这个最高位是个符号位,零点设置好之后,如果吊钩是往下走,那么最高位则显示负号“-”,进行负累加;从零点往上走则不显示符号位,进行正累加;如果是从负高度经过零位后过渡到正高度,那么就从负高度一直减到0,经过零点后再进行正累加,这些都是编程实现的。
回复 支持 反对

使用道具 举报

     
发表于 2017-11-26 23:05:57 | 显示全部楼层
学习一下,看起来不错!
回复 支持 反对

使用道具 举报

     
发表于 2017-11-27 19:10:08 | 显示全部楼层
楼主 是不是考虑车上的供电电压是12v的电池呢
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-11-27 19:40:56 | 显示全部楼层
冰云 发表于 2017-11-27 19:10
楼主 是不是考虑车上的供电电压是12v的电池呢

12V没问题,可以用啊,还省了变压器了。
回复 支持 反对

使用道具 举报

     
发表于 2017-11-28 19:01:50 | 显示全部楼层
看起来很厉害,只是没有想明白到底如何使用。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-11-28 19:21:04 | 显示全部楼层
micdot 发表于 2017-11-28 19:01
看起来很厉害,只是没有想明白到底如何使用。

这个要根据实际需求,修改单片机外部计数中断值,然后重新编译、烧录,才能使用。
回复 支持 反对

使用道具 举报

     
发表于 2017-11-28 20:44:14 | 显示全部楼层
有个硬伤,卷扬机的辊子随着钢丝绳的伸长和缩短 直径在不断变化,基于“记圈数的”采样是行不通的。。。。当然理论上发散一下是可以的,但要实际使用还是不行的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-24 13:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表