找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

GP2D12紅外測距傳感器原理與單片機源程序等詳細資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:253454 發(fā)表于 2017-11-25 15:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
GP2D12紅外測距傳感器使用介紹
一、“看到”障礙物的眼睛——紅外測距傳感器
     機器視覺中最接近人眼的莫過于攝像頭了,可圖像處理小車的“大腦”對付不了,至少目前的“大腦”能力不夠,等進化后也許能夠應(yīng)付。  

     為了能“看到”障礙物,小車目前能用的主要是各類測距傳感器,典型的有超聲波和紅外兩種,此外還有利用光線的反射強弱來判斷的,這種方式不具備“測距”功能,但可以判斷有無!因為不同物體表面及顏色反射的能力不同(看后面的數(shù)據(jù))。  
     本文主要討論的是機器人中最常用的紅外測距傳感器  ——  GP2D12。  

     首先認識一下:  


模塊共三個接口:紅線---VCC_5V;黑線---GND;黃線—PC5(ADC數(shù)據(jù)采樣)
將模塊通電,黃線接到ADC通道輸入端即可工作;將采樣得到的電壓值通過填入表格,進行線性化處理,得到線性化公式。通過公式,可將ADC采樣值轉(zhuǎn)化為距離值。實測,在10cm—30cm范圍內(nèi),較為準確,最大誤差在1cm。模塊對被測角度的靈敏度很高,同一位置,不同的角度,誤差可以超過5cm,最好的測量角度是90度。

   之所以選擇 GP2D12  紅外測距傳感器,理由如下:  
首先是因為在機器人活動中(不包含工業(yè)機器人)這個傳感器最常用,幾乎每家國外的機器人配件供應(yīng)商都提供。使用英文版搜索一下 “MiniSumo”,你將會發(fā)現(xiàn) GP2D12使用是多么普遍。   

    其二是因為它的測距范圍和小車的“個頭”及運動速度匹配,對于 10cm 見方、運動速度10 – 30cm/s  的小個頭,能“看到”幾米開外的東西意義不大,而 10 – 80cm  正是它所要關(guān)注的范圍。  
    GP2D12的工作原理我理解為(僅供參考,歡迎指正):  
    它是由一個紅外發(fā)射管和一個 PSD(Position Sensing Device位置敏感檢測裝置)以及相應(yīng)的計算電路構(gòu)成,Sharp  公司的 PSD 很有特色,它可以檢測到光點落在它上面的微小位移, 分辨率達微米,GP2D12 正是利用這個特性實現(xiàn)了幾何方式測距。  

    紅外發(fā)射管發(fā)出的光束,遇到障礙物反射回來,落在 PSD 上,構(gòu)成了一個等腰三角形, 借助于 PSD 可以測得三角形的底,而兩個底角是固定的,由發(fā)射管確定,此時便可通過底邊 推算出高,也就是我們所要的距離。如下圖所示:  

測量原理示意圖

  從圖中可以看出,這是一個頂角極銳的等腰三角形,底邊只有2cm  ,高卻要有10 – 80cm,所以 PSD 的分辨率必須極高,否則微小的偏差都會帶來距離的巨大誤差。從這一點也可以得出,它的測距結(jié)果很難穩(wěn)定、精確,畢竟比值太大。  

     因為 PSD 的尺寸有限,從圖中就很容易理解為何它的測量距離超出范圍后就不可能是有效數(shù)據(jù),連趨勢都得不到。  

     從上述原理描述還可以知道,它不是連續(xù)測量,得到底邊長度后,必須經(jīng)過計算才能得到距離值,然后轉(zhuǎn)換為模擬信號輸出。  

    這兩個推論在那篇“Sharp  GP2D12  applicationNote”(應(yīng)用指南)有所印證,具體表現(xiàn)為它測距的強指向性和輸出的不確定性(噪音高達  200mV,相對于 2.4V 的滿量程輸出而言達5%)。 這篇文章好像是國外一個愛好者寫的,他做了大量的測試,對使用者掌握GP2D12 的性能及合理的使用它極有幫助。  



    總有人問     GP2D12  是否能用于某些場合?如果能仔細吃透上述指標,自然會有答案。 還有人問它與超聲波傳感器那個好,我想這些指標也會告訴你!  至于更詳細的內(nèi)容,讀者可進一步閱讀GP2D12的數(shù)據(jù)手冊以及上面介紹的應(yīng)用指南, 在此我就不再贅述。  

   在硬件上,沒有太多的難度,但是要用好GP2D12,軟件上似乎要做些努力,必須解決的有兩個問題:  

    一是信號的線性化 ,因為輸出與距離的關(guān)系是非線性的,為便于程序中使用距離信息,必須將模擬信號轉(zhuǎn)換為相應(yīng)得距離值。  
    二是濾波 ,因為按照上述應(yīng)用指南的測量分析,GP2D12的輸出噪聲很大;此外,還由于測量的非連續(xù)性,導(dǎo)致連續(xù)的距離變化對應(yīng)的輸出為階躍信號,也需要通過濾波將其平滑。  

