作者共发了8篇帖子。 内容转换:不转换▼
 
点击 回复
495 7
【方法】STM32单片机控制PNP三极管导通状态
一派护法 十九级
1楼 发表于:2016-6-30 15:47

【电路】

一派护法 十九级
2楼 发表于:2016-6-30 15:50
【程序】
#include "stm32f10x.h"
#define _BV(n) (1 << (n))
#define K1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)
// 延时函数
void delay()
{
 uint32_t i;
 for (i = 0; i < 20000; i++);
}
int main(void)
{
 GPIO_InitTypeDef init;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启PB时钟
 // PB8~15为输出
 init.GPIO_Pin = 0xff00;
 init.GPIO_Speed = GPIO_Speed_50MHz;
 init.GPIO_Mode = GPIO_Mode_Out_OD;
 GPIO_Init(GPIOB, &init);
 // PB0~7为输入
 init.GPIO_Pin = 0x00ff;
 init.GPIO_Mode = GPIO_Mode_IPD;
 GPIO_Init(GPIOB, &init);
 while (1)
 {
  // 当按键1按下时
  if (!K1)
  {
   delay();
   if (!K1)
   {
    GPIOB->ODR ^= _BV(8); // 反转负载所在引脚的电平
    while (!K1);
   }
  }
 }
}
一派护法 十九级
3楼 发表于:2016-6-30 15:57
【说明】
只需要将I/O口的输出模式设为GPIO_Mode_Out_OD(开漏输出),输出的电平就能控制PNP三极管的导通状态。三极管的基极上只需要接200Ω的电阻。
如果把上面程序中的输出模式改为GPIO_Mode_Out_PP(推挽输出)的话,那么无论怎么按K1键,都无法改变三极管的导通状态,所以LED灯始终都是亮着的。
一派护法 十九级
4楼 发表于:2016-6-30 16:04

如果负载不是通过PNP三极管的基极控制,而是直接接在了单片机的I/O口上的话,那么输出模式应该改回GPIO_Mode_Out_PP(推挽输出)。

因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻。
例如:

如果用开漏模式输出的话,LED发光会非常暗。

一派护法 十九级
5楼 发表于:2016-6-30 16:05
一派护法 十九级
6楼 发表于:2016-6-30 17:08

STM32中,普通I/O口只有两种输出模式:开漏和推挽。

一派护法 十九级
7楼 发表于:2016-6-30 17:19
【四种输入模式】
GPIO_Mode_AIN 模拟输入:用于输入模拟信号
GPIO_Mode_IN_FLOATING 浮空输入:引脚悬空时,读取该端口的电平是不确定的
GPIO_Mode_IPD 下拉输入:没有输入信号的时候默认输入低电平
GPIO_Mode_IPU 上拉输入:没有输入信号的时候默认输入高电平

另外,对于两种复用输出模式,只对内置外设(比如串口之类的功能)有效,不能在普通I/O口上设置使用。
一派护法 十九级
8楼 发表于:2016-6-30 18:03

因为普中开发板上的I/O口都接了上拉电阻,默认就是输入高电平,不存在没有输入信号的情况,所以在程序中输入模式可以随便设置。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:495 回复数:7
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-6-30 18:03
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。