最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

第二章 通用輸入輸出口GPIO

2023-08-29 15:07 作者:高博士_嵌入式  | 我要投稿

配件包的購(gòu)買鏈接:

1. GPIO的基本結(jié)構(gòu)

1.1 通用輸入與輸出GPIO

GPIO(General Purpose Input Output)意思是通用輸入輸出口可配置為8種輸入輸出模式,其引腳電平:0V~3.3V,部分引腳可容忍5V(容忍5V的意思是可以在這個(gè)端口輸入5V,相當(dāng)于輸入一個(gè)高電平,而輸出一直都是3.3V不變)。IO口引腳定義圖里面在IO口電平這一欄標(biāo)注FT的就是可以容忍5.5V輸入的。(如下圖標(biāo)紅區(qū)域所示)

部分GPIO列表


輸出模式下可控制端口輸出高低電平,用以驅(qū)動(dòng)LED、控制蜂鳴器(直接通過(guò)GPIO來(lái)控制高低電平即可),如果要控制較大功率的電路則需要在此基礎(chǔ)上加入驅(qū)動(dòng)電路,模擬通信協(xié)議輸出時(shí)序(例如I2C,SPI等某個(gè)芯片的特定協(xié)議)等功能。

輸入模式下可讀取端口的高低電平或電壓,用于讀取按鍵輸入、外接模塊電平信號(hào)輸入(例如光敏電阻模塊與熱敏電阻模塊)、ADC電壓采集(模數(shù)轉(zhuǎn)換器)、模擬通信協(xié)議接收數(shù)據(jù)(接收通信線上的數(shù)據(jù))等

?

1.1.1? GPIO的結(jié)構(gòu)

GPIO的基本結(jié)構(gòu)

GPIO內(nèi)部結(jié)構(gòu)框圖

上圖就是GPIO的整體構(gòu)造,其中紫色部分是APB2外設(shè)總線,在STM32中所有的GPIO都是掛載在APB2外設(shè)總線上的,而GPIO的命名是類似像GPIOA,GPIOB......等等這樣來(lái)命名的,其中每個(gè)GPIO上有16個(gè)引腳命名為PX0到PX15(X代表的是哪個(gè)GPIO)。而每個(gè)GPIO里有寄存器驅(qū)動(dòng)器兩部分,STM32中是內(nèi)核通過(guò)APB2總線對(duì)寄存器來(lái)進(jìn)行讀寫(xiě)(高電平給1,低電平給0),由于STM32是32位單片機(jī),所以每個(gè)寄存器都是32位,而GPIO的端口只有十六位,所以每個(gè)寄存器只有低十六位才有端口可以進(jìn)行GPIO的輸入輸出操作,而高十六位是保持不變的。這里驅(qū)動(dòng)器是增強(qiáng)信號(hào)的驅(qū)動(dòng)能力,讓信號(hào)可以更明顯的傳達(dá)給單片機(jī)。

GPIO的位結(jié)構(gòu)(如下圖所示)

GPIO內(nèi)部原理框圖

綠色部分:這里接兩個(gè)保護(hù)二極管是為了對(duì)輸入電壓進(jìn)行限幅(保護(hù)內(nèi)部電路),VDD接3.3V 的電壓,VSS接0V的電壓,當(dāng)輸入電壓超過(guò)3.3V時(shí)上方二極管就會(huì)導(dǎo)通,電壓流入VDD不進(jìn)入內(nèi)部電路,避免過(guò)高的電壓對(duì)內(nèi)部電路造成傷害,當(dāng)輸入電壓超過(guò)3.3V時(shí)下方二極管就會(huì)導(dǎo)通,電流流入VSS不從內(nèi)部電路汲取電流,對(duì)內(nèi)部電路形成保護(hù),而當(dāng)電壓在3.3V~0V時(shí)則直接流入內(nèi)部電路,二極管不導(dǎo)通。