2.1  線性化  
    關(guān)于線性化,開始時我也一籌莫展,曾想用折線近似實現(xiàn),但嘗試后覺得代碼量太大,而且需要做大量數(shù)據(jù)采集。
    后來在acroname網(wǎng)站上(二年前),發(fā)現(xiàn)了一個極好的“東東”  —個用 Excel 制作的電子表,表格的格式如下:

gp2d12-使用表格(本文附件可下載)

    里面有作者根據(jù) GP2D12 特性建立的數(shù)學(xué)模型(線性化公式),并預(yù)留的使用者輸入?yún)?shù)的地方,只需按其要求填入:  
    AD 的位數(shù)、AD 供電電壓(滿量程),并采集 8 點(10cm 間隔)GP2D12  的輸出電壓, 填入表中,它就可自動生成線性化公式的參數(shù) ,提供了整形和浮點兩種格式,還附有由此產(chǎn)生的結(jié)果與實際的偏差表,并用生動的圖形表示,十分直觀、實用。  
    此表可在embedream的相關(guān)資料中下載,本該提供它的原始鏈接,無奈現(xiàn)在沒有了,只找到了一個類似的文檔  —  Sharp IR Range Finder Voltage-to-Range Conversion Article 內(nèi)容也是討論線性化的,讀者不妨一讀。配合此文也許更容易理解使用那張Excel 表格。


     根據(jù)上述公式及程序得到的結(jié)果如下:  
                             GP2D12 不同顏色測距結(jié)果對比  

    第一列為實際距離,第二列障礙物表面為白紙,第三列障礙物為褐色木盒,讀者可比照Excel 表中的數(shù)據(jù),可以看出基本吻合。同時還可以從上面數(shù)據(jù)中看出,GP2D12  確實如其手冊中所說,基本不受障礙物的顏色影響。  



2.2  濾波
    濾波主要解決兩個問題,一是在GP2D12恒定輸出階段,按應(yīng)用指南的分析,有不小的噪聲,需要通過濾波消除。  
    二是由于其非連續(xù)測量的特性,導(dǎo)致其測量連續(xù)變化的距離時,輸出是階躍形式的,這對程序判斷極為不利,為了弱化這個影響,也期望通過濾波實現(xiàn)。  
    根據(jù) GP2D12 的手冊,其測量周期為  40ms  左右(38ms),綜合小車單片機的內(nèi)存及處理需求,采用 5ms 采樣一次,取最近 8 次的結(jié)果平均值的濾波方式,也就是說,一個測量周期采 8 個數(shù)據(jù)平均。  
    這樣處理可以降低噪聲的影響,這點容易理解。至于弱化階躍信號,不知讀者是否認同?  
    我是這樣考慮:在出現(xiàn)階躍信號時,8 個數(shù)據(jù)中隨著時間推移,新的信號所占的權(quán)重不斷加大,使得信號逐漸從前一個信號平緩的過渡到新的信號上。但是這樣處理,導(dǎo)致了距離信號反映滯后,要到下一個信號快到時,本次的輸出才接近本次的信號。就這一點而言,似 乎有些不盡合理,有待讀者深入探討。  

紅外測試數(shù)據(jù):
10cm   11.55--11.66
15cm  16.15--16.38
16.5cm  17.46--17.92
18cm   20.01--20.13
19cm  19.44--19.81
20cm  20.01--20.15
22cm  21.56--21.82
23cm  23.20--23.66
24.5cm  23.96--24.23
28cm  27.39--27.93


