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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6085|回復: 1
打印 上一主題 下一主題
收起左側

單片機全場定位系統程序 小車靜止或移動過程中碼盤進行全場定位

[復制鏈接]
跳轉到指定樓層
樓主
全場地位系統:小車靜止或移動過程中碼盤進行全場定位,用的是avr單片機.


接線說明:
//左編碼器
PD3   INT1
PB0   PCINT0

//右編碼器
PD2   INT0
PC3   PCINT11


  1. /***********************************************************
  2. *   函數庫說明:差分定位數值計算函數庫                     *
  3. *   版本:      v1.00beta                                  *
  4. *   作者:      王卓然                                     *
  5. *   創建日期:  2008年3月29日                              *
  6. * -------------------------------------------------------- *
  7. *  [支 持 庫]                                              *
  8. *   支持庫名稱:                                           *
  9. *   需要版本:                                             *
  10. *   支持庫說明:                                           *
  11. * -------------------------------------------------------- *
  12. *  [版本更新]                                              *
  13. *   修改:                                                 *
  14. *   修改日期:                                             *
  15. *   版本:                                                 *
  16. * -------------------------------------------------------- *
  17. *  [版本歷史]                                              *
  18. * -------------------------------------------------------- *
  19. *  [使用說明]                                              *
  20. ***********************************************************/

  21. /********************
  22. * 頭 文 件 配 置 區 *
  23. ********************/
  24. # include "RD_MacroAndConst.h"
  25. # include "DL_Config.h"
  26. # include "RD_UseDLocate_LIB.h"
  27. # include "PF_Config.h"
  28. # include "Math.h"

  29. /********************
  30. *   系 統 宏 定 義  *
  31. ********************/

  32. /*------------------*
  33. *   常 數 宏 定 義  *
  34. *------------------*/

  35. //輪子直徑
  36. #ifndef WHEEL_D_L
  37.     #error No define WHEEL_D_L!
  38. #endif
  39. #ifndef WHEEL_D_R
  40.     #error No define WHEEL_D_R!
  41. #endif

  42. //輪間距
  43. #ifndef D_BTW_WHEEL
  44.     #error No define D_BTW_WHEEL
  45. #endif

  46. //每圈線精度
  47. #ifndef N_L
  48.     #error No define N_L
  49. #endif
  50. #ifndef N_R
  51.     #error No define N_R
  52. #endif

  53. //碼盤倍頻數
  54. #ifndef MULTIPLE
  55.     #error No define MULTIPLE
  56. #endif

  57. //計數器 到 弧長
  58. # define K_L    ((PI * (WHEEL_D_L)) / ((MULTIPLE) * (N_L)))
  59. # define K_R    ((PI * (WHEEL_D_R)) / ((MULTIPLE) * (N_R)))




  60. /*------------------*
  61. *   動 作 宏 定 義  *
  62. *------------------*/

  63. /********************
  64. *  自定義類型聲明區 *
  65. ********************/

  66. /********************
  67. *  模塊結構體定義區 *
  68. ********************/

  69. /********************
  70. *   函 數 聲 明 區  *
  71. ********************/
  72. float Get_Absolute_Angle(void);
  73. float fMod(float fNumberA,float fNumberB);
  74. BOOL PROC_Difference_Locate(void);

  75. /********************
  76. *   模塊函數聲明區  *
  77. ********************/

  78. /********************
  79. *   模塊變量聲明區  *
  80. ********************/

  81. /********************
  82. *   全局變量聲明區  *
  83. ********************/
  84. float g_fLastAngle = 0.0;
  85. float g_fX = 0.0;
  86. float g_fY = 0.0;

  87. /********************
  88. *  全局變量聲引用區 *
  89. ********************/
  90. extern BOOL g_bRunFlagB;

  91. /***********************************************************
  92. *   函數說明:獲取當前絕對角度函數                         *
  93. *   輸入:    無                                           *
  94. *   輸出:    角度值                                       *
  95. *   調用函數:無                                           *
  96. ***********************************************************/
  97. float Get_Absolute_Angle(void)
  98. {
  99.     return
  100.         (
  101.             (float)g_lCounterR * (float)K_R
  102.              - (float)g_lCounterL * (float)K_L
  103.          ) * (1.0 / (float)D_BTW_WHEEL);
  104. }

  105. /***********************************************************
  106. *   函數說明:獲取當前相對角度函數                         *
  107. *   輸入:    左編碼器微分量,右編碼器微分量               *
  108. *   輸出:    角度值(弧度)                               *
  109. *   調用函數:無                                           *
  110. ***********************************************************/
  111. float Get_Relative_Angle(INT32 lDCL,INT32 lDCR)
  112. {
  113.     if (lDCL == lDCR)
  114.     {
  115.         return 0.0;
  116.     }
  117.    
  118.     return
  119.         (
  120.             (float)lDCR * (float)K_R
  121.              - (float)lDCL * (float)K_L
  122.          ) * (1.0 / (float)D_BTW_WHEEL);
  123. }



  124. /***********************************************************
  125. *   函數說明:差分定位計算函數                             *
  126. *   輸入:    無                                           *
  127. *   輸出:    FALSE                                        *
  128. *   調用函數:無                                           *
  129. ***********************************************************/
  130. BOOL PROC_Difference_Locate(void)
  131. {
  132.     static INT32 s_lLastCounterL = 0;
  133.     static INT32 s_lLastCounterR = 0;
  134.    
  135.     if ((g_lCounterLImage - s_lLastCounterL)
  136.          == (g_lCounterRImage - s_lLastCounterR))
  137.     {
  138.         INT16 nDeltaCounterL = (INT16)((INT32)g_lCounterLImage - (INT32)s_lLastCounterL);
  139.         float fR = ((float)nDeltaCounterL * (float)K_L);
  140.         
  141.         g_fX += fR * cos(g_fLastAngle);
  142.         g_fY += fR * sin(g_fLastAngle);
  143.     }
  144.     else
  145.     {
  146.         float fDeltaAngle,fAbsoluteAngle;
  147.         //計算角度微元
  148.         {
  149.             float fTempAngle = Get_Relative_Angle
  150.                             (
  151.                                 g_lCounterLImage,
  152.                                 g_lCounterRImage
  153.                             );
  154.             fDeltaAngle = (fTempAngle - g_fLastAngle);
  155.             fAbsoluteAngle = fDeltaAngle * 0.5 + g_fLastAngle;
  156.    
  157.             g_fLastAngle = fTempAngle;
  158.         }
  159.         //計算位置微元
  160.         {
  161.             INT16 nDeltaCounterL = (INT16)((INT32)g_lCounterLImage - (INT32)s_lLastCounterL);
  162.             float fR = (((float)nDeltaCounterL * (float)K_L) * (1.0 / fDeltaAngle)
  163.                 + (float)D_BTW_WHEEL * 0.5);

  164.             fR = 2.0 * fR * sin(fDeltaAngle * 0.5);             //fR->l
  165.         
  166.             g_fX += fR * cos(fAbsoluteAngle);
  167.             g_fY += fR * sin(fAbsoluteAngle);
  168.         }
  169.     }
  170.    
  171.     //數據更新
  172.     s_lLastCounterL = g_lCounterLImage;
  173.     s_lLastCounterR = g_lCounterRImage;
  174.     g_bRunFlagB = TRUE;
  175.    
  176.     return FALSE;
  177. }

  178. /***********************************************************
  179. *   函數說明:實數求模函數                                 *
  180. *   輸入:    被除數,除數                                 *
  181. *   輸出:    取模結果                                     *
  182. *   調用函數:無                                           *
  183. ***********************************************************/
  184. float fMod(float fNumberA,float fNumberB)
  185. {
  186.     if (fNumberB < 0)
  187.     {
  188.         if (fNumberA < 0)
  189.         {
  190.             while(fNumberA < fNumberB)
  191.             {
  192.                 fNumberA -= fNumberB;
  193.             }
  194.         
  195.             return fNumberA;
  196.         }
  197.         else if (fNumberA > 0)
  198.         {
  199.             while((fNumberA + fNumberB) > fNumberB)
  200.             {
  201.                 fNumberA += fNumberB;
  202.             }
  203.             
  204.             return fNumberA;
  205.         }
  206.         else
  207.         {
  208.             return 0.0;
  209.         }
  210.     }
  211.     else if (fNumberB > 0)
  212.     {
  213.         if (fNumberA < 0)
  214.         {
  215.             while((fNumberA + fNumberB) < fNumberB)
  216.             {
  217.                 fNumberA += fNumberB;
  218.             }
  219.             
  220.             return fNumberA;
  221.         }
  222.         else if (fNumberA > 0)
  223.         {
  224.             while(fNumberA > fNumberB)
  225.             {
  226.                 fNumberA -= fNumberB;
  227.             }
  228.             
  229.             return fNumberA;
  230.         }
  231.         else
  232.         {
  233.             return 0.0;
  234.         }
  235.     }
  236.     else
  237.     {
  238.         return 0.0;
  239.     }
  240. }