輸入部分:當(dāng)IO口進(jìn)入輸入模式的時(shí)候,這里接了一個(gè)上拉電阻和一個(gè)下拉電阻。上拉電阻至VDD,下拉電阻至VSS,這個(gè)開(kāi)關(guān)是可以通過(guò)程序進(jìn)行配置的,如果上面導(dǎo)通,下面斷開(kāi),就是上拉輸入模式,如果上面斷開(kāi),下面導(dǎo)通,就是下拉輸入模式。如果兩個(gè)都斷開(kāi),就是浮空輸入模式,這里其實(shí)是為了給輸入提供一個(gè)默認(rèn)的輸入電平,因?yàn)閷?duì)于一個(gè)數(shù)字端口,輸入不是高電平就是低電平,如果輸入引角什么都不接,那就不知道是高電平還是低電平,這時(shí)候的輸入就會(huì)處于一種浮空狀態(tài)。引腳的輸入電平會(huì)受到外界干擾而改變,為了避免引腳懸空導(dǎo)致輸入數(shù)據(jù)不穩(wěn)定,我們就需要加上拉電阻或下拉電阻。如果接入上拉電阻,當(dāng)引腳懸空時(shí),有上拉電阻來(lái)保證引腳的輸入方式是高電平,如果接入下拉電阻,就默認(rèn)為低電平的輸入方式。同時(shí)這里的上拉電阻和下拉電阻的阻值是非常大的。是一種弱上拉和弱下拉目的是為了盡量保證不影響正常的輸入操作接下來(lái)是一個(gè)施密特觸發(fā)器,這里翻譯錯(cuò)誤,英文版的手冊(cè)給的就是施密特觸發(fā)器,而這個(gè)施密特特觸發(fā)器的作用就是對(duì)輸入電壓進(jìn)行整形的輸入。如果輸入電壓大于某一閾值,輸出就會(huì)瞬間變拉高為高電頻,如果輸入電壓小于某一閾值,輸出就會(huì)瞬間降為低電頻。通過(guò)施密特觸發(fā)器整形的波形就可以直接寫(xiě)入輸入數(shù)據(jù)寄存器。就可以得到端口的輸入電平。輸入數(shù)據(jù)寄存器上面有兩條線是連接單片機(jī)上面的外設(shè),其中模擬輸入是連接ADC模塊的,ADC模塊是要將模擬電路數(shù)字化,所以說(shuō)要接到施密特觸發(fā)器之前(為了將模擬信號(hào)準(zhǔn)確數(shù)字化),而復(fù)用功能是連接到其他讀取端口的外設(shè)上,所以要接到施密施密特觸發(fā)器之后。(施密特觸發(fā)器的具體作用如下圖所示)

施密特觸發(fā)器的草圖

黑色部分代表具體的輸入電壓,而紅色部分代表經(jīng)過(guò)施密特觸發(fā)器處理后的電壓只有當(dāng)輸入電壓達(dá)到高電平的閾值上限后才會(huì)變成高電平,當(dāng)輸入電壓達(dá)到低電平的閾值下限后才會(huì)變?yōu)榈碗娖健?/p>

