實驗說明:
PSoC GPIO控制的實現,本文將利用PSoC晶片實現基本的軟體和硬體功能,其主要內容是GPIO控制程序的設計與學習。它將單獨控制兩個數位訊號端口,分別為數位輸入訊號與輸出訊號,並搭配LCD螢幕作為顯示效果。
- 此實驗將製作一個火焰警報器,火焰傳感器(即紅外接收三極管)是機器人專門用來搜尋火源的傳感器,本傳感器對火焰特別靈敏。
- 火焰傳感器利用紅外線對火焰非常敏感的特點,使用特製的紅外線接收管來檢測火焰,然後把火焰的亮度轉化為高低變化的電位訊號,輸入到PSoC中央處理器,PSoC再根據訊號的變化做出相應的程序處理。
材料:
- PSoC 5LP 開發板
- USB 傳輸線
- 火焰感測器
- 蜂鳴器
- 杜邦線
PSoC Creator 設計流程:
【建構 PSoC 專案】
建立專案(在功能表[File] ➔ [New] ➔ [Project…])
- 選擇Empty PSoC 5LP Design
- Name : 輸入專案名稱
- Location : 檔案儲存路徑
- 確認完成後,點擊“OK”
【添加自定義元件 – 配置LCD】
1. 拖曳組件目錄下的LCD顯示元件並將其放置於工作窗口內(Component Catalog->Display->Character LCD)。
2. 點擊Schematic的LCD_Char_1組件打開配置窗口。
3. 按照如下方式配置LCD端口:
- Name: LCD
- LCD Custom Character Set: None
- Include ASCII to Number Conversion Routines:打勾
- 其餘選項皆為默認值
- 確認完成後,點擊“OK”
【添加自定義元件 – 配置GPIO】
PSoC系列中基本上每隻I/O腳都提供下面狀態的設定值。
- High Impedance Analog
高阻抗類比輸入,用來做類比訊號輸入使用,雖說是用來做輸入的,但是使用內部D/A的時候也是使用這個類型的腳位做輸出。
- High Impedance Digital
高阻抗數位輸入,基本上這個I/O腳設定之後會變成一高阻抗的I/O腳,用來做輸入使用,因為高阻抗才能夠對外部輸入的電壓很敏感,故一般高阻抗輸入的時候,外面所連接的I/O腳都是呈低阻抗。
- Resistive Pull Up
內置上拉電阻,此模式,可以用來做輸入、輸出使用,也就是說它可以同時存在兩種狀態(不須切換),但是通常我都是用來做輸入狀態比較多。
- Resistive Pull Down
內置下拉電阻,這個模式與Resistive Pull Up大致相同,只是一個是上拉,另外一個是下拉。
- Strong Drive
低阻抗輸出模式,在這個狀態下,I/O腳呈現一低阻抗狀態,以便可以輸出Hi/Low訊號。
▼ 配置蜂鳴器數位訊號輸出端口
1. 拖曳並將數位端口的組件放置於作窗口內(Component Catalog-> Ports and Pins->Digital Output Pin)
2. 點擊Schematic的Pin_1打開配置窗口。
3. 在Type標籤下,按照如下方式配置數位端口:
- Name:Buzzer
- 選擇Digital Output選項,但不選HW Connection(表示由軟體控制)選項
4. 在General標籤下進行如下配置
- Drive Mode:Strong Drive
- 其餘選項皆為默認值
- 確認完成後,點擊“OK”
▼ 配置火焰感測器數位訊號輸入端口
1. 拖曳並將數位端口的組件放置於作窗口內(Component Catalog-> Ports and Pins->Digital Input Pin)
2. 點擊Schematic的Pin_1打開配置窗口。
3. 在Type標籤下,按照如下方式配置數位端口:
- Name: isFlamePin
- 選擇Digital Input選項,但不選HW Connection(表示由軟體控制)選項
4. 在General標籤下進行如下配置
- Drive Mode: High Impedance Digital
- 其餘選項皆為默認值
- 確認完成後,點擊“OK”
▼ 配置完成後的Schematic如下圖
【配置引腳】
引腳配置步驟如下:
- 在Workspace Explorer窗口點擊cydwr。
- LCD選擇引腳為P2[6:0]
- Buzzer選擇引腳為P3[4]
- isFlamePin選擇引腳為P3[5]
接線說明:
▼ 有源蜂鳴器接線方式請參考下表:
▼ 火焰感測器接線方式請參考下表:
編譯:
▼ 點擊Program,將會產生各組件的函式庫。
程式:
在Workspace Explorer窗口點擊main.c。
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include <project.h>
int main()
{
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
uint8 val=0;
LCD_Start(); //啟動LCD1602A
LCD_Position(0,0); //移動LCD游標到 0行,0列
LCD_PrintString("Hi Mirotek"); //在LCD上顯示字串"Hi Mirotek"
/* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
for(;;)
{
/* Place your application code here. */
//FLAME detection
val= isFlamePin_Read();
LCD_Position(1,0);
if(val==1){
LCD_PrintString(" ");
Buzzer_Write(0); //無火源訊號時,蜂鳴器不工作
}else{
LCD_PrintString("FLAME !!!");
Buzzer_Write(1); //檢測到火源訊號時,蜂鳴器發報警
}
}
}
/* [] END OF FILE */
實驗結果:
當檢測到火源訊號時,蜂鳴器發報警聲響,並讓LCD字串顯示”FLAME !!!”;