<output id="hxt7n"><dfn id="hxt7n"><form id="hxt7n"></form></dfn></output>

<track id="hxt7n"><progress id="hxt7n"><th id="hxt7n"></th></progress></track>
<address id="hxt7n"><big id="hxt7n"></big></address>

      <sub id="hxt7n"></sub>

      搜索
      打印

      [UNO] 当TB5128遇上Arduino UNO,第一次亲密接触

      [复制链接]
      1372|7
      跳转到指定楼层
      楼主
      本帖最后由 NickyGrout 于 2019-9-24 03:59 编辑

            几年前了解到Arduino时,没想过自己有一天也会开始折腾。一直以为基于Arduino的程序,占空间,速度慢……最近回头深入了解时,其实用Arduino模板来开发,也可以像普通用AVR方式一样编程,差别不大。用Arduino的库只是更省事而已……在折腾中发现Arduino其实也挺好用的,刚好最近在测试步进驱动芯片TB5128,所以设计了一个匹配UNO的TB5128扩展模板,两者配合一起折腾,第一版先考虑在程序中使用Arduino库函数,先测试TB5128的最基本测试

            本次测试目的,是Arduino UNOTB5128扩展板的基本操作。实时自动循环正反转,根据脉冲数量来控制电机转动的角度。每次填充的脉冲数量计数完毕,程序中会自动切换方向,然后再次填充同样数量的脉冲。程序中,细分和衰减都有相应的函数去设置,方便调用。脉冲是通过软件定时,取反IO实现。脉冲频率的调整,可以在宏(CLK_F)中修改对应的数值。注意,因为没有加减速,所以在低细分数时,频率不要太高了。一般转速在1/秒左右,基本可以正常转动。再快的就要看电机的高频特性、驱动电压和负载情况了。另外TB5128的报警输出和Mo的端口还没在程序中实现检测……


      Arduino UNO +TB5128实物图片,测试中
                                    

      功能设置说明:
          拔码开关SW设置功能:(默认设置成全低)
      1.      GAIN_SEL(放大比例选择,可以选择5或10,对应电流计算公式:IO=VREF / GAIN / RS采样电阻)
      2.      EDG_SEL(触发边沿选择,CLK是上升沿触发或者选择双边沿触发)
      3.      IF_SEL(设置控制模式,本测试中是CLK模式,就是脉冲和方向直接控制,另外还有串行控制模式,待续)

          其它设置:图1标记有VREF字样处的插针(SEL4),是用来选择外部电阻分压生成VREF或者是UNO板输出PWM通过RC滤波生成VREF电压。 RS_SEL(板背面,用来设置采样模式)是通过短路焊点设置为外部采样模式。其它如:SEL2SEL3都由UNO板控制。TE1(对应SEL1,设置TB5128RESET)也是在板上短路为UNO控制。
          其中UNO5128.c文件完全与UNO5128.ino文件一样,复制成C文件格式,方便没有装Arduino软件的网友也能直接打开查看。HC595.h并不是单纯的头文件,包括595控制的相关函数都在里面      

                 连接42的步进电机电机,额定电流2.5A的。TB5128扩展板设计在没考虑外部5V稳压电路,只能从UNO板引入……


      只是基本的操作,项目使用了 1634 字节,占用了 (5%) 程序存储空间。最大为 32256 字节。                                                    全局变量使用了13字节,(0%)的动态内存,余留2035字节局部变量。最大为2048字节。

      全部程序文件打包:
            UNO5128.zip (8.15 KB, 下载次数: 16)

            其中有一个C文件,与ino文件是完全一样的,方便没有装Arduino软件的网友也可以直接查看。程序中基本是完全注释了。没办法,AVR和Arduino都是第一次用,为了方便自己后续修改,都加了备注作说明,有可能描述不当的地方,请自动忽略。74HC595相关的控制程序都在其头文件中,一般不太复杂的程序,习惯放在基头文件中。另外关于电路板资料请看2楼,TB5128的资料:TB5128芯片资料


              题外话,有没有网友对第一亲密接触这个小说有印象吗当年在学校,都听着电台版入睡的,那主持的声音好迷人


      使用特权

      评论回复

      评论

      dirtwillfly 2019-9-26 08:14 回复TA
      感谢分享 
      沙发
       楼主 | 2019-9-23 16:23 | 只看该作者
      本帖最后由 NickyGrout 于 2019-9-23 16:37 编辑

      部分程序说明:

      /*
      * 控制主板: Arduino UNO
      * 驱动板 : TB5128 步进驱动芯片(匹配UNO的驱动模块)  NO.1 (2019-09-11)
      *
      * 部分函数和端口功能控制说明(函数在HC595.h 文件)
      *
      * microStep(step):
      *     设置TB5128细分数的函数, step=细分数, 需要用到什么细分就写入对应的数字, 函数中自动设置对应状态输出
      *     
      * smdmode(fdt):  
      *     设置衰减的函数, fdt有4档 // 1=37.5% 快衰减 // 2=50% 快衰减 // 3=100% 快衰减 // 4 = ADMD(智能衰减)
      *     
      *     TQ_HIGH; 对应TORQE = HIGH;   // TQ_LOW; 对应TORQE = LOW   // 宏定义中已对应
      *     ST_HIGH; 对应STANDBY = HIGH; // ST_LOW; 对应STANDBY = LOW // 宏定义中已对应
      *     
      *     1.8度的电机,整步转一圈需要的脉冲数= 360/1.8 = 200个脉冲
      *     8细分时转一圈需要的脉冲数= 200 * 8=1600个脉冲,当脉冲频率=1.6KHZ时,速度=每秒转一圈
      *     
      *     RES5128 控制TB5128的RESET引脚 , 由UNO板直接控制   
      *     
      *     PWMVREF 用来调整VREF,用到定时器1的PWM ,通过RC滤波生成直流电压,从而设定TB5128的输出电流
      *     TCCR1B=TCCR1B & B11111000 | 0x01 ; //修改定时器1分频比,PWM模块默认64分频 //提高PWMVREF的频率
      *     
      *     输出电流IO= VREF / GAIN / RS(采样电阻的阻值) // GAIN可以在板上通过拔码开关设定为10或者5,外部设定
      */


      74HC595部分的函数:
      1. void hc595Write(unsigned char data)           // 刷新HC595的数据
      2. {
      3.     for (unsigned char i = 0; i < 8; i++)
      4.     {
      5.         digitalWrite(TCP, LOW);               // 将ST_CP口上加低电平让芯片准备好接收数据
      6.         shiftOut(DS, HCP, MSBFIRST, data);    // shiftOut() 串行移位函数  MSBFIRST(数据高位在前)、LSBFIRST(数据低位在前)
      7.         digitalWrite(TCP, HIGH);              // 将ST_CP这个针脚恢复到高电平
      8.         delayMicroseconds(1);                 //  
      9.     }   
      10. }

      11. void microStep(unsigned char M)     //  设置细分数
      12. {                                   
      13.     data_595 = data_595 | 0x1C;     //  把设置细分的位全部置1 // B000 111 00; // =0x1C;

      14.     switch(M)      //  micro_step = 0b111 SSS 11; 其中 S S S 位是设置细分数, 0b111 M0 M1 M2 11; // 2,3,4设置细分数
      15.     {
      16.         case   1:  data_595 &= 0xE3; break;    // B11100011;  break;  // 1   细分      B111 000 11;  // 0xE3
      17.         case   2:  data_595 &= 0xF3; break;    // B11110011;  break;  // 2   细分      B111 100 11;  // 0xF3
      18.         case   4:  data_595 &= 0xEB; break;    // B11101011;  break;  // 4   细分      B111 010 11;  // 0xEB
      19.         case   8:  data_595 &= 0xFB; break;    // B11111011;  break;  // 8   细分      B111 110 11;  // 0xFB
      20.         case  16:  data_595 &= 0xE7; break;    // B11100111;  break;  // 16  细分      B111 001 11;  // 0xE7
      21.         case  32:  data_595 &= 0xF7; break;    // B11110111;  break;  // 32  细分      B111 101 11;  // 0xF7
      22.         case  64:  data_595 &= 0xEF; break;    // B11101111;  break;  // 64  细分      B111 011 11;  // 0xEF
      23.         case 128:  data_595 &= 0xFF; break;    // B11111111;  break;  // 128 细分      B111 111 11;  // 0xFF
      24.         default:                     break;
      25.     }
      26. }
      复制代码


      TB5128扩展电路板相关资料:
      UNO-TB5128.SCH.pdf (50.52 KB, 下载次数: 12)
      UNO-TB5128应用说明.pdf (158.38 KB, 下载次数: 11)

      完整资料包: UNO5128资料包.zip (283.7 KB, 下载次数: 10)

      测试视频容量超过文件限制,正在编辑中……

      使用特权

      评论回复
      板凳
       楼主 | 2019-9-24 16:25 | 只看该作者
      附带测试视频:
      UNO5128驱动步进电机正反转测试视频.zip (4.52 MB, 下载次数: 8)

      视频中看到电机正反转和指示灯的变化。

      另外,在程序看到TQ端也会相应操作,这个可以改变输出电流。选择输出100%设定的电流,或者输出50%设定的电流


      主循环中的代码:


      1. void loop()    // put your main code here, to run repeatedly:
      2. {  
      3.     if(c>0)                        // 通过软件延时来取反端口电平,实现脉冲输出
      4.     {        
      5.         digitalWrite(RUN_ON,LOW);  // 开启LED指示灯                         // 2a
      6.         digitalWrite(CLK,HIGH);
      7.         delayMicroseconds(CLK_F);  // 适合8细分或更高细分 转动 // 参考宏定义说明
      8.         digitalWrite(CLK,LOW);
      9.         delayMicroseconds(CLK_F);  // CLK_F 延时值的大于影响输出脉冲的频率
      10.         c--;                       // 每次计数,CLK端输出一个完整的脉冲
      11.         digitalWrite(RUN_ON,HIGH); // 关闭LED指示灯                         // 2a
      12.     }
      13.     else  // c = 20480;              // 输出脉冲数量达到设定值后,重新设定脉冲数量,并改变电机方向
      14.     {
      15.         c = 32000;                 // C=(200*M)*N; M为设定的细分数,括号内是每圈的脉冲数量。 N=转动的圈数
      16.         if(a>0)
      17.         {
      18.             a=0x00;
      19.             digitalWrite(EN,LOW);     // 非必要操作 // EN端清零,关闭TB5128功率级 //会影响电机锁相,进入脱机状态
      20.             digitalWrite(DIR,HIGH);   // 切换电机转动方向
      21.             delayMicroseconds(5);     // 改变方向后,延时一段时间再发脉冲
      22.             digitalWrite(EN,HIGH);    // Set Enable HIGH  // 开启TB5128功率输出 // *
      23.         //digitalWrite(RUN_ON,HIGH); //  关闭LED指示灯                         // 1a
      24.             TQ_HIGH;                  //  50% 的设定电流
      25.             hc595Write(data_595);     // 把数据写入到HC595 // 数据更改后,必须要调用hc595Write(data_595)来刷新输出
      26.             delay(2000);              // 半流锁相2秒左右 // 方便观察电源端电流的变化
      27.             TQ_LOW;                   // 输出电流为设定值的 100%  // 恢复设定电流输出
      28.             hc595Write(data_595);     // 把数据写入到HC595
      29.         //digitalWrite(RUN_ON,LOW); //  开启LED指示灯                         // 1a
      30.         }
      31.         else
      32.         {
      33.             a=0x01;
      34.             digitalWrite(EN,LOW);     // 非必要操作 // EN端清零,关闭TB5128功率级 //会影响电机锁相,进入脱机状态
      35.             digitalWrite(DIR,LOW);    // 切换电机转动方向
      36.             delayMicroseconds(5);     // 改变方向后,延时一段时间再发脉冲
      37.             digitalWrite(EN,HIGH);    // Set Enable HIGH  // 开启TB5128功率输出  // *   
      38.         //digitalWrite(RUN_ON,HIGH); // 关闭LED指示灯                          // 1a  
      39.             TQ_HIGH;                  // 50% 的设定电流
      40.             hc595Write(data_595);     // 把数据写入到HC595
      41.             delay(2000);              // 半流锁相2秒左右 // 方便观察电源端电流的变化
      42.             TQ_LOW;                   // 输出电流为设定值的 100%  // 恢复设定电流输出
      43.             hc595Write(data_595);     // 把数据写入到HC595   
      44.         //digitalWrite(RUN_ON,LOW); //  开启LED指示灯                          // 1a
      45.         }
      46.     }   
      47. }
      复制代码


      使用特权

      评论回复
      地板
      | 2019-10-8 00:02 | 只看该作者

      使用特权

      评论回复
      5
      | 2019-10-18 08:21 | 只看该作者

      使用特权

      评论回复
      6
      | 2019-11-11 15:11 | 只看该作者
      喜欢电子科技的朋友们可以关注一下我们的微信公众号哦
      没钱没资本只能这样推广了

      mmexport1573203344352.jpg (49.18 KB, 下载次数: 5)

      mmexport1573203344352.jpg

      使用特权

      评论回复
      7
      | 2019-11-14 22:36 | 只看该作者
      学习了。

      使用特权

      评论回复
      扫描二维码,随时随地手机跟帖
      您需要登录后才可以回帖 登录 | 注册

      本版积分规则

      我要发帖 投诉建议 创建版块 申请版主

      快速回复

      您需要登录后才可以回帖
      登录 | 注册
      高级模式

      论坛热帖

      关闭

      热门推荐上一条 /2 下一条

      在线客服 快速回复 返回顶部 返回列表