找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5840|回复: 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 单片机教程网

快速回复 返回顶部 返回列表