找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2599|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ESK32-360開發(fā)板的傳感器測量及輸出顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 jinglixixi 于 2020-8-21 21:16 編輯

傳感器測量離不開3件事,輸入輸出、延時及時序控制。
1. 延時函數(shù)
鑒于ESK32-360開發(fā)板在SYSTICK程序中只提供了ms級的延時函數(shù),而未提供us級的延時函數(shù),使得程序設(shè)計(jì)時極為不便,為此添加了us級延時函數(shù)。
  1. void Delayus(u32 nTime)
  2. {
  3.   /* Enable the SysTick Counter */
  4.   SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE);
  5.   DelayTime = nTime;
  6.   while(DelayTime != 0);
  7.   /* Disable SysTick Counter */
  8.   SYSTICK_CounterCmd(SYSTICK_COUNTER_DISABLE);
  9.   /* Clear SysTick Counter */
  10.   SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);
  11. }
復(fù)制代碼

在使用時,因?yàn)閙s級和us級延時函數(shù)是基于同一個基準(zhǔn)時鐘,故在使用前需調(diào)整基準(zhǔn)時鐘。
在ms級延時時,使用下列語句:
SYSTICK_IntConfig(DISABLE);
SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
SYSTICK_IntConfig(ENABLE);
在us級延時時,使用如下語句:
SYSTICK_IntConfig(DISABLE);
SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
SYSTICK_IntConfig(ENABLE);

ms級延時的驗(yàn)證主程序如下:
  1. int main(void)
  2. {
  3.   SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.   SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.   SYSTICK_IntConfig(ENABLE);
  6.   /* Initialize LEDs */
  7.   HT32F_DVB_LEDInit(HT_LED1);
  8.   HT32F_DVB_LEDInit(HT_LED2);
  9.   HT32F_DVB_LEDInit(HT_LED3);
  10.   /* Infinite loop */
  11.   while(1)
  12.   {
  13.        /* Toggle LEDs  */
  14.        HT32F_DVB_LEDToggle(HT_LED1);
  15.        HT32F_DVB_LEDToggle(HT_LED2);
  16.        HT32F_DVB_LEDToggle(HT_LED3);
  17.        Delay(500);
  18.   }
  19. }
復(fù)制代碼

2. GPIO口輸入輸出
鑒于SD卡接口處于空置狀態(tài),故可用做GPIO來使用并進(jìn)行功能擴(kuò)展,從而化解資源的緊張的情況。
1)GPIO口輸出
為便于輸出口的配置,特定義了一個專用的函數(shù),其內(nèi)容為:
  1. void HT32F_DVB_OUT_Init(void)
  2. {
  3.   HT32F_DVB_ClockConfig();
  4.   //   PD0 、 PC12
  5.   HT32F_DVB_GPxConfig(GPIO_PD, GPIO_PIN_0, 0);
  6.   HT32F_DVB_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
  7.   HT_GPIOD->SRR = GPIO_PIN_0;
  8.   HT_GPIOC->SRR = GPIO_PIN_12;
  9.   GPIO_PullResistorConfig(HT_GPIOD, GPIO_PIN_0, GPIO_PR_DISABLE);
  10.   GPIO_DriveConfig(HT_GPIOD, GPIO_PIN_0, GPIO_DV_8MA);
  11.   GPIO_DirectionConfig(HT_GPIOD, GPIO_PIN_0, GPIO_DIR_OUT);
  12.   GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
  13.   GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
  14.   GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
  15. }
復(fù)制代碼
此外,還定義了一個GPIO口的時鐘啟動函數(shù),其內(nèi)容為:
  1. void HT32F_DVB_ClockConfig(void)
  2. {
  3.   CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  4.   u8 RegCK[5] = {0};
  5.   RegCK[3] = 1;  //  啟動PD口
  6.   RegCK[2] = 1;  //  啟動PC口
  7.   CKCUClock.Bit.PA         = RegCK[0];
  8.   CKCUClock.Bit.PB         = RegCK[1];
  9.   CKCUClock.Bit.PC         = RegCK[2];
  10.   CKCUClock.Bit.PD         = RegCK[3];
  11.   CKCUClock.Bit.AFIO       = 1;
  12.   CKCU_PeripClockConfig(CKCUClock, ENABLE);
  13. }
復(fù)制代碼

驗(yàn)證函數(shù)功能的主程序?yàn)椋?/font>
  1. int main(void)
  2. {
  3.      SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.      SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);   
  5.      SYSTICK_IntConfig(ENABLE);
  6.      // LED1 & PC12
  7.      HT32F_DVB_OUT_Init();
  8.      while(1)
  9.      {
  10.         /* Toggle LEDs  */
  11.         HT_GPIOD->SRR = GPIO_PIN_0;
  12.         HT_GPIOC->RR = GPIO_PIN_12;
  13.         Delay(1000);
  14.         HT_GPIOD->RR = GPIO_PIN_0;
  15.         HT_GPIOC->SRR = GPIO_PIN_12;
  16.         Delay(1000);
  17.     }
  18. }
復(fù)制代碼

經(jīng)程序的下載驗(yàn)證,可實(shí)現(xiàn)指定GPIO口的輸出功能。
2)GPIO口輸入
為便于輸入口的配置,所定義得專用函數(shù)為:
  1. void HT32F_DVB_IN_Init(void)
  2. {
  3.          AFIO_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
  4.          GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_UP);  // down ?
  5.          GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
  6. }
