STM32
直播中

陈秀英

7年用户 1243经验值
私信 关注
[问答]

如何去控制基于STM32F1的继电器呢

继电器是什么?

如何去控制基于STM32F1的继电器呢?

回帖(1)

陈翔洁

2021-11-25 15:32:01
1、实物图

2、继电器是什么

  
  

  

  3、手动开关

  
  

  

  4、继电器开关

  
  

  

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

  
单片机可以直接驱动2个XQ引脚(单片机输出的电流较小),也可以借助驱动威廉希尔官方网站 (ULN2003或者三极管)来驱动XQ引脚,经过ULN2003可以输出较大的电流。
  5、原理图

  2个XQ引脚接在P26端子上,然后连接ULN2003,输出到继电器J1、J2上。
注意:通过ULN2003的电平会取反(输入为0则输出为1,输入为1则输出为0)

  

  

继电器一个XQ引脚接高电平5V,一个XQ引脚接J1/J2,当J1为低电平时继电器1导通,J2为低电平时继电器2导通,并且导通时对应LED会点亮。还有三个输出引脚,对应继电器上的1A(开关柄),1B(常闭),1C(常开)。
对继电器的控制变成了对IO口电平的控制,输出高电平(ULN2003会翻转电平输出低电平)即可打开继电器,同理,输出低电平即关闭继电器。

  

  

  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)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分