設置 | 登錄 | 註冊

目前共有8篇帖子。

【方法】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口都接了上拉電阻,默認就是輸入高電平,不存在沒有輸入信號的情況,所以在程序中輸入模式可以隨便設置。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。