stm32單片機紅外測距源程序如下:
  1. /******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
  2. * File Name          : main.c
  3. * Author             : MCD Application Team
  4. * Version            : V1.0
  5. * Date               : 10/08
  6. * Description        : Main program body
  7. ********************************************************************************
  8. * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  9. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  10. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  11. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  12. * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  13. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  14. *******************************************************************************/

  15. /* Includes ------------------------------------------------------------------*/
  16. #include "stm32f10x_lib.h"
  17. #include "stdio.h"
  18. /* Private macro -------------------------------------------------------------*/
  19. #define countof(a)   (sizeof(a) / sizeof(*(a)))

  20. /* Private typedef -----------------------------------------------------------*/
  21. #define TxBufferSize   (countof(TxBuffer) - 1)

  22. /* Private define ------------------------------------------------------------*/
  23. u8 TxBuffer[] = "\n\rADC Example1: ADC TO DMA TO UART1\n\r";
  24. u8 TxCounter = 0;

  25. /* Private define ------------------------------------------------------------*/
  26. #define ADC1_DR_Address    ((u32)0x4001244C)

  27. /* Private variables ---------------------------------------------------------*/
  28. USART_InitTypeDef USART_InitStructure;
  29. ADC_InitTypeDef ADC_InitStructure;
  30. DMA_InitTypeDef DMA_InitStructure;
  31. vu16 ADC_ConvertedValue;
  32. ErrorStatus HSEStartUpStatus;
  33.    
  34. /* Private function prototypes -----------------------------------------------*/
  35. void RCC_Configuration(void);
  36. void GPIO_Configuration(void);
  37. void NVIC_Configuration(void);
  38.   
  39. /* Private functions ---------------------------------------------------------*/
  40. void Delay_us(unsigned short us)
  41. {
  42.     unsigned short i;
  43.     while(us--)
  44.     {
  45.             for(i=0;i<10;i++);
  46.     }
  47. }

  48. void Delay_ms(unsigned short ms)
  49. {
  50.     unsigned short i;
  51.         while(ms--)
  52.     {
  53.         for(i=0;i<10000;i++);
  54.     }
  55. }

  56. //發(fā)送數(shù)據(jù)
  57. int fputc(int ch, FILE *f){
  58. USART_SendData(USART1,(unsigned char)ch);//USART1可以換成USART2等
  59.         while(!(USART1->SR&USART_FLAG_TXE));
  60. return(ch);
  61. }
  62. //接收數(shù)據(jù)
  63. int GetKey(void){
  64. while(!(USART1->SR&USART_FLAG_RXNE));
  65.         return((int)(USART1->DR&0x1FF));
  66. }

  67. /*******************************************************************************
  68. * Function Name  : main
  69. * Description    : Main program
  70. * Input          : None
  71. * Output         : None
  72. * Return         : None
  73. *******************************************************************************/
  74. int main(void)
  75. {
  76. //unsigned char i=1;
  77. unsigned long Tmp_Dat,i=1;
  78.         float distance,sum=0;
  79. #ifdef DEBUG
  80.   debug();
  81. #endif

  82.   /* System clocks configuration ---------------------------------------------*/
  83.   RCC_Configuration();

  84.   /* NVIC configuration ------------------------------------------------------*/
  85.   NVIC_Configuration();

  86.   /* GPIO configuration ------------------------------------------------------*/
  87.   GPIO_Configuration();

  88.   /* USART1 configuration ------------------------------------------------------*/
  89.   /* USART1 configured as follow:
  90.         - BaudRate = 9600 baud  
  91.         - Word Length = 8 Bits
  92.         - Two Stop Bit
  93.         - Odd parity
  94.         - Hardware flow control disabled (RTS and CTS signals)
  95.         - Receive and transmit enabled
  96.         - USART Clock disabled
  97.         - USART CPOL: Clock is active low
  98.         - USART CPHA: Data is captured on the second edge
  99.         - USART LastBit: The clock pulse of the last data bit is not output to
  100.                          the SCLK pin
  101.   */
  102.   USART_InitStructure.USART_BaudRate = 9600;
  103.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  104.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  105.   USART_InitStructure.USART_Parity = USART_Parity_No;
  106.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  107.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  108.   USART_InitStructure.USART_Clock = USART_Clock_Disable;
  109.   USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  110.   USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
  111.   USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

  112.   /* Configure the USART1 */
  113.   USART_Init(USART1, &USART_InitStructure);

  114. /* Enable the USART Transmoit interrupt: this interrupt is generated when the
  115.    USART1 transmit data register is empty */  
  116.   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

  117. /* Enable the USART Receive interrupt: this interrupt is generated when the
  118.    USART1 receive data register is not empty */
  119.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  120.   /* Enable USART1 */
  121.   USART_Cmd(USART1, ENABLE);

  122.   /* DMA channel1 configuration ----------------------------------------------*/
  123.   DMA_DeInit(DMA_Channel1);
  124.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  125.   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
  126.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  127.   DMA_InitStructure.DMA_BufferSize = 1;
  128.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  129.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  130.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  131.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  132.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  133.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  134.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  135.   DMA_Init(DMA_Channel1, &DMA_InitStructure);
  136.   
  137.   /* Enable DMA channel1 */
  138.   DMA_Cmd(DMA_Channel1, ENABLE);
  139.      
  140.   /* ADC1 configuration ------------------------------------------------------*/
  141.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  142.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  143.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  144.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  145.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  146.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  147.   ADC_Init(ADC1, &ADC_InitStructure);

  148.   /* ADC1 regular channel1 configuration */
  149.   ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 1, ADC_SampleTime_55Cycles5);

  150.   /* Enable ADC1 DMA */
  151.   ADC_DMACmd(ADC1, ENABLE);
  152.   
  153.   /* Enable ADC1 */
  154.   ADC_Cmd(ADC1, ENABLE);

  155.   /* Enable ADC1 reset calibaration register */   
  156.   ADC_ResetCalibration(ADC1);
  157.   /* Check the end of ADC1 reset calibration register */
  158.   while(ADC_GetResetCalibrationStatus(ADC1));

  159.   /* Start ADC1 calibaration */
  160.   ADC_StartCalibration(ADC1);
  161.   /* Check the end of ADC1 calibration */
  162.   while(ADC_GetCalibrationStatus(ADC1));
  163.      
  164.   /* Start ADC1 Software Conversion */
  165.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  166.   for(i=0;i<TxBufferSize;i++)
  167.   {
  168.    /* Write one byte to the transmit data register */
  169.   USART_SendData(USART1, TxBuffer[TxCounter++]);
  170.   while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  171.   while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  172.   }

  173.   while (1)
  174.   {
  175.                 Delay_ms(1000);
  176.                
  177.                 Tmp_Dat =  ADC_ConvertedValue;
  178.                 distance = (1/(Tmp_Dat*0.0000228324+0.00140335))-4.0;

  179.                         printf("\n%ld\n",Tmp_Dat);
  180.                    printf("%.2f",distance);

  181.                
  182.                
  183.                 Tmp_Dat = Tmp_Dat*3300/0x0fff;

  184.                 TxBuffer[0] = Tmp_Dat/1000+'0';
  185.                 TxBuffer[1] = '.';
  186.                 TxBuffer[2] = (Tmp_Dat%1000)/100+'0';
  187.                 TxBuffer[3] = (Tmp_Dat%100)/10+'0';
  188.                 TxBuffer[4] = Tmp_Dat%10+'0';
  189.                 TxBuffer[5] = 'V';

  190.                 USART_SendData(USART1, '[');
  191.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  192.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  193.                 USART_SendData(USART1, TxBuffer[0]);
  194.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  195.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  196.                 USART_SendData(USART1, TxBuffer[1]);
  197.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  198.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  199.                 USART_SendData(USART1, TxBuffer[2]);
  200.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  201.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  202.                 USART_SendData(USART1, TxBuffer[3]);
  203.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  204.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  205.                 USART_SendData(USART1, TxBuffer[4]);
  206.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  207.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  208.                 USART_SendData(USART1, TxBuffer[5]);
  209.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  210.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成

  211.                 USART_SendData(USART1, ']');
  212.                 while (!(USART1->SR & USART_FLAG_TXE));   //等待緩沖區(qū)空
  213.                 while (!(USART1->SR & USART_FLAG_TC));   //等待發(fā)送完成
  214.                 printf("\n");
  215.   }
  216. }

  217. /*******************************************************************************
  218. * Function Name  : RCC_Configuration
  219. * Description    : Configures the different system clocks.
  220. * Input          : None
  221. * Output         : None
  222. * Return         : None
  223. *******************************************************************************/
  224. void RCC_Configuration(void)
  225. {
  226.   /* RCC system reset(for debug purpose) */
  227.   RCC_DeInit();

  228.   /* Enable HSE */
  229.   RCC_HSEConfig(RCC_HSE_ON);

  230.   /* Wait till HSE is ready */
  231.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  232.   if(HSEStartUpStatus == SUCCESS)
  233.   {
  234.     /* Enable Prefetch Buffer */
  235.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  236.     /* Flash 2 wait state */
  237.     FLASH_SetLatency(FLASH_Latency_2);
  238.   
  239.     /* HCLK = SYSCLK */
  240.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  241.   
  242.     /* PCLK2 = HCLK */
  243.     RCC_PCLK2Config(RCC_HCLK_Div1);

  244.     /* PCLK1 = HCLK/2 */
  245.     RCC_PCLK1Config(RCC_HCLK_Div2);

  246.     /* ADCCLK = PCLK2/4 */
  247.     RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  248.   
  249.     /* PLLCLK = 8MHz * 7 = 56 MHz */
  250.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);

  251.     /* Enable PLL */
  252.     RCC_PLLCmd(ENABLE);

  253.     /* Wait till PLL is ready */
  254.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  255.     {
  256.     }

  257.     /* Select PLL as system clock source */
  258.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  259.     /* Wait till PLL is used as system clock source */
  260.     while(RCC_GetSYSCLKSource() != 0x08)
  261.     {
  262.     }
  263.   }

  264. /* Enable peripheral clocks --------------------------------------------------*/

  265.   /* Enable DMA clock */
  266.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);

  267.   /* Enable ADC1 and GPIOC clock */
  268.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);

  269.   /* Enable GPIOA and USART1 clocks */
  270.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
  271. }

  272. /*******************************************************************************
  273. * Function Name  : GPIO_Configuration
  274. * Description    : Configures the different GPIO ports.
  275. * Input          : None
  276. * Output         : None
  277. * Return         : None
  278. *******************************************************************************/
  279. void GPIO_Configuration(void)
  280. {
  281.   GPIO_InitTypeDef GPIO_InitStructure;

  282.   /* Configure PC.05 (ADC Channel15) as analog input -------------------------*/
  283.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  284.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  285.   GPIO_Init(GPIOC, &GPIO_InitStructure);

  286.   /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  287.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  288.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  289.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  290.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  291.   /* Configure USART1 Rx (PA.10) as input floating */
  292.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  293.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  294.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  295. }

  296. /*******************************************************************************
  297. * Function Name  : NVIC_Configuration
  298. * Description    : Configures Vector Table base location.
  299. * Input          : None
  300. * Output         : None
  301. * Return         : None
  302. *******************************************************************************/
  303. void NVIC_Configuration(void)
  304. ……………………

  305. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:

