浙江义乌吴志强
一前言
环境污染水资源紧张农村打井取水情况较为普遍现有的三极管电路和浮球开关水位控制器故障率较高
三极管电路构成的控制元件常出现的故障是抗干扰能力差会使三极管误动以浮球开关为形式的控制元件由于
浮球的连接线经常会磨断以及开关触点的腐蚀和氧化故障率也较高且水井水量不足水泵长时间空抽容易
毁坏电机
二电路设计
控制器电路如图所示其核心部件采用了PHILIPS公司的51LPC系列P87LPC762如果有P87LPC760则可充
分利用单片机的资源OTP单片机51LPC系列单片机是PHILIPS公司开发的一种80C51改进型MCU内置2KB
OTP程序存储器和128字节RAM内置RC振荡器看门狗比较器等功能单元具有集成度高可靠性高功耗
低的特点(详细资料请参考PHILIPS 51LPC系列单片机原理及应用设计北京航空航天大学出版社出版)
该控制器是在P87LPC762的外围加上水位采样驱动按钮显示无音源峰鸣器电源回路等几部分组成
农村的水箱一般都在0.00起始12米或以上而控制器一般安装在底层以致采样回路传输线相当于一付庞大的天
线极易受干扰为提高采样回路的抗干扰和探极电解抗腐蚀性采用3 6mA交流电流环进行水位检测最低的
探点con为交流12V电源接入点另外三个a b c为水位探点若水位达到相应的位置交流12V电源与
该探点接通其输出信号经R16限流D8整流桥全波整流C1滤波和保证交流过零时U1光耦导通R5限流D5
限流和抗干扰驱动光耦给762一个开关信号输出信号经光耦U4隔离三极管Q1放大驱动继电器K1使得水
泵得电工作二极管D12为续流二极管R43 C5抑制火花发光二极管D1指示电机在工作状态即显示同驱动
复用水箱水井运行得LED D2 D3 D4经限流电阻直接由762的I/O驱动为了利用762的资源和节约成
本告警音用不带音源得峰鸣器来产生由buz口输出约2KHz的方波驱动三极管使峰鸣器U6发声
三工作原理
控制器的接线图如图2所示当控制器上电时对LED和BUZZ进行自检由762的上电标志POF使BUZZ
自检时发长音延时15秒后当水箱水位低于下限a时控制器判为开机状态水泵得电工作抽水直致到上限水
位b控制器判为水满输出关机当水箱水位由a b过程中时井无水c点判定则停机延时半小时再自开机
且电机连续工作不超1小时约如此循环直致到上限水位b时关机
刚开机5秒内进水口c检测不到进水装置进入告警状态
为防止探极回路失效水泵连续工作1小时后进入停机状态
对采样回路有容错和采样异常告警功能有水时水位led不点亮无水时点亮
四软件设计
P87LPC762 OTP单片机内置2KB程序存储器中固化了系统应用程序系统采用SE 764仿真器仿真程序在
MedWin调试器上采用C51语言调试通过应用程序包括主程序T0 50ms定时中断程序键盘中断函数时标
函数峰鸣器驱动函数等相应的程序见附后
1.主程序控制器上电后首先初始化看门狗对LED进行检查初始化T0 T1 BUZZ检查键盘中断初
始化使能中断开定时器T0进入低功耗等待
2.T0 50ms定时中断程序T0定时初值重装喂狗装置是否在告警状态是进入告警程序否每中
断一次采样一次采样15次后对采样结果处理如采样成功启动采样分析程序否则从采样出错处理程序中退
出如探极正确启动抽水处理程序否则从探极出错程序中退出中断20次启动时标函数和亮灭运行灯
3.峰鸣器驱动函数峰鸣器的2KHz方波和发声间歇均有T1定时中断函数控制且在上电时检查上电标志POF
位POF为1则发长音清POF和置位UP_POF使上电时延时15秒输出控制命令
- /*************************************************************
- 文件名:autocp2.c
- 主题:autocp-2型智能水泵控制器程序
- Ver 1.2
- 修改日期2001/12/21
- 修改内容:将1型的井水位检测由井内改到水箱的出水口处,
- 刚开机时延时5秒检测.
- ***************************************************************/
- #include<reg764.h>
- #define uchar unsigned char
- #define TH0_VAL 0X3C/*定时器0的重载值*/
- #define TL0_VAL 0Xd2
- #define TH1_VAL 0X35/*定时器1的重载值*/
- #define TL1_VAL 0X35
- #define NO_WORK 30/*水泵停机时间30分*/
- #define WORK 60/*水泵连续工作时间60分*/
- #define IN_CONT 15/*连续采样次数15次*/
- #define STAR_DELAY 8/*开机延时检测时间8X15/20=6秒*/
- #define STAR_BOXC 5/*开机检测C点无水计数值*/
- uchar data h;//采样出错计数
- uchar data l;//探极出错计数
- uchar data i;//采样次数,采样滤波用
- uchar data temp;//采样值
- uchar bdata temp1;
- sbit boxa=temp1^0;//水箱a点采样值
- sbit boxb=temp1^1;//b点
- sbit boxc=temp1^2;//水箱c点采样值
- uchar bdata flag;
- sbit WELL=flag^0;//水井水位标志
- sbit SET_KB=flag^1;//键盘中断标志
- sbit MOTOR=flag^2;//水泵工作标志
- sbit ERR=flag^3;//采样出错标志
- sbit ERR_IN=flag^4;//探极出错标志
- sbit errsign=flag^5;//装置告警标志
- sbit UP_POF=flag^6;//开机上电标志
- sbit MOTOR_STAR=flag^7;//刚开机标志
- sbit motor_led=P1^7;//电机驱动
- sbit box_led=P2^1;//水箱水位显示
- sbit well_led=P2^0;//水井水位显示
- sbit runled=P1^4;//运行灯
- sbit speak=P1^6;//峰鸣器输出
- typedef struct{//定义存储时间的结构
- uchar hour,min,sec;
- }timestruct;
- timestruct curtime;//存放当前的时间
- void input(void);//采样函数
- void output_led(void);//采样分析函数
- void con_out(void);//判断输出函数
- void warning(void);//告警函数
- void errin_con(void);//采样出错函数
- void errled_con(void);//探极出错函数
- void delay(unsigned int);//延时函数
- void init(void);//初始化函数
- /**********************************************************************
- 名称:WDT_FEED
- 用途:喂狗程序
- 说明:请参照87LPC764的喂狗方法说明
- /***********************************************************************
- void WDT_FEED(void){
- WDRST=0X1E;
- WDRST=0XE1;
- }
- /***********************************************************************
- 名称:INIT_WDT
- 用途:看门狗初始化程序
- 说明:
- ***********************************************************************/
- void INIT_WDT(void){
- WDCON=WDCON|0X17;//开启看门狗定时器(溢出时间约为2.1秒)
- WDT_FEED();//设置完后喂狗一次
- }
- /**********************************************************************
- 函数名kb_int
- 功能描述延时清键盘中断标志SET_KB置位如满足上水条件启动电机
- 参数无
- 返回无
- ************************************************************************/
- void kb_int(void)interrupt 7 using 1{
- EKB=0;//禁能键盘中断
- TR0=0;
- AUXR1=AUXR1&0x7F;//清键盘中断标志
- if((P0^7==0)&&(motor_led==1)&&(boxc==1)){//低电平有效
- SET_KB=1;//置位手动标志
- }
- TR0=1;
- EKB=1;
- }
- /***********************************************************************
- 函数名input
- 功能描述对P0进行采样如果连续5次一样则ERR=0;
- 输入参数无
- 返回参数无
- **********************************************************************/
- void input(void){//采样滤波
- static uchar K=5;//连续采样相同次数
- if(temp==(P0&0x0f)){
- K--;
- if(K==0){//连续5次相同
- ERR=0;
- temp1=temp;
- h=0;
- }
- }else{//采样值不同
- temp=(P0&0x0f);
- K=5;
- ERR=1;//置位采样出错标志
- }
- }
- /*********************************************************************
- 函数名output_led
- 功能描述对采样值进行分析如果探极有问题则ERR_IN=1;
- 如无问题则点亮相应的水位led
- 输入参数无
- 返回参数无
- ***********************************************************************/
- void output_led(void){
- if((boxb==0)&&(boxa==1)){
- ERR_IN=1;//置位探极出错标志
- }else{
- ERR_IN=0;//清探极出错标志和探极出错计数器
- l=0;
- box_led=~boxa;//无水点亮
- }
- }
- /*********************************************************************
- 函数名warning
- 功能描述runled闪,进入装置告警状态
- 输入参数无
- 返回参数无
- ***********************************************************************/
- void warning(void)
- {EA=0;//禁能总中断
- EKB=0;//关闭键盘中断
- motor_led=1;//关机
- MOTOR=0;
- well_led=1;//灭显示灯
- box_led=1;
- errsign=1;//置位装置告警标志
- TR1=1;//启动T1峰鸣器控制中断函数
- EA=1;//使能总中断
- }
- /***********************************************************************
- 函数名errin_con
- 功能描述采样出错记数在两次内不作反映3次以上停机6次以上告警死循
- 输入参数无
- 返回参数无
- ************************************************************************/
- void errin_con(void){
- h++;//采样出错计数
- if((MOTOR==1)&&(h>4)){//水泵工作,出错4次,关机
- motor_led=1;
- MOTOR=0;
- }
- if(h>8){//8次以上则进入告警状态
- warning();
- }
- }
- /*************************************************************************
- 函数名errled_con
- 功能描述探极出错重新采样记数连续6次告警15次停机
- 输入参数无
- 返回参数无
- **************************************************************************/
- void errled_con(void){
- l++;//探极出错计数
- if((MOTOR==1)&&(l>8)){//水泵工作,8次以上关机
- motor_led=1;
- MOTOR=0;
- }
- else if(l>15){//15次进入装置告警
- warning();
- }
- }
- /**************************************************************************
- 函数名INIT_TMR
- 功能描述定时器初始化
- 输入参数无
- 返回参数无
- ***************************************************************************/
- void INIT_TMR(void){
- TMOD=0X21;//定时器0置为模式1
- //定时器1置为模式2
- TH0=TH0_VAL;//定时器0初值
- TL0=TL0_VAL;
- TH1=TH1_VAL;//定时器1初值
- TL1=TL1_VAL;
- ET0=1;//开放T0/T1中断使能.*/
- ET1=1;
- -8-
- }
- /************************************************************************
- 名称:CHK_LED
- 说明:用于检查LED的显示.
- ************************************************************************/
- void CHK_LED(void){
- speak=1;
- motor_led=1;
- well_led=0;
- box_led=0;
- runled=0;
- delay(350);
- well_led=1;
- box_led=1;
- runled=1;
- delay(100);
- }
- /************************************************************************
- 名称:CHK_BUZ
- 用途:用于检查峰鸣器,.
- 说明:
- /************************************************************************/
- void CHK_BUZ(void){
- EA=1;//使能总中断
- P1M2=P1M2|0x40;//P1.6设为上拉输出
- TR1=1;//开启峰鸣器振荡输出
- delay(250);
- TR1=0;//停T1
- EA=0;//禁能总中断
- }
- /************************************************************************
- 名称:INIT_KBI
- 说明:键盘初始化子程序
- /************************************************************************/
- void INIT_KBI(void){
- KBI=0x80;//P0^7键盘中断允许
- P0M2=P0M2&0X7f;//P0.7仅为输入
- P0M1=P0M1|0X80;
- EKB=1;//使能键盘中断
- }广州周立功单片机发展有限公司Tel:(020)38730976 38730977 Fax:38730925 http://
- /************************************************************************
- 函数名delay
- 功能描述延时
- 参数uchar x
- 返回无
- *************************************************************************/
- void delay(unsigned int x){
- uchar y;
- while(x--){
- for(y=0;y<250;y++)
- {;}
- }
- }
- /*************************************************************************
- 功能second_tick
- 描述每秒钟执行一次函数功能时间更新
- 参数无
- 返回无
- *************************************************************************/
- void second_tick(void){
- static unsigned char motor_work;//水泵工作计时
- static unsigned char motor_nowork;//水泵不工作计时
- curtime.sec++;
- if(curtime.sec>=15){//开机上电延时15s
- UP_POF=0;
- }
- if(curtime.sec>59){
- curtime.sec=0;
- curtime.min++;
- if((motor_led==1)&&(MOTOR==1)){//停机状态
- motor_nowork++;//停机计时
- if(motor_nowork>=NO_WORK){//延时到,开机
- motor_led=0;
- MOTOR_STAR=1;//刚开机置位
- }
- }else{
- motor_nowork=0;
- }
- if(motor_led==0){//电机工作
- motor_work++;//工作计时
- if(motor_work>=WORK){//电机连续工作时间到,停机.
- motor_led=1;
- }
- }else{
- motor_work=0;
- }
- if(curtime.min>59){
- curtime.min=0;
- curtime.hour++;
- if(curtime.hour>23){
- curtime.hour=0;
- }
- }
- }
- }
- /**********************************************************************
- 函数名time0
- 功能描述50ms中断一次,采样一次,采样满20次后,对采样结果进行处理
- 如采样成功启动采样分析程序否则从采样出错处理程序重退出
- 如探极正确启动抽水处理程序否则从探极出错程序中退出
- 输入参数无
- 返回参数无
- ***********************************************************************/
- void time0(void)interrupt 1 using 1{
- static unsigned char second_cnt=20;//正常运行时标
- static unsigned char err_cnt=5;//装置告警时标
- TR0=0;//重装初值
- TH0=TH0_VAL;
- TL0=TL0_VAL;
- TR0=1;
- WDT_FEED();//喂狗
- if(errsign==1){//装置告警
- err_cnt--;
- if(!err_cnt){
- err_cnt=5;
- runled=~runled;
- }
- }else{//装置正常
- i++;//采样计数
- input();//采样函数
- if(i==IN_CONT){//采样次数到
- i=0;
- if(ERR==0){//采样成功
- output_led();//采样分析
- if(ERR_IN==0){//探极正确
- if(UP_POF==0){//上电延时到
- con_out();//控制输出
- }
- }else{errled_con();}//探极出错处理
- }else{errin_con();}//采样出错处理
- }
- second_cnt--;//记数值减
- if(!second_cnt){//如果经过1秒
- second_cnt=20;//设置记数值
- runled=~runled;
- second_tick();//时标函数
- }
- }
- }
- /***************************************************************
- 函数名time1
- 功能描述生成峰鸣器间歇性的2K方波
- 输入参数无
- 返回参数无
- ****************************************************************
- void time1(void)interrupt 3 using 1{
- static unsigned int buz_cnt=1000;
- bit l;
- if(!l){//2K方波
- speak=~speak;
- }else{//间歇时间
- speak=1;
- }
- buz_cnt--;//记数值减1
- if(!buz_cnt){
- if((PCON&0X10)==0x10){//检查上电标志
- PCON=PCON&0XEF;//清上电标志
- UP_POF=1;//置位开机延时
- buz_cnt=2000;//设置记数值
- }else{
- buz_cnt=1000;//设置记数值
- l=~l;
- }
- }
- }
- /*************************************************************************
- 主函数
- *************************************************************************/
- void main(void){
- EA=0;//禁能总中断
- INIT_WDT();//看门狗初始化
- CHK_LED();//led检查
- INIT_TMR();//定时器初始化
- CHK_BUZ();//峰鸣器检查
- INIT_KBI();//键盘初始化
- EA=1;//使能总中断
- TR0=1;//开启定时器T0
- for(;;){//低功耗等待
- PCON=0x01;
- }
- }
- /***********************************************************************
- 函数名star_monent
- 功能描述刚开机,延时,判断有无水,无水告警
- 输入参数无
- 返回参数无
- ***********************************************************************/
- void star_monent(void){
- static uchar star_delay,boxc_con;
- if(MOTOR_STAR==1){//刚开机时的延时
- star_delay++;
- if(boxc){
- boxc_con++;
- }else{
- boxc_con=0;
- }
- if(star_delay>=STAR_DELAY){//达到开机延时
- if(boxc_con>=STAR_BOXC){
- warning();
- boxc_con=0;
- }else{
- boxc_con=0;
- MOTOR_STAR=0;
- star_delay=0;
- well_led=1;
- }
- }
- }else{//不是刚开机
- if(boxc==1){//井无水
- motor_led=1;//停机
- well_led=0;//无水点亮
- }
- }
- }
- /*************************************************************************
- 函数名con_out
- 功能描述对采样值进行分析水箱B点无水条件下如果水箱A点无水
- 启动水泵延时5秒检测出水口,如无水,告警,有水则正常抽水
- 水箱水位在AB之间时保持抽水状态到过B点停机
- 输入参数无
- 返回参数无
- ***************************************************************************/
- void con_out(void){
- if(boxb==1){//水未满
- if(SET_KB==0){//手动未按下
- if(MOTOR==0){//关机状态
- if(boxa==1){//水箱无水,
- motor_led=0;//开机
- MOTOR=1;//电机运行标志
- MOTOR_STAR=1;//刚开机置位
- }
- }
- if(motor_led==0){
- star_monent();}//刚开机延时5秒
- }else{//手动按下
- SET_KB=0;
- motor_led=0;//开机
- MOTOR=0;//手动,停止条件:水箱满或水井无水
- MOTOR_STAR=1;
- }
- }else{//水满,关机
- motor_led=1;
- MOTOR=0;
- }
- }
复制代码
五讨论
民用深井泵的功率一般都小于1KW单相水泵的工作电流来在水泵空抽和抽水状态时无明显的边界量故
无法用水泵的工作电流来判断井内是否有水对于功率较大的深井泵则可用工作电流边界量来判断井内是否有水
则可省掉水位C点采样回路同时还可利用该电机电流采样回路V/F法或ADC进行电机过载堵转保
护则可使该控制器功能更为完善同时也充分利用了P87LPC762的潜能
六后记
编辑寄语作者自己购买了SE 764仿真器MP 764编程器及西尔特万用编程器等开发工具在业余条件下
用专业的手段自行开发了深井泵自动控制器首先我为他立志向上的求学精神所感动其次作者在很多网站
上表现得十分乐于助人足以说明他的爱心可嘉其三作者将自己设计的作品完全公开其无私奉献的思想境界能
够帮助后学先进的年轻人同时对所有的初学者来说这无疑是一个很好的学习机会通过对一个简单的控制项
目的学习和调试如能达到学好PHILIPS P87LPC762单片机和C51高级语言的目的那又何乐而不为呢学习单片
机应用开发技术关键在于实践特别是配合实验板来学习效果尤其明显请有兴趣的网友自行与作者联系购买实验
板如果在实验中遇到困境请与作者联系解答我想作者一定会十分热心地帮助您解决问题如果您有更好的设计
思想也请与作者和我联系让我们一起合作来完善这个作品千万不要认为这是一个小控制器只要我们认真完善
但也能充分体现一个人的设计思想那么一定有可能会成为一个好作品