日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【正点原子STM32连载】 第三十三章 光敏传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【正点原子STM32连载】 第三十三章 光敏传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1)實驗平臺:正點原子MiniPro H750開發板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=677017430560
3)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/thread-336836-1-1.html
4)對正點原子STM32感興趣的同學可以加群討論:879133275

第三十三章 光敏傳感器實驗

本章,我們將學習使用MiniPRO STM32H750開發板板載的一個光敏傳感器。我們還是要使用到ADC采集,通過ADC采集電壓,獲取光敏傳感器的電阻變化,從而得出環境光線的變化,并在TFTLCD上面顯示出來。
本章分為如下幾個小節:
33.1 光敏傳感器簡介
33.2 硬件設計
33.3 程序設計
33.4 下載驗證

33.1 光敏傳感器簡介
光敏傳感器是最常見的傳感器之一,它的種類繁多,主要有:光電管、光電倍增管、光敏電阻、光敏三極管、太陽能電池、紅外線傳感器、紫外線傳感器、光纖式光電傳感器、色彩傳感器、CCD和CMOS圖像傳感器等。光傳感器是目前產量最多、應用最廣的傳感器之一,它在自動控制和非電量電測技術中占有非常重要的地位。
光敏傳感器是利用光敏元件將光信號轉換為電信號的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限于對光的探測,它還可以作為探測元件組成其它傳感器,對許多非電量進行檢測,只要將這些非電量轉換為光信號的變化即可。
MiniPRO STM32H750開發板板載了一個光敏二極管(光敏電阻),作為光敏傳感器,它對光的變化非常敏感。光敏二極管也叫光電二極管。光敏二極管與半導體二極管在結構上是類似的,其管芯是一個具有光敏特征的PN結,具有單向導電性,因此工作時需加上反向電壓。無光照時,有很小的飽和反向漏電流,即暗電流,此時光敏二極管截止。當受到光照時,飽和反向漏電流大大增加,形成光電流,它隨入射光強度的變化而變化。當光線照射PN結時,可以使PN結中產生電子一空穴對,使少數載流子的密度增加。這些載流子在反向電壓下漂移,使反向電流增加。因此可以利用光照強弱來改變電路中的電流。
利用這個電流變化,我們串接一個電阻,就可以轉換成電壓的變化,從而通過ADC讀取電壓值,判斷外部光線的強弱。
本實驗利用ADC3的通道11(PC1)來讀取光敏二極管電壓的變化,從而得到環境光線的變化,并將得到的光線強度,顯示在TFTLCD上面。關于ADC的介紹,前面已經有詳細介紹了,這里我們就不再細說了。
33.2 硬件設計

  • 例程功能
    通過ADC3的通道11(PC1)讀取光敏傳感器(LS1)的電壓值,并轉換為0~100的光線強度值,顯示在LCD模塊上面。光線越亮,值越大;光線越暗,值越小。大家可以用手指遮擋LS1和用手電筒照射LS1,來查看光強變化。LED0閃爍用于提示程序正在運行。
  • 硬件資源
    1)RGB燈
    RED : LED0 - PB4
    2)串口1(PA9/PA10連接在板載USB轉串口芯片CH340上面)
    3)正點原子2.8/3.5/4.3/7/10寸TFTLCD模塊(僅限MCU屏,16位8080并口驅動)
    4)ADC3 :通道11 - PC1
    5)光敏傳感器 - PC1
  • 原理圖
    我們主要來看看光敏傳感器和開發板的連接,如下圖所示:
  • 圖33.2.1 光敏傳感器與開發板連接示意圖
    圖中,LS1是光敏二極管(實物在開發板5V排針(VOUT2)上面),R28為其提供反向電壓,當環境光線變化時,LS1兩端的電壓也會隨之改變,從而通過ADC3_IN11通道,讀取LIGHT_SENSOR(PC1)上面的電壓,即可得到環境光線的強弱。光線越強,電壓越低,光線越暗,電壓越高。
    33.3 程序設計
    33.3.1 ADC的HAL庫驅動
    本實驗用到的ADC的HAL庫API函數前面都介紹過,具體調用情況請看程序解析部分。下面介紹讀取光敏傳感器ADC值的配置步驟。
    讀取光敏傳感器ADC值配置步驟
    1)開啟ADCx和ADC通道對應的IO時鐘,并配置該IO為模擬功能
    首先開啟ADCx的時鐘,然后配置GPIO為模擬模式。本實驗我們默認用到ADC3通道11,對應IO是PC1,它們的時鐘開啟方法如下:
    __HAL_RCC_ADC3_CLK_ENABLE (); /* 使能ADC3時鐘 /
    __HAL_RCC_GPIOC_CLK_ENABLE(); / 開啟GPIOC時鐘 */
    2)設置ADC3,開啟內部溫度傳感器
    調用HAL_ADC_Init函數來設置ADC3時鐘分頻系數、分辨率、模式、掃描方式、對齊方式等信息。
    注意:該函數會調用:HAL_ADC_MspInit回調函數來完成對ADC底層的初始化,包括:ADC3時鐘使能、ADC3時鐘源的選擇等。
    3)配置ADC通道并啟動AD轉換器
    調用HAL_ADC_ConfigChannel()函數配置ADC3通道11,根據需求設置通道、序列、采樣時間和校準配置單端輸入模式或差分輸入模式等。然后通過HAL_ADC_Start函數啟動AD轉換器。
    4)讀取ADC值,轉換為光線強度值
    這里選擇查詢方式讀取,在讀取ADC值之前需要調用HAL_ADC_PollForConversion等待上一次轉換結束。然后就可以通過HAL_ADC_GetValue來讀取ADC值。最后把得到的ADC值轉換為0~100的光線強度值。
    33.3.2 程序流程圖

    圖33.3.2.1 光敏傳感器實驗程序流程圖
    33.3.3 程序解析

  • LSENS驅動代碼
    這里我們只講解核心代碼,詳細的源碼請大家參考光盤本實驗對應源碼。LSENS驅動源碼包括兩個文件:lsens.c和lsens.h。本實驗還要用到adc3.c和adc3.h文件的驅動代碼。adc3.c和adc3.h文件前面已經介紹過了,就不再贅述。
    lsens.h頭文件定義了一些宏定義和一些函數的聲明,該宏定義如下:
  • /*****************************************************************************/ /* 光敏傳感器對應ADC3的輸入引腳和通道 定義 */ #define LSENS_ADC3_CHX_GPIO_PORT GPIOC #define LSENS_ADC3_CHX_GPIO_PIN GPIO_PIN_1 #define LSENS_ADC3_CHX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0) /* PC口時鐘使能 */ #define LSENS_ADC3_CHX ADC_CHANNEL_11 /* 通道Y, 0 <= Y <= 19 */ /*****************************************************************************/ 這些宏定義分別是PC1及其時鐘使能的宏定義,還有ADC通道11的宏定義。 下面介紹lsens.c的函數,首先是光敏傳感器初始化函數,其定義如下: /*** @brief 初始化光敏傳感器* @param 無* @retval 無*/ void lsens_init(void) {GPIO_InitTypeDef gpio_init_struct;LSENS_ADC3_CHX_GPIO_CLK_ENABLE (); /* 使能對應IO時鐘 */gpio_init_struct.Pin = LSENS_ADC3_CHX_GPIO_PIN; /* PC1 */gpio_init_struct.Mode = GPIO_MODE_ANALOG; /* 模擬 */HAL_GPIO_Init(LSENS_ADC3_CHX_GPIO_PORT, &gpio_init_struct);adc3_init(); /* 初始化ADC3 */ }

    該函數初始化PC1為模擬功能,然后通過adc3_init函數初始化ADC3。
    最后是讀取光敏傳感器值,函數定義如下:

    /*** @brief 讀取光敏傳感器值* @param 無* @retval 0~100:0,最暗;100,最亮*/ uint8_t lsens_get_val(void) { uint32_t temp_val = 0; /* 讀取平均值 */temp_val = adc3_get_result_average(g_adc3_handle, LSENS_ADC3_CHX, 10); temp_val /= 655;if (temp_val > 100)temp_val = 100;return (uint8_t)(100 - temp_val); }

    lsens_get_val函數用于獲取當前光照強度,該函數通過adc3_get_result_average函數得到通道11轉換的電壓值,經過簡單量化后,處理成0~100的光強值。0對應最暗,100對應最亮。
    2. main.c代碼
    在main.c里面編寫如下代碼:

    int main(void) {short adcx;sys_cache_enable(); /* 打開L1-Cache */HAL_Init(); /* 初始化HAL庫 */sys_stm32_clock_init(240, 2, 2, 4); /* 設置時鐘, 480Mhz */delay_init(480); /* 延時初始化 */usart_init(115200); /* 串口初始化為115200 */mpu_memory_protection(); /* 保護相關存儲區域 */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); /* 顯示光線強度值 */LED0_TOGGLE(); /* LED0閃爍,提示程序運行 */delay_ms(250);} }

    該部分的代碼邏輯很簡單,初始化各個外設之后,進入死循環,通過lsens_get_val獲取光敏傳感器得到的光強值(0~100),并顯示在TFTLCD上面。
    33.4 下載驗證
    將程序下載到開發板后,可以看到LED0不停的閃爍,提示程序已經在運行了。LCD顯示的內容如圖33.4.1所示:

    圖33.4.1 光敏傳感器實驗測試圖
    我們可以通過給LS1不同的光照強度,來觀察LSENS_VAL值的變化,光照越強,該值越大,光照越弱,該值越小,LSENS_VAL值的范圍是0~100。

    總結

    以上是生活随笔為你收集整理的【正点原子STM32连载】 第三十三章 光敏传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。