紅外模塊.zip (2.25 MB, 下載次數(shù): 605)


評分

參與人數(shù) 2黑幣 +71 收起 理由
sad520ljh + 21 絕世好帖!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2017-11-25 22:51 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

板凳
ID:281489 發(fā)表于 2018-2-1 16:21 | 只看該作者
濾波方法學(xué)習(xí)了
回復(fù)

使用道具 舉報

地板
ID:285576 發(fā)表于 2018-4-10 19:45 | 只看該作者
謝謝正需要。
回復(fù)

使用道具 舉報

5#
ID:321214 發(fā)表于 2018-5-3 14:22 | 只看該作者
學(xué)到了
回復(fù)

使用道具 舉報

6#
ID:344165 發(fā)表于 2018-6-3 19:31 | 只看該作者
謝謝學(xué)到了
回復(fù)

使用道具 舉報

7#
ID:163643 發(fā)表于 2018-6-21 09:04 | 只看該作者
謝謝正需要。
回復(fù)

使用道具 舉報

8#
ID:375755 發(fā)表于 2018-7-20 12:50 | 只看該作者
收下了
回復(fù)

使用道具 舉報

9#
ID:36133 發(fā)表于 2018-9-25 20:58 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報

10#
ID:422260 發(fā)表于 2018-11-7 12:11 | 只看該作者
非常想要
回復(fù)