輸出部分:如果選擇通過(guò)輸出數(shù)據(jù)寄存器進(jìn)行控制,就是普通的IO口來(lái)寫(xiě)這個(gè)數(shù)據(jù)寄存器的某一位,就可以操作對(duì)應(yīng)的某個(gè)端口了。左邊有一個(gè)叫做位設(shè)置清除寄存器。用來(lái)單獨(dú)操作輸出數(shù)據(jù)寄存器的某一位,而不影響其他位,而這個(gè)輸出數(shù)據(jù)寄存器可以控制同時(shí)控制16個(gè)端口,并且這個(gè)寄存器只能整體讀寫(xiě)。所以如果想單獨(dú)控制其中某一個(gè)端口而不影響其他端口的話,就需要一些特殊的操作方式。第一種方式就是先讀出這個(gè)寄存器,然后用按位或和按位與兩種方式更改某一位,最后再將更改后的數(shù)據(jù)寫(xiě)回去即可。第二種方式是通過(guò)設(shè)置位設(shè)置和位清除寄存器,如果我們要對(duì)某一位進(jìn)行置1的操作,在位設(shè)置寄存器上的對(duì)應(yīng)位寫(xiě)1即可,剩下不需要操作的位寫(xiě)0,這樣內(nèi)部就會(huì)有電路生成。自動(dòng)將輸出數(shù)據(jù)集存器中對(duì)應(yīng)位置為1,而剩下寫(xiě)0的位則保持不變,這樣就保證了只操作其中一位而不影響其他位,并且這是一步到位的操作。如果想對(duì)某一位進(jìn)行清零的操作,就在位清除寄存器的對(duì)應(yīng)位寫(xiě)1即可。這樣內(nèi)部電路就會(huì)把這位清零了。接下來(lái)輸出控制之后,就接到兩個(gè)MOS管,上面是P—MOS,下面是N—MOS。這個(gè)MOS管就是一種電子開(kāi)關(guān),我們的信號(hào)通過(guò)控制開(kāi)關(guān)的導(dǎo)通和關(guān)閉。開(kāi)關(guān)負(fù)責(zé)將IO口接到VDD或者VSS。在這里可以選擇推挽、開(kāi)路或關(guān)閉三種輸出方式。在推挽輸出模式下,P—MOS和N—MOS均有效。數(shù)據(jù)寄存器為1是上導(dǎo),上管導(dǎo)通,下管斷開(kāi),輸出直接接到VDD,就是輸出高電平。數(shù)據(jù)寄存器為零時(shí),上管斷開(kāi),下管導(dǎo)通,輸出直接接到VSS,就是輸出低電平。這種模式下,高電平均有較強(qiáng)的驅(qū)動(dòng)能力,所以推挽輸出模式也可以叫做強(qiáng)推輸出模式在推廣輸出模式下STM32對(duì)IO口具有絕對(duì)的控制性,,在開(kāi)漏輸出模式下,這個(gè)P—MOS是無(wú)效的,只有N—MOS是在工作的。數(shù)據(jù)寄存器為1時(shí),下管斷開(kāi),這個(gè)輸出相當(dāng)于斷開(kāi),已經(jīng)是高阻模式。數(shù)據(jù)寄存器為零時(shí),下管導(dǎo)通,輸出直接接到VSS,也就是輸出低電頻,這種模式下只有低電平有驅(qū)動(dòng)能力,高電平是沒(méi)有驅(qū)動(dòng)能力的。開(kāi)路模式是可以作為通信協(xié)議的驅(qū)動(dòng)方式(I2C),在多機(jī)通信的情況下,這個(gè)模式可以避免各個(gè)設(shè)備的相互干擾。另外,開(kāi)路模式還可以用于輸出五伏的電頻信號(hào),(在IO口外接一個(gè)上拉電阻到五伏的電源),當(dāng)輸入電平低電平時(shí),由內(nèi)部的N—MOS直接接到VSS.當(dāng)輸出高電平時(shí),由外部的上拉電阻拉高至五伏,這樣就可以輸出5伏的電頻信號(hào),用兼容一些5V電平的設(shè)備,這就是開(kāi)。這就是開(kāi)路輸出的主要用途,剩下的一種狀態(tài)就是關(guān)閉,這個(gè)是當(dāng)引角配置為輸入模式的時(shí)候,兩個(gè)MOS管都無(wú)效,也就輸出關(guān)閉端口的電頻由外部信號(hào)來(lái)控制的(輸入模式)。

1.1.2? GPIO的輸出與輸入模式

GPIO的輸出模式有以下四種方式:

(1)開(kāi)漏輸出:數(shù)字輸出,可輸出引腳電平,高電平為高阻態(tài),低電平接VSS。

(2)推挽輸出:數(shù)字輸出 可輸出引腳電平,高電平接VDD,低電平接VSS。

(3)復(fù)用開(kāi)漏輸出:數(shù)字輸出 由片上外設(shè)控制,高電平為高阻態(tài),低電平接VSS。

(4)復(fù)用推挽輸出:數(shù)字輸出,由片上外設(shè)控制,高電平接VDD,低電平接VSS。

(5)浮空輸入:數(shù)字輸入? 可讀取引腳電平,若引腳懸空,則電平不確定

(6)上拉輸入:數(shù)字輸入? 可讀取引腳電平,內(nèi)部連接上拉電阻,懸空時(shí)默認(rèn)高電平

(7)下拉輸入:數(shù)字輸入? 可讀取引腳電平,內(nèi)部連接下拉電阻,懸空時(shí)默認(rèn)低電平

(8)模擬輸入:模擬輸入? GPIO無(wú)效,引腳直接接入內(nèi)部ADC

本章節(jié)用到的普通輸出與輸入模式的硬件電路在上面對(duì)GPIO的位結(jié)構(gòu)中有講解,所以接下來(lái)重點(diǎn)講解GPIO的復(fù)用推挽輸出與復(fù)用開(kāi)漏輸出和模擬輸入:

