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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6153|回復: 1
收起左側

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

[復制鏈接]
ID:102668 發表于 2016-1-10 23:04 | 顯示全部樓層 |閱讀模式
全場地位系統:小車靜止或移動過程中碼盤進行全場定位,用的是avr單片機.
00000.png

接線說明:
//左編碼器
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

回復

使用道具 舉報

ID:323568 發表于 2018-5-7 17:19 | 顯示全部樓層
你好,我想問一下就是兩個編碼器輪子固定的位置是左右平行180度那種嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91av在线视频观看 | 曰韩一二三区 | 久久久久久99 | 欧美日韩国产精品一区二区 | 国产一级片免费在线观看 | 久久精品视频12 | av网站在线播放 | 日韩成人免费在线视频 | 成人网av| 欧美精品乱码99久久影院 | 亚洲国产在 | 亚洲一区不卡在线 | 日韩一区在线播放 | 午夜免费看视频 | av乱码| 日韩欧美二区 | 国产精品久久久久久久久久东京 | 中文字幕亚洲一区二区三区 | 国产一级特黄视频 | 黄a网| 精品国产18久久久久久二百 | 羞羞色视频 | 亚洲一区二区久久久 | 亚洲日韩中文字幕一区 | 日产久久 | 亚洲高清在线 | 欧美精品一 | 日韩在线 | 欧美成人综合 | 日本人爽p大片免费看 | 欧美三区| 国产69精品久久久久777 | 2019精品手机国产品在线 | 日韩a级片| 欧美一区二区三区国产精品 | 亚洲成人一区二区 | 涩涩视频在线观看 | 国产超碰人人爽人人做人人爱 | 日韩精品在线播放 | 国产乱码高清区二区三区在线 | 成人在线精品视频 |