使用道具 舉報

11#
ID:434718 發(fā)表于 2018-11-28 15:20 | 只看該作者
51有你更精彩
回復(fù)

使用道具 舉報

12#
ID:93667 發(fā)表于 2018-12-4 15:00 | 只看該作者
謝謝。。。。。。學(xué)習(xí)了
回復(fù)

使用道具 舉報

13#
ID:287515 發(fā)表于 2019-1-19 23:57 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報

14#
ID:483145 發(fā)表于 2019-3-2 11:33 | 只看該作者
資料好詳細
回復(fù)

使用道具 舉報

15#
ID:524497 發(fā)表于 2019-4-29 15:48 | 只看該作者
學(xué)到了,謝謝
回復(fù)

使用道具 舉報

16#
ID:223705 發(fā)表于 2019-6-4 08:49 | 只看該作者
學(xué)習(xí)了,正在玩紅外測距!
回復(fù)

使用道具 舉報

17#
ID:389153 發(fā)表于 2019-7-12 17:29 | 只看該作者
好資料 值得學(xué)習(xí) 多謝分享
回復(fù)

使用道具 舉報

18#
ID:389153 發(fā)表于 2019-7-12 17:30 | 只看該作者
好資料 正在弄紅外測距 謝謝分享
回復(fù)