模擬輸入的基本原理圖如下:

GPIO模擬輸入原理圖

由此圖可以看出,輸出是斷開(kāi)的,并且施密特觸發(fā)器也是關(guān)閉的,所以整個(gè)GPIO的結(jié)構(gòu)是沒(méi)有用的,所以模擬輸入是直接從引腳接入單片機(jī)上面的外設(shè)(ADC),所以當(dāng)我們使用ADC的時(shí)候給GPIO引腳配置為模擬輸入即可。

?復(fù)用推挽輸出與復(fù)用開(kāi)漏輸出具體硬件原理圖如下所示:

GPIO的復(fù)用功能配置

由此圖和上面GPIO的位結(jié)構(gòu)圖對(duì)比可以看到復(fù)用功能設(shè)置時(shí)輸出控制并沒(méi)有和輸出數(shù)據(jù)寄存器相連接,引腳電平高低的控制權(quán)轉(zhuǎn)移到了與單片機(jī)外設(shè)上,由片上外設(shè)控。而在輸入部分片上外設(shè)也可以讀取電平的高低,同時(shí)普通的輸入也是有效的,也可以同時(shí)接收電平信號(hào)。對(duì)于GPIO的八種輸入輸出功能,除了模擬輸入關(guān)閉數(shù)字輸入的功能,在其他七種模式中數(shù)字輸入模式都是有效的。

2.?GPIO輸出的實(shí)驗(yàn)案例

2.1? 對(duì)LED和蜂鳴器的簡(jiǎn)單介紹

LED:發(fā)光二極管,正向通電點(diǎn)亮,反向通電不亮(判斷LED正負(fù)極一般兩種方式:第一種方式是從側(cè)面觀察兩條引出線在管體內(nèi)的形狀.較小的是正極 ,第二種方式是看引腳的長(zhǎng)短,引腳長(zhǎng)的為正極,短的為負(fù)極)。

實(shí)物圖與電路圖如下:

插件式發(fā)光二極管


有源蜂鳴器:內(nèi)部自帶振蕩源,將正負(fù)極接上直流電壓即可持續(xù)發(fā)聲,頻率固定

無(wú)源蜂鳴器:內(nèi)部不帶振蕩源,需要控制器提供振蕩脈沖才可發(fā)聲,調(diào)整提供振蕩脈沖的頻率,可發(fā)出不同頻率的聲音(STM32所用是有源蜂鳴器)。

蜂鳴器原理圖

2.2??LED燈閃爍實(shí)驗(yàn)

由于我們拿到的開(kāi)發(fā)板是沒(méi)有組裝,需要我們手動(dòng)組裝,具體接線如下圖所示。(本實(shí)驗(yàn)只需要將最小系統(tǒng)板與一個(gè)LED燈連接起來(lái))

面包板接線圖

實(shí)物圖如下:

實(shí)物接線圖


實(shí)驗(yàn)內(nèi)容:

LED閃爍即是用延時(shí)函數(shù)來(lái)實(shí)現(xiàn)的(給LED亮滅的時(shí)間進(jìn)行控制即可達(dá)到閃爍的效果)延時(shí)函數(shù)在我們配置好STM32CubeMX之后會(huì)自動(dòng)生成,我們只需要拿來(lái)使用即可。注意再次強(qiáng)調(diào)工程名最好不是中文路徑,中文路徑可以生成代碼,但是容易出錯(cuò)。

由接線圖可得我們給LED接線的是PA0引腳所以在STM32CubeMX中將PA0設(shè)置為輸出模式即可,剩余其他配置按照工程模板不變即可生成初始代碼。

cubemx操作

得到初始化代碼后每次都要進(jìn)行如下操作才能使用STlink將代碼下載到單片機(jī)中:點(diǎn)擊魔術(shù)棒點(diǎn)Debug,仿真器選擇STlink然后點(diǎn)Settingsflash Download中勾選Reset and Run。

keil mdk中的stlink配置入口
勾選“Reset and Run

具體手打代碼只需要實(shí)現(xiàn)給LED亮滅的時(shí)間通過(guò)延時(shí)函數(shù)控制即可。

while (1)

? {

??? /* USER CODE END WHILE */

?

??? /* USER CODE BEGIN 3 */

?? ? HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET );

? ? ? //電平給低讓LED亮起來(lái)

?? ? HAL_Delay(300);//進(jìn)行延時(shí)

?? ? HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET );

? ? //電平給高熄滅LED

?? ? HAL_Delay(300);//進(jìn)行延時(shí)

? }

LED_GPIO_Port與LED_Pin是對(duì)GPIOA和GPIO_PIN_0的宏定義讓代碼可讀性提高。

2.3? LED流水燈實(shí)驗(yàn)

流水燈的接線圖相比LED閃爍就是多接了幾個(gè)LED其他相比LED閃爍沒(méi)有任何變化(接線圖如下所示)。

流水燈面包板接線示意圖

實(shí)物圖如下

?

接線實(shí)物圖

實(shí)驗(yàn)內(nèi)容:

這個(gè)實(shí)驗(yàn)只需要通過(guò)延時(shí)函數(shù)和HAL_GPIO_WritePin不斷對(duì)電平寫(xiě)高寫(xiě)低再加上延時(shí)函數(shù)即可,在STM32中配置時(shí)只需要對(duì)這些LED的引腳設(shè)為輸出模式即可。

cubemx配置

具體手寫(xiě)代碼如下:

while (1)

? {

????? HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET );

//拉低電平讓第一個(gè)LED亮起來(lái)

?? ? HAL_Delay(300);//延時(shí)

?? ? HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET );

//拉高電平熄滅第一個(gè)LED

?? ? HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET );

//拉低電平讓第二個(gè)LED亮起來(lái)

?? ? HAL_Delay(300);//延時(shí)

?? ? HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET );

//拉高電平熄滅第二個(gè)LED

?? ? HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET );

//拉低電平讓第三個(gè)LED亮起來(lái)

?? ? HAL_Delay(300);//延時(shí)

?? ? HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET );

//拉高電平熄滅第三個(gè)LED

/*下方代碼重復(fù)上述步驟即可。*/

?? ? HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET );

?? ? HAL_Delay(300);

?? ? HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET );

?

?? ? HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET );

?? ? HAL_Delay(300);

?? ? HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET );

?

?? ? HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_RESET );

?? ? HAL_Delay(300);

?? ? HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,GPIO_PIN_SET );

?

?? ? HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_RESET );

?? ? HAL_Delay(300);

?? ? HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,GPIO_PIN_SET );

?

?? ? HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_RESET );

?? ? HAL_Delay(300);

?? ? HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,GPIO_PIN_SET );?

? }

?1.2.4? 蜂鳴器報(bào)警

蜂鳴器的具體接線圖如下:

面包板接線示意圖

實(shí)物圖如下:

?

實(shí)驗(yàn)內(nèi)容:

實(shí)現(xiàn)蜂鳴器報(bào)警的原理與LED閃爍基本一致,讓蜂鳴器發(fā)出聲響,我們只需要將蜂鳴器的IO口給低電平,讓電流導(dǎo)通即可。而對(duì)于STM32的配置也如上面兩個(gè)實(shí)驗(yàn)一樣如法炮制,由于蜂鳴器接的IO口是PB12,所以將PB12設(shè)置成輸出模式即可,而具體的手打代碼也與LED閃爍類似,只不過(guò)是宏定義名稱不同,具體手打代碼如下。

?while (1)

? {

??? /* USER CODE END WHILE */

?

??? /* USER CODE BEGIN 3 */

? ? HAL_GPIO_WritePin(BEZZER_GPIO_Port,BEZZER_Pin,GPIO_PIN_RESET );

? ? ?//BEZZER是對(duì)IO口PB12的宏定義

?? ? HAL_Delay(500);

?? ?? HAL_GPIO_WritePin(BEZZER_GPIO_Port,BEZZER_Pin,GPIO_PIN_SET );

?? ? HAL_Delay(500);

? }

??

3.?GPIO輸入的實(shí)驗(yàn)案例

3.1? 具體認(rèn)識(shí)按鍵的硬件電路與光敏傳感器的硬件電路

3.1.1??? 按鍵的硬件電路

