STM32F1开发指南笔记25----继电器

1、实物图

STM32F1开发指南笔记25----继电器_第1张图片

2、继电器是什么

STM32F1开发指南笔记25----继电器_第2张图片

3、手动开关

STM32F1开发指南笔记25----继电器_第3张图片

4、继电器开关

STM32F1开发指南笔记25----继电器_第4张图片

当2个XQ引脚通电时,(电磁感应定律)电磁铁会产生磁,从而吸附上面的衔铁向下,下面的CK常开电路导通。

STM32F1开发指南笔记25----继电器_第5张图片单片机可以直接驱动2个XQ引脚(单片机输出的电流较小),也可以借助驱动电路(ULN2003或者三极管)来驱动XQ引脚,经过ULN2003可以输出较大的电流。

5、原理图

2个XQ引脚接在P26端子上,然后连接ULN2003,输出到继电器J1、J2上。
注意:通过ULN2003的电平会取反(输入为0则输出为1,输入为1则输出为0)
STM32F1开发指南笔记25----继电器_第6张图片
继电器一个XQ引脚接高电平5V,一个XQ引脚接J1/J2,当J1为低电平时继电器1导通,J2为低电平时继电器2导通,并且导通时对应LED会点亮。还有三个输出引脚,对应继电器上的1A(开关柄),1B(常闭),1C(常开)。
对继电器的控制变成了对IO口电平的控制,输出高电平(ULN2003会翻转电平输出低电平)即可打开继电器,同理,输出低电平即关闭继电器。
STM32F1开发指南笔记25----继电器_第7张图片

6、程序设计

main函数

#include "stm32f10x.h" 
#include "sys.h"
#include "delay.h"
#include "touch_key.h"
#include "relay.h"

int main (void)
{
	RCC_Configuration(); //系统时钟初始化 
	TOUCH_KEY_Init();//触摸按键初始化
	RELAY_Init();//继电器初始化

	while(1)
	{
		if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))RELAY_1(1); //当按键A按下时继电器1标志置位		
		if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))RELAY_1(0); //当按键B按下时继电器1标志置位		
		if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C))RELAY_2(1); //当按键C按下时继电器2标志置位
		if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D))RELAY_2(0); //当按键D按下时继电器2标志置位
	}
}

relay.c函数

/*
注意:
本程序所占用的GPIO接口PA13、PA14上电后为JTAG功能,
需要在RCC程序里启动AFIO时钟,再在RELAY_Init函数里加入:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
// 改变指定管脚的映射,完全禁用JTAG+SW-DP才能将JATG接口重定义为GPIO
*/

#include "relay.h"

//继电器的接口初始化
void RELAY_Init(void)
{ 
	GPIO_InitTypeDef  GPIO_InitStructure; 	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); //APB2外设时钟使能      
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//启动AFIO重映射功能时钟    
    GPIO_InitStructure.GPIO_Pin = RELAY1 | RELAY2; //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
	GPIO_Init(RELAYPORT, &GPIO_InitStructure);
	
	//必须禁用JTAG功能才能做GPIO使用
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);// 改变指定管脚的映射,完全禁用JTAG+SW-DP
	GPIO_ResetBits(RELAYPORT,RELAY1 | RELAY2); //都为低电平(0) 初始为关继电器							
}

//继电器的控制程序(c=0继电器放开,c=1继电器吸合)
void RELAY_1(u8 c)
{ 
	GPIO_WriteBit(RELAYPORT,RELAY1,(BitAction)(c));//通过参数值写入接口
}

//继电器的控制程序(c=0继电器放开,c=1继电器吸合)
void RELAY_2(u8 c)
{ 
	GPIO_WriteBit(RELAYPORT,RELAY2,(BitAction)(c));//通过参数值写入接口
}

relay.h文件

#ifndef __RELAY_H
#define __RELAY_H	 
#include "sys.h"

#define RELAYPORT	GPIOA	//定义IO接口
#define RELAY1	GPIO_Pin_14	//定义IO接口
#define RELAY2	GPIO_Pin_13	//定义IO接口

void RELAY_Init(void);//继电器初始化
void RELAY_1(u8 c);//继电器控制1
void RELAY_2(u8 c);//继电器控制2
		 				    
#endif

注意:控制继电器的两个引脚与JTAG复用了,且上电默认为JTAG模式,如果需要做GPIO使用,则需要将其重映射为GPIO,调用GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE)

声明:本文参考杜洋老师STM32的教学视频。

你可能感兴趣的:(STM32)