找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6858|回复: 0
打印 上一主题 下一主题
收起左侧

mini512线编码器MC9S12XS128源程序与相关资料下载

[复制链接]
跳转到指定楼层
楼主


mini 512编码器系列使用说明书

一、特点
电子部分采用先进的检测技术 , 机械外壳全铝合金构造 ( 转子除外 ) 。

具有以下特点:
● 分辨率有: AB 相正交输出 256 线、 AB 相正交输出 1024 线、步进 + 方向输出 512 线;
● 旋转速度高,最高转速可达 10000rpm ;
● 宽广的工作温度范围: -40 ℃ ~ +125 ℃ 。
● 抗扰性好 。 本产品采用霍尔检测技术 , 属于无接触检测 , 传感器运行不受灰尘或其它杂物影响,很好克服了基于光学检测原理的缺点;
● 体积小巧。直径 D : 14mm 高 H : 18mm 轴径: 3mm ;
● 重量轻。除转轴外,全铝合金构造,净重 11.5 克。

二、应用
● 机器人
● 机械手
● 运动控制系统
● 伺服系统
● 自动化设备
● 办公室设备
● 取代光学编码器
● 智能车



512 线增量式编码器使用教程


模块说明:本编码器体积超小,编码器外径 1.5cm,质量超轻,方便灵活的安装在 A,B,C,D,E 等车模上,是智能车和机器人的不二人选。编码器为 512 线 3 相Mini 增量式旋转编码器,编码器自身直接输出旋转方向和脉冲,程序简单,可运用于 8 位,16 位,32 位等系列单片机。3.3V到5V宽电压供电,以满足不同 IO 口电平的单片机。无需正交解码或其他
繁琐程序即可稳定获得编码器齿选装方向。编码器配套各种车模的齿轮可使用任意组别车模。
模块使用方法:按下图方式连接编码器至电源和单片机打开测试程序,连接单片机和电脑或OLED即可在虚拟示波器或OLED上观看编码器旋转波冲值,也可利用示波器观看编码器输出波形。

如果采用示波器观看编码器输出脉冲,只需要给编码器连接电源,将示波器探头底线与电源地线连接,示波器探头信号输入端连接 2(LSB)即可观看编码器输出脉冲的波形,连接示波器信号输出端到 5(Dir)即可观看旋转方向输出信号。若采用单片机查看编码器脉冲和旋转方向输出,即可连接 1(GND)到单片机电源地线,2(LSB)到单片机脉冲扑捉端口具体单片机下面将会介绍,4(VCC)到单片机电源正极,5(Dir)到单片机普通可做输入的 IO 口,下载相应的测试程序,连接好 OLED 或者串口工具到电脑即可在上位机和OLED 上查看编码器输出脉冲和旋转方向, 具体方法程序介绍中有介绍。

使用注意事项:编码器供电电压不得超过允许的电压,不得对编码器转轴施加过大的力从而导致转轴变形,编码器信号线最好使用胶带固定在编码器外壳上避免长期使用过程中的拉扯导致信号线脱落。
(二)编码器采集程序介绍
XS128 程序介绍: 给编码器和单片机供电, 要求单片机和编码器公地,连接编码器2(LSB)到单片机 T7 口,连接编码器 5(Dir)到单片机 A0 口,连接单片机和蓝牙串口模块,RX 到 S0,TX 到单片机 S1,打开上位机


运行上位机后,带串口连接好后调节上位机刻度就会看到编码器的脉冲信息。
K60 程序介绍:给编码器和单片机供电(编码器可选择3.3V 或5V供电) ,要求单片机和编码器公地, 连接编码器 2 (LSB) 到单片机 C5 口, 连接编码器 5(Dir)到单片机C0 口,连接单片机和蓝牙串口模块,RX 到D6,TX 到单片机 D7,上位机如上操作。运行上位机后,带串口连接好后调节上位机刻度就会看到编码器的脉冲信息。