在介紹按鍵的硬件電路之前先認(rèn)識(shí)一下按鍵:按鍵是最常見(jiàn)的輸入設(shè)備,按下導(dǎo)通,松手?jǐn)嚅_(kāi)。按鈕按下去的時(shí)候,下面兩個(gè)引腳就接通,松手后這兩個(gè)引角就自動(dòng)斷開(kāi):

物理按鍵

本圖旁邊這個(gè)圖按鍵抖動(dòng)原理,如果不對(duì)按鍵進(jìn)行消抖的話,會(huì)出現(xiàn)按鍵按下一次,單片機(jī)反應(yīng)多次的現(xiàn)象,而實(shí)現(xiàn)按鍵消抖最常用的辦法是按鍵按下和松手時(shí)進(jìn)行延時(shí),耗過(guò)按鍵抖動(dòng)時(shí)間,直接進(jìn)入平穩(wěn)的電平。

按鍵的具體接線方式有以下四種方式:

按鍵的四種接線方式

上圖中,1與2是下接按鍵的方式,3與4是上接按鍵的方式,一般單片機(jī)就是用下接按鍵的方式(與LED的接入方式相吻合),圖1下接按鍵就是外接GND負(fù)極,這樣當(dāng)按鍵按下時(shí)候電路導(dǎo)通,直接給單片機(jī)引腳給低電平,而當(dāng)按鍵松手時(shí),此時(shí)單片機(jī)引腳處于浮空狀態(tài),浮空狀態(tài)時(shí)單片機(jī)引腳不確定,這個(gè)時(shí)候要求IO口的輸入模式必須是上拉輸入模式(當(dāng)按鍵沒(méi)有被按下時(shí)上拉輸入模式認(rèn)定引腳此時(shí)為高電平),否則會(huì)出現(xiàn)引腳電壓不明確的狀態(tài),而圖2對(duì)比圖1就多了一個(gè)上拉電阻,這樣當(dāng)按鍵松手之后,上拉電阻就會(huì)起作用將引腳拉到高電平,這樣引腳電壓就會(huì)確定下來(lái),所以此時(shí)IO口的輸入模式可以是上拉輸入,也可以是下拉輸入。(圖3與圖4的接法原理與上述兩種相似并且不太 常用,所以不做過(guò)多贅述)

?3.1.2??? 傳感器的硬件電路

首先認(rèn)識(shí)傳感器模塊:傳感器模塊:傳感器元件(光敏電阻/熱敏電阻/紅外接收管等)的電阻會(huì)隨外界模擬量的變化而變化,通過(guò)與定值電阻分壓即可得到模擬電壓輸出,再通過(guò)電壓比較器進(jìn)行二值化即可得到數(shù)字電壓輸出。(實(shí)物圖如下)

幾種傳感器模組

內(nèi)部集成電路如下圖所示:

傳感器的電路原理圖

以上這些電路中的字母所表示的含義如下:

VCC:電源正極 3.3V—5V,GND:電源負(fù)極,DO(Digital Output):數(shù)字量輸出接口,AO(Analog Output):模擬量輸出接口,LED1:電源指示燈,LED2:數(shù)字量輸出指示燈,LM393:在此用作電壓比較器,R2:電位器(用于調(diào)節(jié)模塊的靈敏度)

工作原理:

電壓比較器工作過(guò)程,當(dāng)用LM393電壓比較器時(shí),如果陽(yáng)極電壓大于陰極電壓,那么輸出將會(huì)使高電平,如果陰極電壓大于陽(yáng)極電壓,將會(huì)輸出低電平。

DO是LM393電壓比較器的輸出端,其陽(yáng)極連接到了R1電阻與N1電阻之間,作被比較電壓,而陰極接到了一個(gè)電位器上,作校準(zhǔn)電壓,所以當(dāng)陽(yáng)極的電壓大于校準(zhǔn)電壓時(shí),LM393電壓比較器DO端口輸出高電位,反之亦然,但是DO口本就通過(guò)電阻連接VCC,所以DO口默認(rèn)輸出高電位,只有當(dāng)被比較電壓低于校準(zhǔn)電壓時(shí),DO口才輸出低電壓,此時(shí)LED2燈發(fā)光。

靈敏度調(diào)節(jié):靈敏度調(diào)節(jié)是通過(guò)R2電位器進(jìn)行調(diào)節(jié)的,當(dāng)電位器端的電壓調(diào)的較小時(shí),也就是電壓比較器的陰極電壓比較小時(shí),NTC熱敏電阻將需要承受更高的溫度,才能使陽(yáng)極電壓小于陰極電壓,從而輸出低電位,以上就是關(guān)于傳感器顳部集成電路的自我認(rèn)識(shí)。