復制代碼



全場定位系統.rar

113.25 KB, 下載次數: 39, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:323568 發表于 2018-5-7 17:19 | 只看該作者
你好,我想問一下就是兩個編碼器輪子固定的位置是左右平行180度那種嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产一区二区电影 | 一区二区在线 | 免费亚洲成人 | 成人亚洲精品久久久久软件 | 精品国产欧美一区二区 | 麻豆精品一区二区三区在线观看 | 亚洲精品区 | 精品国产一区探花在线观看 | h在线 | 亚洲一区欧美一区 | 91精品国产91久久久久久丝袜 | 国产在线麻豆精品入口 | 国产成人精品一区二区三区视频 | 日韩国产欧美视频 | 四虎影院新地址 | 久久亚洲一区二区三区四区 | 国产高清免费视频 | 国产日韩欧美精品一区二区三区 | 欧美一级全黄 | 国产午夜三级一区二区三 | 激情久久网 | 中文字幕不卡在线观看 | 色在线免费视频 | 欧美日韩a | 久久亚洲综合 | 国产精品高清在线 | 午夜在线| 日韩av中文| 色噜噜色综合 | 国产一区二区三区www | 亚洲一区视频 | 亚洲一区中文字幕在线观看 | 亚洲国产中文在线 | 欧美日韩精品中文字幕 | 日韩欧美电影在线 | 国产一区二区在线免费播放 | 欧美5区 | wwwxxx国产 | 欧美亚洲视频在线观看 | 成人久久视频 | 91麻豆精品国产91久久久久久久久 |