STM32之继电器驱动(上下拉电阻)

事情的经过:今天买了一个5V继电器,商家说可以用STM32驱动,所以准备用STM32引脚直接驱动,后来,上午试了2小时,引脚一直有电平变化(配置为推挽输出),但是继电器就是没有反应,直接接上5V的电源正负才会有反应,之后,询问了群友和上网查找,是控制器的引脚带负载能力不行,输出的电流太小,带不动这种大功率器件。这时,有网友建议我选择带上拉电阻的引脚,因此,探索者上的PB8,因为PB8外接了4.7K的上拉电阻,并且配置引脚为,开漏输出模式,后来经过尝试,成功驱动继电器。在这里插入图片描述

总结:之前网上看很多资料,对单片机引脚的模式略有耳闻,很少留意,今日的实验,收货颇丰。
一、上拉电阻与下拉电阻
有些引脚默认输出只有是低电平和高组态,当引脚外部设置上拉电阻的时候,可以把引脚电平拉高到外接VCC的数值,上拉电阻的选择一般是1-10k,电阻越小,功耗越大。
用处:1、上拉电阻串联一个电阻接到一个电压,增加IO的驱动能力。下拉是一个电阻接到地,保证IO电平为低电平。
2、上拉电阻是用来解决总线驱动能力不足时,提供电流的,称之为拉电流;下拉电阻是用来吸收电流的称之为灌电流。比如I2C总有一个10K的电阻。
3、上拉电阻是用来检测低电平的,下拉电阻是用来检测高电平的。

上拉、下拉电阻,通过上、下拉对应的开关配置,可以控制引脚默认状态的电压,开启上拉的时候引脚电压为高电平,开启下拉的时候引脚电压为低电平,这样可以消除引脚不定状态的影响。如引脚外部没有外接器件,或者外部的器件不干扰该引脚电压时, STM32 的引脚都会有这个默认状态。
也可以设置“既不上拉也不下拉模式”,我们也把这种状态称为浮空模式,配置成这个模式时,直接用电压表测量其引脚电压为 1 点几伏,这是个不确定值。所以一般来说我们都会选择给引脚设置“上拉模式”或“下拉模式”使它有默认状态。
STM32 的内部上拉是“弱上拉”,即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。

二、解决方案
因为需要控制多路继电器导通和关断,不能配置每个引脚都外接上拉电阻,因此选择功率放大驱动器件。因此选择了多路的ULN2003和ULN2803。二者都是七重达林顿阵列,输入电压范围一样,输出电压范围一样,电流一样,后者多了一路,多用于控制电机和继电器方面。等之后IC到货测试一波。

更新:测试结果。早上使用ULN2003AN在面包板上测试了一下,效果良好。ULN2003AN的GND引脚接电源负极,COM端口接上电源正极,这里使用探索者5V电压芯片供电,可以正常使用。控制引脚,PE1接LN1,OUT1接继电器的控制引脚。继电器输出端口接上一个小灯测试开闭状态。结果显示,使用普通引脚在ULN2003的放大作用下可以驱动继电器等大功率器件。
效果图如下:
在这里插入图片描述

### 回答1: MAX4820是一种高电压、高电流继电器驱动器芯片,适合用于驱动菊花链配置的继电器。菊花链是一种能够将多个继电器在一起的串行连方式,通过只使用一个控制线就可以同时控制所有继电器。 下面是一个简单的MAX4820继电器驱动菊花链的代码示例: ``` #include <SPI.h> // 设置MAX4820的花色链长度 #define MAX4820_CHAIN_LENGTH 3 // 菊花链的数据 byte chainData[MAX4820_CHAIN_LENGTH]; // 初始化MAX4820继电器驱动芯片 void setup() { // 初始化SPI引脚 SPI.begin(); // 配置SPI工作模式 SPI.setDataMode(SPI_MODE0); // 设置菊花链的数据(0表示关,1表示开) chainData[0] = 1; chainData[1] = 0; chainData[2] = 1; // 发送数据到菊花链 updateChain(); } // 发送数据到菊花链 void updateChain() { // 选择MAX4820芯片 digitalWrite(SS, LOW); // 发送数据到菊花链 for(int i = MAX4820_CHAIN_LENGTH - 1; i >= 0; i--) { SPI.transfer(chainData[i]); } // 取消选择MAX4820芯片 digitalWrite(SS, HIGH); } // 循环函数 void loop() { // 设置延迟时间 delay(1000); // 更改菊花链的数据 for(int i = 0; i < MAX4820_CHAIN_LENGTH; i++) { chainData[i] = !chainData[i]; } // 发送数据到菊花链 updateChain(); } ``` 上述代码示例中,首先需要配置MAX4820芯片的菊花链长度(在这里设置为3)。然后,使用SPI库函数进行初始化和配置SPI通信方式。下来,定义了一个数组chainData来保存菊花链中每个继电器的状态数据,0表示关,1表示开。在setup函数中,对菊花链数据进行初始化,并将其发送到菊花链中。在loop函数中,通过循环将菊花链每个继电器的状态进行翻转,并发送更新后的数据到菊花链。 通过这段代码,我们可以实现对MAX4820继电器驱动芯片上菊花链配置的多个继电器进行控制。 ### 回答2: max4820继电器驱动芯片是一种高性能的多路继电器驱动器,可用于控制多个继电器的开关。以下是一个简单的用于驱动菊花链的代码示例。 首先,我们需要定义一些宏和引脚连: ```c #define MAX4820_CLK_PIN 2 //连到CLK引脚的Arduino引脚 #define MAX4820_DIN_PIN 3 //连到DIN引脚的Arduino引脚 #define MAX4820_LOAD_PIN 4 //连到LOAD引脚的Arduino引脚 ``` 下来,我们需要初始化引脚: ```c void setup(){ pinMode(MAX4820_CLK_PIN, OUTPUT); pinMode(MAX4820_DIN_PIN, OUTPUT); pinMode(MAX4820_LOAD_PIN, OUTPUT); digitalWrite(MAX4820_CLK_PIN, LOW); digitalWrite(MAX4820_DIN_PIN, LOW); digitalWrite(MAX4820_LOAD_PIN, HIGH); } ``` 然后,我们可以编写一个函数来控制继电器的开关状态。该函数将采用一个整数参数,表示要控制的继电器的位位置(从0开始计数),以及要设置的状态(0表示关闭,1表示打开)。 ```c void setRelayState(int bitPosition, int state){ digitalWrite(MAX4820_LOAD_PIN, LOW); for(int i = 0; i < 16; i++){ digitalWrite(MAX4820_CLK_PIN, LOW); if(i == bitPosition){ digitalWrite(MAX4820_DIN_PIN, state); }else{ digitalWrite(MAX4820_DIN_PIN, LOW); } digitalWrite(MAX4820_CLK_PIN, HIGH); } digitalWrite(MAX4820_LOAD_PIN, HIGH); } ``` 最后,在Arduino的`loop()`函数中,我们可以调用`setRelayState()`函数来控制继电器。 ```c void loop(){ // 打开继电器0 setRelayState(0, 1); delay(1000); // 关闭继电器0 setRelayState(0, 0); delay(1000); } ``` 上述代码示例假设继电器驱动芯片和Arduino之间的电气连是正确的,并且已正确编程设置了引脚。 这段代码使用了菊花链通信协议,通过顺序传递二进制位来控制继电器的状态。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值