復(fù)制代碼

注:為配置相應(yīng)的時鐘,需在HT32F_DVB_ClockConfig()函數(shù)中添加語句:
RegCK[2] = 1;   // 啟動PC口

驗(yàn)證函數(shù)功能的主程序?yàn)椋?/div>
  1. int main(void)
  2. {
  3.      SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.      SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.      SYSTICK_IntConfig(ENABLE);
  6.      HT32F_DVB_OUT_Init();
  7.      while(1)
  8.      {   
  9.           // PC12=KEY
  10.           if(GPIO_ReadInBit(HT_GPIOC, GPIO_PIN_12)==0)        
  11.           {
  12.                 HT_GPIOD->SRR = GPIO_PIN_0;
  13.           }
  14.           else
  15.           {
  16.                 HT_GPIOD->RR = GPIO_PIN_0;
  17.           }
  18.          Delay(1000);
  19.     }
  20. }
復(fù)制代碼

經(jīng)程序下載,當(dāng)按下連接PC12的按鍵時,可見到LED1發(fā)生變化,說明指定GPIO口的輸入功能正確。
3. 串行通訊輸出信息
除了使用LED顯示按鍵狀態(tài)外,還可以使用串行通訊來輸出按鍵狀態(tài),它可以反映出比LED更豐富的信息。
實(shí)現(xiàn)按鍵狀態(tài)輸出的主程序如下:
  1. int main(void)
  2. {
  3.          SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.          SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.          SYSTICK_IntConfig(ENABLE);
  6.          HT32F_DVB_OUT_Init();
  7.          UxART_Configuration();
  8.          while(1)
  9.          {
  10.                    if(GPIO_ReadInBit(HT_GPIOD, GPIO_PIN_1)==0)
  11.                    {
  12.                          HT_GPIOD->SRR = GPIO_PIN_0;
  13.                          gHelloString[3] ='0';
  14.                          UxART_TxTest();     
  15.                    }
  16.                    else
  17.                    {
  18.                         HT_GPIOD->RR = GPIO_PIN_0;
  19.                         gHelloString[3] = '1';
  20.                         UxART_TxTest();     
  21.                    }
  22.                    Delay(1000);
  23.          }
  24. }
復(fù)制代碼

                             
圖1  按鍵狀態(tài)輸出

4. I2C總線模擬與BH1750光強(qiáng)檢測
BH1750是一款基于I2C接口的數(shù)字式光強(qiáng)傳感器,我們可利用SD卡接口空出的引腳來模擬I2C接口以驅(qū)動該傳感器,從而進(jìn)行光強(qiáng)檢測。
BH1750與MCU的連接關(guān)系如下:
SCL --- PC11
SDA --- PC12

定義相關(guān)引腳輸出高低電平的引腳為:
#define SCL_Set()         HT_GPIOC->SRR = GPIO_PIN_11
#define SCL_Clr()          HT_GPIOC->RR = GPIO_PIN_11

#define SDA_Set()        HT_GPIOC->SRR = GPIO_PIN_12
#defineSDA_Clr()          HT_GPIOC->RR =GPIO_PIN_12
BH1750的初始化函數(shù)為:
  1. void IIC_Init(void)
  2. {
  3.             HT32F_DVB_ClockConfig();
  4.         
  5.             GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
  6.             GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
  7.             GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
  8.         
  9.             GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_11, GPIO_PR_DISABLE);
  10.             GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_11, GPIO_DV_8MA);
  11.             GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_11, GPIO_DIR_OUT);
  12. }
復(fù)制代碼
BH1750的讀取函數(shù)為:
  1. void Get_Sunlight_Value()
  2. {
  3.         int dis_data=0;
  4.         float temp;
  5.         char i=0;
  6.         unsigned int sd;
  7.         Single_Write_BH1750(0x01);  // power on
  8.         Single_Write_BH1750(0x10);  // H- resolution mode
  9.         Delayms(180);
  10.         Multiple_Read_BH1750();
  11.         for(i=0;i<3;i++)
  12.         dis_data=gHelloString[0];
  13.         dis_data=(dis_data<<8)+gHelloString[1];
  14.         temp=(float)dis_data/1.2;
  15.         sd=temp;
  16.         gHelloString[0] = sd/10000+'0';
  17.         gHelloString[1] = sd% 10000/1000+'0';
  18.         gHelloString[2] = sd % 1000/100+'0';
  19.         gHelloString[3] = sd % 100/10+'0';
  20.         gHelloString[4] = sd % 10+'0';
  21.         UxART_TxTest();        
  22. }
復(fù)制代碼

光強(qiáng)檢測的主函數(shù)為:
  1. int main(void)
  2. {
  3.         SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.         SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.         SYSTICK_IntConfig(ENABLE);
  6.         UxART_Configuration();
  7.         IIC_Init();
  8.         while(1)
  9.         {
  10.                    Get_Sunlight_Value();
  11.                    Delayms(1000);
  12.         }
  13. }
復(fù)制代碼

經(jīng)程序下載后,其運(yùn)行結(jié)果如圖所示。

圖2 BH1750檢測結(jié)果







評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表