久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4212|回復: 1
打印 上一主題 下一主題
收起左側(cè)

STM32之TIM2收發(fā)四路超聲波(寄存器版)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:250368 發(fā)表于 2017-11-17 12:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題,采用定時器2控制。不喜勿噴。

單片機源程序如下:
  1. #include "timer.h"
  2. /**************************************************************************
  3. 函數(shù)功能:定時器3通道3輸入捕獲初始化
  4. 入口參數(shù):入口參數(shù):arr:自動重裝值  psc:時鐘預分頻數(shù)
  5. 返回  值:無
  6. **************************************************************************/
  7. void TIM2_Cap_Init(u16 arr,u16 psc)       
  8. {         
  9.         RCC->APB1ENR|=1<<0;     //TIM2時鐘使能     
  10.         RCC->APB2ENR|=1<<2;            //使能PORTB時鐘  
  11.        
  12.         GPIOA->CRL&=0X00000000;
  13.   GPIOA->CRL|=0X22228888;       
  14.        
  15.   TIM2->ARR=arr;                  //設定計數(shù)器自動重裝值   
  16.         TIM2->PSC=psc;                  //預分頻器
  17.        
  18.   TIM2->CCMR1|=1<<0;        //選擇輸入端  1通道配置為輸入
  19.         TIM2->CCMR1|=0<<4;         //配置輸入濾波器 不濾波
  20.         TIM2->CCMR1|=0<<2;         //配置輸入分頻,不分頻
  21.         TIM2->CCER|=1<<0;         //允許捕獲計數(shù)器的值到捕獲寄存器中       
  22.         TIM2->CCER|=0<<1;         //上升沿捕獲
  23.         TIM2->DIER|=1<<1;   //允許捕獲中斷
  24.        
  25.         TIM2->CCMR1|=1<<8;        //選擇輸入端  2通道配置為輸入
  26.         TIM2->CCMR1|=0<<12;         //配置輸入濾波器 不濾波
  27.         TIM2->CCMR1|=0<<10;         //配置輸入分頻,不分頻
  28.         TIM2->CCER|=1<<4;         //允許捕獲計數(shù)器的值到捕獲寄存器中
  29.         TIM2->CCER|=0<<5;         //上升沿捕獲
  30.         TIM2->DIER|=1<<2;   //允許捕獲中斷

  31.         TIM2->CCMR2|=1<<0;        //選擇輸入端  3通道配置為輸入
  32.         TIM2->CCMR2|=0<<4;         //配置輸入濾波器 不濾波
  33.         TIM2->CCMR2|=0<<2;         //配置輸入分頻,不分頻
  34.         TIM2->CCER|=1<<8;         //允許捕獲計數(shù)器的值到捕獲寄存器中
  35.         TIM2->CCER|=0<<9;         //上升沿捕獲
  36.         TIM2->DIER|=1<<3;   //允許捕獲中斷
  37.        
  38.         TIM2->CCMR2|=1<<8;          //0選擇輸入端  4通道配置為輸入
  39.         TIM2->CCMR2|=0<<12;          //4配置輸入濾波器 不濾波
  40.         TIM2->CCMR2|=0<<10;         //2配置輸入分頻,不分頻
  41.         TIM2->CCER|=1<<12;         //允許捕獲計數(shù)器的值到捕獲寄存器
  42.   TIM2->CCER|=0<<13;         //CH4上升沿捕獲
  43.         TIM2->DIER|=1<<4;   //允許捕獲中斷               
  44.        

  45.         TIM2->DIER|=1<<0;   //允許更新中斷       
  46.         TIM2->CR1|=0x01;    //使能定時器3
  47.         MY_NVIC_Init(1,3,TIM2_IRQn,1);
  48. }
  49. /**************************************************************************
  50. 函數(shù)功能:超聲波接收回波函數(shù)
  51. 入口參數(shù):無
  52. 返回  值:無
  53. **************************************************************************/
  54. u16 TIM2CH1_CAPTURE_STA,TIM2CH1_CAPTURE_VAL;
  55. void ReadT2C1_Distane(void)
  56. {   
  57.        
  58.          PAout(4)=1;
  59.          delay_us(15);  
  60.          PAout(4)=0;       
  61.                         if(TIM2CH1_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  62.                         {
  63.                         DisT2C1=TIM2CH1_CAPTURE_STA&0X3F;
  64.                         DisT2C1*=65536;                                                //溢出時間總和
  65.                         DisT2C1+=TIM2CH1_CAPTURE_VAL;                //得到總的高電平時間
  66.       DisT2C1=DisT2C1*170/1000;
  67.                         printf("DIST2C1:%d\n",DisT2C1);
  68.                         TIM2CH1_CAPTURE_STA=0;                        //開啟下一次捕獲
  69.                   }                               
  70. }

  71. u16 TIM2CH2_CAPTURE_STA,TIM2CH2_CAPTURE_VAL;
  72. void ReadT2C2_Distane(void)
  73. {   
  74.          PAout(5)=1;
  75.          delay_us(15);  
  76.          PAout(5)=0;       
  77.                         if(TIM2CH2_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  78.                         {
  79.                         DisT2C2=TIM2CH2_CAPTURE_STA&0X3F;
  80.                         DisT2C2*=65536;                                                //溢出時間總和
  81.                         DisT2C2+=TIM2CH2_CAPTURE_VAL;                //得到總的高電平時間
  82.                         DisT2C2=DisT2C2*170/1000;
  83.                         printf("DIST2C2:%d\n",DisT2C2);
  84.                         TIM2CH2_CAPTURE_STA=0;                        //開啟下一次捕獲
  85.                   }                               
  86. }

  87. u16 TIM2CH3_CAPTURE_STA,TIM2CH3_CAPTURE_VAL;
  88. void ReadT2C3_Distane(void)
  89. {   
  90.          PAout(6)=1;
  91.          delay_us(15);  
  92.          PAout(6)=0;       
  93.                         if(TIM2CH3_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  94.                         {
  95.                         DisT2C3=TIM2CH3_CAPTURE_STA&0X3F;
  96.                         DisT2C3*=65536;                                                //溢出時間總和
  97.                         DisT2C3+=TIM2CH3_CAPTURE_VAL;                //得到總的高電平時間
  98.                         DisT2C3=DisT2C3*170/1000;
  99.                         printf("DIST2C3:%d\n",DisT2C3);
  100.                         TIM2CH3_CAPTURE_STA=0;                        //開啟下一次捕獲
  101.                   }                               
  102. }

  103. u16 TIM2CH4_CAPTURE_STA,TIM2CH4_CAPTURE_VAL;
  104. void ReadT2C4_Distane(void)
  105. {   
  106.        
  107.          PAout(7)=1;
  108.          delay_us(15);  
  109.          PAout(7)=0;       
  110.                         if(TIM2CH4_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
  111.                         {
  112.                         DisT2C4=TIM2CH4_CAPTURE_STA&0X3F;
  113.                         DisT2C4*=65536;                                                //溢出時間總和
  114.                         DisT2C4+=TIM2CH4_CAPTURE_VAL;                //得到總的高電平時間
  115.                         DisT2C4=DisT2C4*170/1000;
  116.                         printf("DIST2C4:%d\n",DisT2C4);
  117.                         TIM2CH4_CAPTURE_STA=0;                        //開啟下一次捕獲
  118.                   }                               
  119. }
  120. /**************************************************************************
  121. 函數(shù)功能:超聲波回波脈寬讀取中斷
  122. 入口參數(shù):無
  123. 返回  值:無
  124. 作    者:平衡小車之家
  125. **************************************************************************/
  126. void TIM2_IRQHandler(void)
  127. {                                                                   
  128.         u16 tsr;
  129.         tsr=TIM2->SR;
  130.        
  131. /*******************************************************************
  132.        
  133. ********************************************************************/
  134.         if((TIM2CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  135.                                 {
  136.                                                                 if(tsr&0X01)//溢出
  137.                                                                 {            
  138.                                                                                 if(TIM2CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
  139.                                                                                 {
  140.                                                                                         if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
  141.                                                                                         {
  142.                                                                                                 TIM2CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
  143.                                                                                                 TIM2CH1_CAPTURE_VAL=0XFFFF;
  144.                                                                                         }else TIM2CH1_CAPTURE_STA++;
  145.                                                                                 }         
  146.                                                                 }
  147.                                                            if(tsr&0x02)//捕獲1發(fā)生捕獲事件
  148.                                             {       
  149.                                                                                         if(TIM2CH1_CAPTURE_STA&0X40)                //捕獲到一個下降沿                
  150.                                                                                         {                                 
  151.                                                                                         TIM2CH1_CAPTURE_STA|=0X80;                //標記成功捕獲到一次高電平脈寬
  152.                                                                                         TIM2CH1_CAPTURE_VAL=TIM2->CCR1;        //獲取當前的捕獲值.
  153.                                                                                         TIM2->CCER&=~(1<<1);                        //CC1P=0 設置為上升沿捕獲
  154.                                                                                   }else                                                                  //還未開始,第一次捕獲上升沿
  155.                                            {
  156.                                                                                         TIM2CH1_CAPTURE_STA=0;                        //清空
  157.                                                                                         TIM2CH1_CAPTURE_VAL=0;
  158.                                                                                         TIM2CH1_CAPTURE_STA|=0X40;                //標記捕獲到了上升沿
  159.                                                                                         TIM2->CNT=0;                                        //計數(shù)器清空
  160.                                                                                         TIM2->CCER|=1<<1;                                 //CC1P=1 設置為下降沿捕獲
  161.                                                         }                    
  162.                                                     }                                                                                   
  163.                    }
  164.                                
  165. /*************************************************************************/
  166.                          
  167. /*************************************************************************/

  168.         if((TIM2CH2_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  169.                                 {
  170.                                                                 if(tsr&0X01)//溢出
  171.                                                                 {            
  172.                                                                                 if(TIM2CH2_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
  173.                                                                                 {
  174.                                                                                         if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
  175.                                                                                         {
  176.                                                                                                 TIM2CH2_CAPTURE_STA|=0X80;//標記成功捕獲了一次
  177.                                                                                                 TIM2CH2_CAPTURE_VAL=0XFFFF;
  178.                                                                                         }else TIM2CH2_CAPTURE_STA++;
  179.                                                                                 }         
  180.                                                                 }
  181.                                                            if(tsr&0x04)//捕獲2發(fā)生捕獲事件
  182.                                             {       
  183.                                                                                         if(TIM2CH2_CAPTURE_STA&0X40)                //捕獲到一個下降沿                
  184.                                                                                         {                                 
  185.                                                                                         TIM2CH2_CAPTURE_STA|=0X80;                //標記成功捕獲到一次高電平脈寬
  186.                                                                                         TIM2CH2_CAPTURE_VAL=TIM2->CCR2;        //獲取當前的捕獲值.
  187.                                                                                         TIM2->CCER&=~(1<<5);                        //CC1P=0 設置為上升沿捕獲
  188.                                                                                   }else                                                                  //還未開始,第一次捕獲上升沿
  189.                                            {
  190.                                                                                         TIM2CH2_CAPTURE_STA=0;                        //清空
  191.                                                                                         TIM2CH2_CAPTURE_VAL=0;
  192.                                                                                         TIM2CH2_CAPTURE_STA|=0X40;                //標記捕獲到了上升沿
  193.                                                                                         TIM2->CNT=0;                                        //計數(shù)器清空
  194.                                                                                         TIM2->CCER|=1<<5;                                 //CC1P=1 設置為下降沿捕獲
  195.                                                         }                    
  196.                                                     }                                                                                   
  197.                    }
  198. /***************************************************************************************
  199.                          
  200. ****************************************************************************************/

  201.         if((TIM2CH3_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  202.                                 {
  203.                                                                 if(tsr&0X01)//溢出
  204.                                                                 {            
  205.                                                                                 if(TIM2CH3_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
  206.                                                                                 {
  207.                                                                                         if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
  208.                                                                                         {
  209.                                                                                                 TIM2CH3_CAPTURE_STA|=0X80;//標記成功捕獲了一次
  210.                                                                                                 TIM2CH3_CAPTURE_VAL=0XFFFF;
  211.                                                                                         }else TIM2CH3_CAPTURE_STA++;
  212.                                                                                 }         
  213.                                                                 }
  214.                                                            if(tsr&0x08)//捕獲1發(fā)生捕獲事件
  215.                                             {       
  216.                                                                                         if(TIM2CH3_CAPTURE_STA&0X40)                //捕獲到一個下降沿                
  217.                                                                                         {                                 
  218.                                                                                         TIM2CH3_CAPTURE_STA|=0X80;                //標記成功捕獲到一次高電平脈寬
  219.                                                                                         TIM2CH3_CAPTURE_VAL=TIM2->CCR3;        //獲取當前的捕獲值.
  220.                                                                                         TIM2->CCER&=~(1<<9);                        //CC1P=0 設置為上升沿捕獲
  221.                                                                                   }else                                                                  //還未開始,第一次捕獲上升沿
  222.                                            {
  223.                                                                                         TIM2CH3_CAPTURE_STA=0;                        //清空
  224.                                                                                         TIM2CH3_CAPTURE_VAL=0;
  225.                                                                                         TIM2CH3_CAPTURE_STA|=0X40;                //標記捕獲到了上升沿
  226.                                                                                         TIM2->CNT=0;                                        //計數(shù)器清空
  227.                                                                                         TIM2->CCER|=1<<9;                                 //CC1P=1 設置為下降沿捕獲
  228.                                                         }                    
  229.                                                     }                                                                                   
  230.                    }
  231. /***************************************************************************
  232.                          
  233. ****************************************************************************/

  234.         if((TIM2CH4_CAPTURE_STA&0X80)==0)//還未成功捕獲       
  235.                                 {
  236.                                                                 if(tsr&0X01)//溢出
  237. ……………………

  238. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
USART_TIM2.rar (110.91 KB, 下載次數(shù): 42)


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

使用道具 舉報

沙發(fā)
ID:276828 發(fā)表于 2019-4-9 08:30 | 只看該作者
你好,你這程序超聲波引腳沒有定義?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久52avav | 91超碰在线观看 | 91免费版在线 | 亚洲乱码一区二区三区在线观看 | 欧美在线一区视频 | 天堂一区二区三区 | 欧美精品二区 | 精品毛片 | 亚洲精品久久久久久久久久吃药 | 久久99精品久久久久蜜桃tv | 成年免费大片黄在线观看岛国 | 午夜视频免费在线 | 亚洲免费视频一区二区 | 国产成人精品一区二区三区视频 | 91亚洲国产成人久久精品网站 | 99福利视频 | 国产精品久久久久久久久大全 | 日韩免费视频 | 久久久久久高潮国产精品视 | 毛片一区二区三区 | 三级黄片毛片 | 久久久久国产 | 久久9精品 | 天堂一区二区三区 | 精品一二三区视频 | 国产在线视频一区 | 日韩一区二区三区视频 | 日韩在线一区二区三区 | 天天干天天爽 | 国产一级毛片视频 | 日本黄视频在线观看 | 日韩一区二区三区在线 | 喷水毛片 | www.成人.com | 69电影网| 国产高清一二三区 | 在线激情视频 | 国产精品久久久久aaaa九色 | 日韩成人在线一区 | 欧美久久精品一级c片 | 国产精品美女www |