第三十二章 光敏傳感器實驗
本章,我們將學(xué)習(xí)使用STM32開發(fā)板板載的一個光敏傳感器。我們還是要使用到ADC采集,通過ADC采集電壓,獲取光敏傳感器的電阻變化,從而得出環(huán)境光線的變化,并在TFTLCD上面顯示出來。
本章分為如下幾個小節(jié):
32.1 光敏傳感器簡介
32.2 硬件設(shè)計
32.3 程序設(shè)計
32.4 下載驗證
32.1 光敏傳感器簡介
光敏傳感器是最常見的傳感器之一,它的種類繁多,主要有:光電管、光電倍增管、光敏電阻、光敏三極管、太陽能電池、紅外線傳感器、紫外線傳感器、光纖式光電傳感器、色彩傳感器、CCD和CMOS圖像傳感器等。光傳感器是目前產(chǎn)量最多、應(yīng)用最廣的傳感器之一,它在自動控制和非電量電測技術(shù)中占有非常重要的地位。
光敏傳感器是利用光敏元件將光信號轉(zhuǎn)換為電信號的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限于對光的探測,它還可以作為探測元件組成其他傳感器,對許多非電量進(jìn)行檢測,只要將這些非電量轉(zhuǎn)換為光信號的變化即可。
STM32F103戰(zhàn)艦開發(fā)板板載了一個光敏二極管(光敏電阻),作為光敏傳感器,它對光的變化非常敏感。光敏二極管也叫光電二極管。光敏二極管與半導(dǎo)體二極管在結(jié)構(gòu)上是類似的,其管芯是一個具有光敏特征的PN結(jié),具有單向?qū)щ娦?,因此工作時需加上反向電壓。無光照時,有很小的飽和反向漏電流,即暗電流,此時光敏二極管截止。當(dāng)受到光照時,飽和反向漏電流大大增加,形成光電流,它隨入射光強(qiáng)度的變化而變化。當(dāng)光線照射PN結(jié)時,可以使PN結(jié)中產(chǎn)生電子一空穴對,使少數(shù)載流子的密度增加。這些載流子在反向電壓下漂移,使反向電流增加。因此可以利用光照強(qiáng)弱來改變電路中的電流。
利用這個電流變化,我們串接一個電阻,就可以轉(zhuǎn)換成電壓的變化,從而通過ADC讀取電壓值,判斷外部光線的強(qiáng)弱。
本章,我們利用ADC3的通道6(PF8)來讀取光敏二極管電壓的變化,從而得到環(huán)境光線的變化,并將得到的光線強(qiáng)度,顯示在TFTLCD上面。關(guān)于ADC的介紹,前面已經(jīng)有詳細(xì)介紹了,這里我們就不再細(xì)說了。
32.2 硬件設(shè)計
- 例程功能
通過ADC3的通道6(PF8)讀取光敏傳感器(LS1)的電壓值,并轉(zhuǎn)換為0~100的光線強(qiáng)度值,顯示在LCD模塊上面。光線越亮,值越大;光線越暗,值越小。大家可以用手指遮擋LS1和用手電筒照射LS1,來查看光強(qiáng)變化。LED0閃爍用于提示程序正在運行。 - 硬件資源
1)LED燈
LED : LED0 – PB5
2)串口1(PA9/PA10連接在板載USB轉(zhuǎn)串口芯片CH340上面)
3)正點原子 2.8/3.5/4.3/7/10寸TFTLCD模塊(僅限MCU屏,16位8080并口驅(qū)動)
4)ADC3 :通道6 – PF8
5)光敏傳感器 - 原理圖
我們主要來看看光敏傳感器和開發(fā)板的連接,如下圖所示:
圖32.2.1 光敏傳感器與開發(fā)板連接示意圖
圖中,LS1是光敏二極管,外觀看起像與貼片LED類似(戰(zhàn)艦位于OLED插座旁邊,LS1),R34為其提供反向電壓,當(dāng)環(huán)境光線變化時,LS1兩端的電壓也會隨之改變,通過ADC3_IN6通道讀取LIGHT_SENSOR(PF8)上面的電壓,即可得到環(huán)境光線的強(qiáng)弱。光線越強(qiáng),電壓越低,光線越暗,電壓越高。
32.3 程序設(shè)計
32.3.1 ADC的HAL庫驅(qū)動
本實驗用到的ADC的HAL庫API函數(shù)前面都介紹過,具體調(diào)用情況請看程序解析部分。下面介紹讀取光敏傳感器ADC值的配置步驟。
讀取光敏傳感器ADC值配置步驟
1)開啟ADCx和ADC通道對應(yīng)的IO時鐘,并配置該IO為模擬功能
首先開啟ADCx的時鐘,然后配置GPIO為模擬模式。本實驗我們默認(rèn)用到ADC3通道6,對應(yīng)IO是PF8,它們的時鐘開啟方法如下:
__HAL_RCC_ADC3_CLK_ENABLE (); /* 使能ADC3時鐘 /
__HAL_RCC_GPIOF_CLK_ENABLE(); / 開啟GPIOF時鐘 */
2)設(shè)置ADC3,開啟內(nèi)部溫度傳感器
調(diào)用HAL_ADC_Init函數(shù)來設(shè)置ADC3時鐘分頻系數(shù)、分辨率、模式、掃描方式、對齊方式等信息。
注意:該函數(shù)會調(diào)用:HAL_ADC_MspInit回調(diào)函數(shù)來完成對ADC底層的初始化,包括:ADC3時鐘使能、ADC3時鐘源的選擇等。
3)配置ADC通道并啟動AD轉(zhuǎn)換器
調(diào)用HAL_ADC_ConfigChannel()函數(shù)配置ADC3通道6,根據(jù)需求設(shè)置通道、序列、采樣時間和校準(zhǔn)配置單端輸入模式或差分輸入模式等。然后通過HAL_ADC_Start函數(shù)啟動AD轉(zhuǎn)換器。
4)讀取ADC值,轉(zhuǎn)換為光線強(qiáng)度值
這里選擇查詢方式讀取,在讀取ADC值之前需要調(diào)用HAL_ADC_PollForConversion等待上一次轉(zhuǎn)換結(jié)束。然后就可以通過HAL_ADC_GetValue來讀取ADC值。最后把得到的ADC值轉(zhuǎn)換為0~100的光線強(qiáng)度值。
32.3.2 程序流程圖
圖32.3.2.1 光敏傳感器實驗程序流程圖
32.3.3 程序解析
- lsens驅(qū)動代碼
這里我們只講解核心代碼,詳細(xì)的源碼請大家參考光盤本實驗對應(yīng)源碼。LSENS驅(qū)動源碼包括兩個文件:lsens.c和lsens.h。本實驗還要用到adc3.c和adc3.h文件的驅(qū)動代碼。adc3.c\h文件的代碼和單通道ADC采集實驗的adc.c\h文件的代碼幾乎一樣,這里就不再贅述了。
lsens.h頭文件定義了一些宏定義和一些函數(shù)的聲明,該宏定義如下:
/* 光敏傳感器對應(yīng)ADC3的輸入引腳和通道 定義 */
#define LSENS_ADC3_CHX_GPIO_PORT GPIOF
#define LSENS_ADC3_CHX_GPIO_PIN GPIO_PIN_8
#define LSENS_ADC3_CHX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOF_CLK_ENABLE(); \
}while(0) /* PF口時鐘使能 */
#define LSENS_ADC3_CHX ADC_CHANNEL_6 /* 通道Y, 0 <= Y <= 17 */
這些宏定義分別是PF8及其時鐘使能的宏定義,還有ADC3通道6的宏定義。
下面介紹lsens.c的函數(shù),首先是光敏傳感器初始化函數(shù),其定義如下:
/**
* @brief 初始化光敏傳感器
* @param 無
* @retval 無
*/
void lsens_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
LSENS_ADC3_CHX_GPIO_CLK_ENABLE(); /* IO口時鐘使能 */
/* 設(shè)置AD采集通道對應(yīng)IO引腳工作模式 */
gpio_init_struct.Pin = LSENS_ADC3_CHX_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(LSENS_ADC3_CHX_GPIO_PORT, &gpio_init_struct);
adc3_init(); /* 初始化ADC */
}
該函數(shù)初始化PF8為模擬功能,然后通過adc3_init函數(shù)初始化ADC3。
最后是讀取光敏傳感器值,函數(shù)定義如下:
/**
* @brief 讀取光敏傳感器值
* @param 無
* @retval 0~100:0,最暗;100,最亮
*/
uint8_t lsens_get_val(void)
{
uint32_t temp_val = 0;
temp_val = adc3_get_result_average(LSENS_ADC3_CHX, 10); /* 讀取平均值 */
temp_val /= 40;
if (temp_val > 100)temp_val = 100;
return (uint8_t)(100 - temp_val);
}
lsens_get_val函數(shù)用于獲取當(dāng)前光照強(qiáng)度,該函數(shù)通過adc3_get_result_average函數(shù)得到通道6轉(zhuǎn)換的電壓值,經(jīng)過簡單量化后,處理成0~100的光強(qiáng)值。0對應(yīng)最暗,100對應(yīng)最亮。
2. main.c代碼
在main.c里面編寫如下代碼:
int main(void)
{
short adcx;
HAL_Init(); /* 初始化HAL庫 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 設(shè)置時鐘, 72Mhz */
delay_init(72); /* 延時初始化 */
usart_init(115200); /* 串口初始化為115200 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
lsens_init(); /* 初始化光敏傳感器 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "LSENS TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "LSENS_VAL:", BLUE);
while (1)
{
adcx = lsens_get_val();
lcd_show_xnum(30 + 10 * 8, 110, adcx, 3, 16, 0, BLUE); /* 顯示光線強(qiáng)度值 */
LED0_TOGGLE(); /* LED0閃爍,提示程序運行 */
delay_ms(250);
}
}
該部分的代碼邏輯很簡單,初始化各個外設(shè)之后,進(jìn)入死循環(huán),通過lsens_get_val獲取光敏傳感器得到的光強(qiáng)值(0~100),并顯示在TFTLCD上面。
32.4 下載驗證
將程序下載到開發(fā)板后,可以看到LED0不停的閃爍,提示程序已經(jīng)在運行了。LCD顯示的內(nèi)容如圖32.4.1所示:文章來源:http://www.zghlxwxcb.cn/news/detail-776626.html
圖32.4.1 光敏傳感器實驗測試圖
我們可以通過給LS1不同的光照強(qiáng)度,來觀察LSENS_VAL值的變化,光照越強(qiáng),該值越大,光照越弱,該值越小,LSENS_VAL值的范圍是0~100。文章來源地址http://www.zghlxwxcb.cn/news/detail-776626.html
到了這里,關(guān)于【正點原子STM32連載】 第三十二章 光敏傳感器實驗 摘自【正點原子】STM32F103 戰(zhàn)艦開發(fā)指南V1.2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!