而單片機(jī)相連的電路如下圖所示:

stm32的某個(gè)io口與傳感器模塊相連的原理圖

? ?由于是集成的模塊電路所以只需要做好接線就可以,具體接線就是GND接GND,VCC接VCC,然后DO隨便接一個(gè)IO口即可,而AO的原理將會(huì)在ADC模塊進(jìn)行講解,現(xiàn)在不做贅述。

3.2? 按鍵控制LED

按鍵控制LED的具體組裝圖如下圖所示

面包板按鍵連線示意圖

具體實(shí)物圖如下所示:

實(shí)物圖

實(shí)驗(yàn)內(nèi)容:

本實(shí)驗(yàn)要求按鍵能獨(dú)立控制LED的亮滅,設(shè)燈的初始狀態(tài)為滅,按鍵第一次按下之后燈亮,按鍵再次按下之后燈滅,兩個(gè)按鍵能獨(dú)立控制兩個(gè)LED實(shí)現(xiàn)亮滅,具體STM32Cube MX與Keil MDK配置如下:

首先在STM32CubeMX中將PA1與PA2配置為輸出模式,將PB1與PB 11配置為輸入模式(如下圖所示)

配置為輸入模式


然后設(shè)置GPIO口的時(shí)候由于上一節(jié)講到的按鍵輸入是上拉輸入模式所以應(yīng)該將按鍵配置成上拉輸入模式

上拉輸入模式


其他的設(shè)置保持不變,然后得到初始化代碼,然后從本節(jié)實(shí)驗(yàn)開(kāi)始要掌握模塊化編程具體操作如下:

為了讓代碼的可讀性更高我們不能讓所有的手打代碼都都在主函數(shù)中寫(xiě)出,而對(duì)于像LED與Key這樣的驅(qū)動(dòng)函數(shù)我們把它放在一起處理。

(1)點(diǎn)擊manage project items然后在group組里面新建一個(gè)文件組Hardware。

添加組

(2)在MDK—ARM的文件夾中再新建一個(gè)驅(qū)動(dòng)函數(shù)的文件名稱與(1)中名稱最好相同。

磁盤(pán)路徑上新建文件夾


(3)點(diǎn)擊魔術(shù)棒再點(diǎn)C/C++中的include path 將在MDK—ARM中新建的文件加入進(jìn)來(lái)。

導(dǎo)入包含路徑

(4)在Hardware中添加.c文件與.h文件時(shí)要保證路徑在Hardware中

添加Item到組

這樣就能創(chuàng)建一個(gè).c文件與.h文件將驅(qū)動(dòng)程序封裝起來(lái)。

接下來(lái)開(kāi)始打手動(dòng)代碼具體按鍵控制LED操作代碼如下

//LED模塊代碼

?#include "main.h"

#include "gpio.h"

?

void LED1_ON(void)

{

?? HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET );//點(diǎn)亮LED

}

void LED1_OFF(void)

{

?? HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET );//熄滅LED

}

void LED1_Turn(void)//檢測(cè)LED燈的狀態(tài)

{

?? if(HAL_GPIO_ReadPin(LED1_GPIO_Port,LED1_Pin)==0)//如果燈此時(shí)亮著將電平拉高熄滅LED

?????? LED1_OFF();

?? else//如果燈此時(shí)滅著將電平拉低點(diǎn)亮LED

?????? LED1_ON();

}

/*LED2LED1代碼實(shí)現(xiàn)一致所以不作注釋*/

void LED2_ON(void)

{

?? HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET );

}

void LED2_OFF(void)

{

?? HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET );

}

void LED2_Turn(void)

{

?? if(HAL_GPIO_ReadPin(LED2_GPIO_Port,LED2_Pin)==0)

?????? LED2_OFF();

?? else

?????? LED2_ON();

}

//按鍵代碼模塊

#include "main.h"

#include "gpio.h"

uint8_t Get_KeyNum(void)