使用道具 舉報

19#
ID:654753 發(fā)表于 2019-12-2 22:54 | 只看該作者
學(xué)習(xí)中,謝謝分享!
回復(fù)

使用道具 舉報

20#
ID:475993 發(fā)表于 2019-12-4 12:04 | 只看該作者
寫的很謝謝,謝謝分享
回復(fù)

使用道具 舉報

21#
ID:652804 發(fā)表于 2020-1-3 09:18 | 只看該作者
好資料,正需要。謝謝樓主。
回復(fù)

使用道具 舉報

22#
ID:685737 發(fā)表于 2020-1-13 17:01 | 只看該作者
32呢?
回復(fù)

使用道具 舉報

23#
ID:561958 發(fā)表于 2020-3-9 20:47 | 只看該作者
學(xué)習(xí)下,正需要
回復(fù)

使用道具 舉報

24#
ID:706004 發(fā)表于 2020-3-10 19:49 | 只看該作者
學(xué)到了,很需要
回復(fù)

使用道具 舉報

25#
ID:660123 發(fā)表于 2020-3-23 10:41 | 只看該作者
請問用GP2Y021替代2D12可以不
回復(fù)

使用道具 舉報

26#
ID:716087 發(fā)表于 2020-3-26 11:39 | 只看該作者
下載資料參考學(xué)習(xí)
回復(fù)

使用道具 舉報

27#
ID:660123 發(fā)表于 2020-4-30 20:20 | 只看該作者
那個提到的論述Excel表格的文檔沒找到
回復(fù)

使用道具 舉報

28#
ID:775865 發(fā)表于 2020-6-11 09:48 | 只看該作者
問一下樓主,這個gp2d12在哪能買
回復(fù)

使用道具 舉報

29#
ID:290578 發(fā)表于 2020-6-25 12:33 | 只看該作者
下來測試下,謝謝
回復(fù)

使用道具 舉報

30#
ID:883211 發(fā)表于 2022-7-19 14:49 | 只看該作者
mark 學(xué)習(xí)一下!
回復(fù)

使用道具 舉報

31#
ID:1041921 發(fā)表于 2022-8-12 09:58 | 只看該作者
好資料,正需要。謝謝樓主。
回復(fù)

使用道具 舉報

32#
ID:169559 發(fā)表于 2022-8-14 10:51 | 只看該作者
這是個好東西,謝謝分享!
回復(fù)

使用道具 舉報

33#
ID:1056217 發(fā)表于 2022-12-7 11:07 | 只看該作者
6學(xué)到了,謝謝
回復(fù)

使用道具 舉報

34#
ID:1059801 發(fā)表于 2022-12-30 16:20 | 只看該作者
學(xué)到了  樓主寫代碼的好習(xí)慣,設(shè)計步驟和代碼流程清晰易懂。剛好最近在做 很好的資料
回復(fù)

使用道具 舉報

35#
ID:539681 發(fā)表于 2025-4-21 17:44 | 只看該作者
好人好報好好好
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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