单片机源程序如下:
  1. /********************************************************
  2. 【平    台】龙丘MC9S12XS128系统板V4.1
  3. 【编    写】龙丘
  4. ------------------------------------------------
  5. 【dev.env.】Code Warrior 5.1
  6. 【Target  】MC9S12XS128
  7. 【pllclock】64.000MHz
  8. 接线方式
  9. 编码器------->单片机
  10. GND -------> GND
  11. VCC -------> VCC
  12. LSB -------> T7
  13. DIR -------> A0
  14. 蓝牙串口模块------->单片机
  15. RX -------> S0
  16. TX -------> S1
  17. 版权龙邱智能科技所有,转载需注明出处!
  18. ********************************************************/
  19. #include <hidef.h>      /* common defines and macros */
  20. #include "derivative.h"      /* derivative-specific definitions */
  21. void SetBus_64M(void);
  22. void PIT_Init(void);
  23. void TimInit (void);
  24. void UART_Init (void);
  25. void uart_putchar ( unsigned char c);
  26. unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT);
  27. void OutPut_Data(void);
  28. void Speed_Read(void);
  29. float OutData[4] = { 0 };
  30. uint num=0;
  31. int  Motor_Polse=0;
  32. /****************************************************
  33.   函数名称:void SetBus_64M(void)
  34.   函数简介:设置总线频率为64M,晶振频率16M
  35.   入口参数:
  36.   出口参数:
  37. *****************************************************/
  38. void SetBus_64M(void)
  39. {
  40.   CLKSEL_PLLSEL=0;  //禁止使能锁相环时钟
  41.   PLLCTL_PLLON=1;   //锁相环电路允许
  42.   SYNR=0xc0|0x07;   //VCO_clock=2*osc_clock*(SYNR+1)/(REFDV+1)=128MHz
  43.                     //VCOFRQ[1:0]=1:1,代表VCO_clock在80~120MHz
  44.   REFDV=0x80|0x01;   //VCO_clock=2*osc_clock*(SYNR+1)/(REFDV+1)=128MHz
  45.                     //REF_clock=osc_clock/(REFDV+1)
  46.                     //REFFEQ[1:0]=1:0,代表参考时钟在6~12MHz之间
  47.   POSTDIV=0x00;      //PLL_clock=VCO_clock
  48.   _asm(nop);
  49.   _asm(nop);         //短暂延时,等待时钟频率稳定
  50.   while(!(CRGFLG_LOCK==1))
  51.   {
  52.   ;
  53.   }
  54.   CLKSEL_PLLSEL=1;
  55. }
  56. //==============================================================
  57. //函数:void PIT_Init(void)
  58. //描述:初始化定时器为1ms中断
  59. //参数:无
  60. //返回:无
  61. //==============================================================
  62. void PIT_Init(void)
  63. {
  64.    PITCFLMT=0x00; //禁止使能PIT模块
  65.    PITCE_PCE0=1;  //使能定时器通道0
  66.    PITMUX=0x00; //定时器通道0使用微定时基准0
  67.    PITMTLD0=8-1; //设置8位微定时装载寄存器0初值
  68.    PITLD0=8000-1; //定时周期=(&PITMTLD0+1)*(&PITLD0+1)
  69.    PITINTE=0x01;  //使能PIT定时器通道0中断
  70.    PITCFLMT=0x80; //使能PIT模块
  71. }
  72. //==============================================================
  73. //函数:void TimInit (void)
  74. //描述:脉冲累加器初始化
  75. //参数:无
  76. //返回:无
  77. //==============================================================
  78. void TimInit (void)
  79. {

  80. PACTL=0X00;
  81. PACNT=0X0000;//设置脉冲累加器初值
  82. PACTL_PAEN=1;
  83. }

  84. //==============================================================
  85. //函数:void UART_Init (void)
  86. //描述:串口初始化,配置串口1,波特率为9600
  87. //参数:无
  88. //返回:无
  89. //==============================================================
  90. void UART_Init (void)
  91. {
  92.    
  93.           SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
  94.     SCI0BDH=0x01; //busclk  8MHz,19200bps,SCI0BDL=0x1a
  95.     SCI0BDL=0xa0; //SCI0BDL=busclk/(16*SCI0BDL)                  
  96.                   //busclk 32MHz, 9600bps,SCI0BDL=0xD0
  97.                   //115200 bps     SCI0BDL=0x11
  98. }                 // 64M 9600    SCI0BDH=0x01; SCI0BDL=0xA0;
  99. //==============================================================
  100. //函数:unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
  101. //描述:虚拟示波器上位机接口程序
  102. //参数:
  103. //返回?
  104. //==============================================================
  105. unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
  106. {
  107.     unsigned short CRC_Temp;
  108.     unsigned char i,j;
  109.     CRC_Temp = 0xffff;

  110.     for (i=0;i<CRC_CNT; i++){      
  111.         CRC_Temp ^= Buf[i];
  112.         for (j=0;j<8;j++) {
  113.             if (CRC_Temp & 0x01)
  114.                 CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
  115.             else
  116.                 CRC_Temp = CRC_Temp >> 1;
  117.         }
  118.     }
  119.     return(CRC_Temp);
  120. }
  121. //==============================================================
  122. //函数:void OutPut_Data(void)
  123. //描述:向虚拟示波器发送数据
  124. //参数:无
  125. //返回:无
  126. //==============================================================
  127. void OutPut_Data(void)
  128. {
  129.   int temp[4] = {0};
  130.   unsigned int temp1[4] = {0};
  131.   unsigned char databuf[10] = {0};
  132.   unsigned char i;
  133.   unsigned short CRC16 = 0;
  134.   for(i=0;i<4;i++)
  135.    {
  136.    
  137.     temp[i]  = (int)OutData[i];
  138.     temp1[i] = (unsigned int)temp[i];
  139.    
  140.    }
  141.    
  142.   for(i=0;i<4;i++)
  143.   {
  144.     databuf[i*2]   = (unsigned char)(temp1[i]%256);
  145.     databuf[i*2+1] = (unsigned char)(temp1[i]/256);
  146.   }
  147.   
  148.   CRC16 = CRC_CHECK(databuf,8);
  149.   databuf[8] = CRC16%256;
  150.   databuf[9] = CRC16/256;
  151.   
  152.   for(i=0;i<10;i++)
  153.     uart_putchar(databuf[i]);
  154. }
  155. //==============================================================
  156. //函数:void uart_putchar ( unsigned char c)
  157. //描述:发送一个字节
  158. //参数:无
  159. //返回:无
  160. //==============================================================
  161. void uart_putchar ( unsigned char c)
  162. {
  163.   while(!(SCI0SR1&0x80)) ;                     //keep waiting when not empty  
  164.   SCI0DRL=c;
  165. }
  166. //==============================================================
  167. //函数:void main(void)
  168. //描述:工程得主函数
  169. //参数:无
  170. //返回:无
  171. //==============================================================
  172. void main(void)
  173. {

  174.   
  175.    SetBus_64M();  //初始化总线始终64M
  176.    PIT_Init();    //设置定时器中断1ms
  177.    TimInit ();    //初始化脉冲累加器用于编码器计数
  178.    UART_Init();   //串口初始化,配置波特率9600
  179.    DDRA_DDRA0=0;  //配置A0口位输入端口,用于测量编码器选装方向
  180.    EnableInterrupts;   //打开所有中断
  181.    while(1)
  182.    {
  183.     OutPut_Data();   //向上位机发送数据
  184.    }
  185.         EnableInterrupts;


  186.   
  187. }
  188. //==============================================================
  189. //函数Speed_Read(void)
  190. //描述:读取编码器脉冲
  191. //参数:无
  192. //返回:无
  193. //==============================================================
  194. void Speed_Read(void)

  195. {
  196. //uint  Motor_Polse=0;
  197. Motor_Polse=PACNT;          //读取寄存器得脉冲值
  198. if(PORTA_PA0==1)           //判断编码器方向
  199.   {
  200.    Motor_Polse=-Motor_Polse;  //反向取反
  201.   }
  202. OutData[0]=Motor_Polse;
  203. _asm(nop) ;
  204. _asm(nop) ;
  205. PACNT=0X0000;              //清楚寄存器得脉冲值
  206. // Motor_Polse=0;
  207. }
  208. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  209. //==============================================================
  210. //函数interrupt VectorNumber_Vpit0 void PIT_ISR (void)
  211. //描述:定时器中断函数
  212. //参数:无
  213. //返回:无
  214. //==============================================================
  215. interrupt VectorNumber_Vpit0 void PIT_ISR (void)
  216. {
  217.   
  218. num++;
  219. if(num>10)
  220. {
  221.   num=0;
  222.   Speed_Read();
  223. }

  224. PITTF_PTF0=1; //清除中断ADtransform();


  225. }
复制代码



全部资料51hei下载地址:
http://www.51hei.com/bbs/dpj-109842-1.html


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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