{

?? uint8_t KeyNum=0;

?? if(HAL_GPIO_ReadPin(Key1_GPIO_Port,Key1_Pin)==0)//判斷按鍵是否按下

?? {

?????? HAL_Delay(10);//按下消抖

?????? while(HAL_GPIO_ReadPin(Key1_GPIO_Port,Key1_Pin)==0);//檢驗(yàn)是否松手

?????? HAL_Delay(10);//松手消抖

?????? KeyNum=1;?? //獲取鍵值

?? }

?? if(HAL_GPIO_ReadPin(Key2_GPIO_Port,Key2_Pin)==0)

?? {

?????? HAL_Delay(10);

?????? while(HAL_GPIO_ReadPin(Key2_GPIO_Port,Key2_Pin)==0);

?????? HAL_Delay(10);

?????? KeyNum=2;??

?? }

?? return KeyNum;

}

?

//主函數(shù)模塊

while (1)

? {

?? ? KeyNumber=Get_KeyNum();//獲取鍵值

?? ? if(KeyNumber==1)//控制LED1

?? ? LED1_Turn();//LED1狀態(tài)反轉(zhuǎn)

?? ? if(KeyNumber==2)//控制LED2

?? ? LED2_Turn();? //LED2狀態(tài)反轉(zhuǎn)

? }

3.3? 光敏傳感器控制蜂鳴器

光敏傳感器控制蜂鳴器的接線圖如下圖所示:

?

光敏傳感器控制蜂鳴器接線示意圖


實(shí)物圖如下圖所示:

實(shí)物圖

實(shí)驗(yàn)內(nèi)容:

光敏傳感器控制蜂鳴器報(bào)警的實(shí)驗(yàn)要求,當(dāng)周圍光很弱的時(shí)候,蜂鳴器會(huì)發(fā)出報(bào)警,當(dāng)周圍光亮足夠時(shí),蜂鳴器不響。所以做好實(shí)驗(yàn)我們就要用光敏來(lái)控制蜂鳴器報(bào)警,與按鍵控制LED有相同之處具體STM32Cube MX與Keil MDK配置如下:

首先根據(jù)接線圖來(lái)將蜂鳴器連接的引腳PB12配置成輸出模式,將光敏傳感器的引腳PB13配置成上拉輸入模式,其他配置保持不變:

cube配置pb13為上拉輸入

對(duì)于手打代碼,仍然需要進(jìn)行模塊化編程對(duì)蜂鳴器模塊進(jìn)行封裝處理,具體操作方式與按鍵控制LED中基本一致,直接看代碼模塊:

//蜂鳴器模塊代碼:

#include "main.h"

#include "gpio.h"

void Buzzer_ON(void)//蜂鳴器響

{

?? ?HAL_GPIO_WritePin(Buzzer_GPIO_Port,Buzzer_Pin,GPIO_PIN_RESET);

}

void Buzzer_OFF(void)//關(guān)閉蜂鳴器

{

?? HAL_GPIO_WritePin(Buzzer_GPIO_Port,Buzzer_Pin,GPIO_PIN_SET);

}

void Buzzer_Turn(void)//蜂鳴器狀態(tài)反轉(zhuǎn)

{

?? if(HAL_GPIO_ReadPin(Buzzer_GPIO_Port,Buzzer_Pin)==0)

????? Buzzer_OFF();

?? else

????? Buzzer_ON();

?????

}

//主函數(shù)代碼模塊:

?while (1)

? {

? ? ??//判斷周圍光照強(qiáng)弱? ?

?? ???? if(HAL_GPIO_ReadPin(LightSensor_GPIO_Port,LightSensor_Pin)==1)

? ? ? ? ? ? Buzzer_ON();

? ? ? ? else

? ? ? ? ? ? Buzzer_OFF();??

? }


第二章 通用輸入輸出口GPIO的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
遂昌县| 海丰县| 蒲江县| 平潭县| 天峻县| 海原县| 鄂托克前旗| 萨嘎县| 九江县| 县级市| 波密县| 保亭| 手游| 阳泉市| 汤原县| 闽清县| 元氏县| 南昌县| 德化县| 池州市| 铜陵市| 上杭县| 湖口县| 镇原县| 洛南县| 嘉义县| 嵩明县| 武鸣县| 柘荣县| 永胜县| 宁远县| 乐清市| 客服| 岳西县| 岱山县| 南京市| 大连市| 泽库县| 太康县| 涞源县| 桂东县|