您的位置:首页 > 其它

远程控制浇花系统--继电器模块

2013-10-27 13:35 309 查看
             其实这个模块周三就弄好了,但是一直想等买了mini水泵然后演示下的,至少拍个视频或者照片那啥的贴出来。不过都很忙一直,所以就没管了,周末病了,不想去实验室,就把原理这边的说说吧,以后拍了图片再贴进来吧!

       首先说说控制电路这一块吧。其实继电器的控制电路,你百度一下,网上有一堆可以选择的,仔细看看也都大同小异。嗯,主要是按你是想单电源还是多电源,单电源的话要有隔离效果就要多设计下电路,多用一个三极管,或者直接用光电耦合来隔离控制信号和传输信号。不过如果你是多电源就没这个问题,给控制信号一个电源,给传输信号一个电源,他们没有物理链接,很好的隔离了。我画的这个图就是双电源,控制信号是5v的电源(我用我开发板上的输出5v),传输信号用的是12v(暂定的,如果电机买的是其他的电压的,就换个),因为小电机的功率和效率问题,所以给了12v。这里我加了一个指示灯,是用来提示继电器工作状况的,其实也就是I/O口的输出情况,方便修改程序和了解工作情况。

     这是我画的控制模块的电路图,和网上给的没什么差别,其实呢,实际做起来,你还是要测试的,就是具体的参数。这个控制模块不是我焊的,因为我发现师兄有留下好东西啊,直接把他的(有点丑但是能用)拿过来用,不过测试他的板子花了我不少时间。他的是焊了两个继电器,其实效果都一样的。电路设计不拘一格。  


        上次讲到串口程序测试成功了,不过是用LED灯的显示代替浇花控制。这里我修改了程序,让它能直接对继电器操作,由继电器控制水泵,实现浇花真实过程。

        其实实现这个也很简单,就是把对LED的I/O控制换掉,我用的是对开发板上的无线模块的I/O口的控制,也就是PC4和PC5,之所以用两个I/O是因为我说了,我用的师兄焊好的板子,他用了两个继电器做好的控制电路,我不想焊,直接就拿来用,所以就用两个I/O口来控制,原理还是上面那个图。

       继电器控制程序单独写成一个文件。

#include "stm32f10x.h"
#include "jdq.h"
#include "sys.h"

//初始化PC4和PC5为输出口.并使能这两个口的时钟
//JDQ IO初始化

void JDQ_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 //使能PC端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				 //JDQ1-->PC.4 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_4);						 //PC.4 输出高

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);   //使能PC端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //JDQ2-->PC.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_5); 						 //PC.5 输出高
}

void zuobian(void)	 //左边输出电源Vin
{
JDQ0=0;
JDQ1=0;
//	GPIO_ResetBits(GPIOC,GPIO_Pin_4);
//	GPIO_ResetBits(GPIOC,GPIO_Pin_5);
}

void youbian(void)	 //右边输出电源Vin
{
JDQ0=0;
JDQ1=1;
//	GPIO_ResetBits(GPIOC,GPIO_Pin_4);
//	GPIO_SetBits(GPIOC,GPIO_Pin_5);
}

void zantian(void)   //两边都不输出
{
JDQ0=1;
JDQ1=1;
//	GPIO_SetBits(GPIOC,GPIO_Pin_4);
//	GPIO_SetBits(GPIOC,GPIO_Pin_5);
}

          头文件就不用说了,这个程序没什么难点,就是GPIO的操作控制,你可以直接把继电器当成LED灯来思考,就so easy了。至于下面定义的几个函数,是我根据师兄的板子自己写的操作函数,可以看到我是在操作两个继电器,不同I/O输出,继电器的选择不同,这是测试的结果,没什么可讲的。如果你是自己按我画的那个电路图,完全不需要这些函数,直接操作I/O就搞定,更简单。这就告诉我们哈,懒人就要从别的方面弥补,硬件用的是别人的,软件就要多下点功夫才行。

        把这个替换掉LED灯的操作也很简单。

if(j==0)
{
//			printf("1");
//			LED0=0;
//			delay_ms(1000);
//			LED0=1;

youbian();   //右边输出电源电压
delays(60);	 //延时60秒,浇水60s
zuobian();	 //两边都不输出电源电压
delays(5);	 //延时5秒

}

         这里我做了修改的部分是延时。因为测试结果发现,用原来的延时函数delay_ms(),没办法延时1分钟,我在网上发现大家给的都是短暂延时,就是ms级别的,最多的也不超过3s,这个都是可以用这个函数实现的;但是时间久了就不行,至于原因我还在找。所以我重写了延时函数,自己定义了一个delays()函数,直接秒延时,我测试了,可以延时1分钟,你要是问我为嘛要延时这么久,你想啊,浇花难道就浇几秒?of course not!我假定它要浇1分钟,具体还要看电机的效率,如果电机很给力,抽水能力强,一下子就完成工作,那就减少延时时间,就是据如此类的工作,不断完善就行了。

PS:无线通信这个模块嘛,估计要等等再做了,因为做光立方的元件到了,答应送人的,一定要做好啊,对自己焊工很着急啊。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息