打印
[UNO]

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

[复制链接]
7327|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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)

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


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


使用特权

评论回复
评论
dirtwillfly 2019-9-26 08:14 回复TA
感谢分享 

相关帖子

沙发
NickyGrout|  楼主 | 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部分的函数:
void hc595Write(unsigned char data)           // 刷新HC595的数据
{
    for (unsigned char i = 0; i < 8; i++)
    {
        digitalWrite(TCP, LOW);               // 将ST_CP口上加低电平让芯片准备好接收数据
        shiftOut(DS, HCP, MSBFIRST, data);    // shiftOut() 串行移位函数  MSBFIRST(数据高位在前)、LSBFIRST(数据低位在前)
        digitalWrite(TCP, HIGH);              // 将ST_CP这个针脚恢复到高电平
        delayMicroseconds(1);                 //  
    }   
}

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

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


TB5128扩展电路板相关资料:
UNO-TB5128.SCH.pdf (50.52 KB)
UNO-TB5128应用说明.pdf (158.38 KB)

完整资料包: UNO5128资料包.zip (283.7 KB)

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

使用特权

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

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

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


主循环中的代码:


void loop()    // put your main code here, to run repeatedly:
{  
    if(c>0)                        // 通过软件延时来取反端口电平,实现脉冲输出
    {        
        digitalWrite(RUN_ON,LOW);  // 开启LED指示灯                         // 2a
        digitalWrite(CLK,HIGH);
        delayMicroseconds(CLK_F);  // 适合8细分或更高细分 转动 // 参考宏定义说明
        digitalWrite(CLK,LOW);
        delayMicroseconds(CLK_F);  // CLK_F 延时值的大于影响输出脉冲的频率
        c--;                       // 每次计数,CLK端输出一个完整的脉冲
        digitalWrite(RUN_ON,HIGH); // 关闭LED指示灯                         // 2a
    }
    else  // c = 20480;              // 输出脉冲数量达到设定值后,重新设定脉冲数量,并改变电机方向
    {
        c = 32000;                 // C=(200*M)*N; M为设定的细分数,括号内是每圈的脉冲数量。 N=转动的圈数
        if(a>0)
        {
            a=0x00;
            digitalWrite(EN,LOW);     // 非必要操作 // EN端清零,关闭TB5128功率级 //会影响电机锁相,进入脱机状态
            digitalWrite(DIR,HIGH);   // 切换电机转动方向
            delayMicroseconds(5);     // 改变方向后,延时一段时间再发脉冲
            digitalWrite(EN,HIGH);    // Set Enable HIGH  // 开启TB5128功率输出 // *
        //digitalWrite(RUN_ON,HIGH); //  关闭LED指示灯                         // 1a
            TQ_HIGH;                  //  50% 的设定电流
            hc595Write(data_595);     // 把数据写入到HC595 // 数据更改后,必须要调用hc595Write(data_595)来刷新输出
            delay(2000);              // 半流锁相2秒左右 // 方便观察电源端电流的变化
            TQ_LOW;                   // 输出电流为设定值的 100%  // 恢复设定电流输出
            hc595Write(data_595);     // 把数据写入到HC595
        //digitalWrite(RUN_ON,LOW); //  开启LED指示灯                         // 1a
        }
        else
        {
            a=0x01;
            digitalWrite(EN,LOW);     // 非必要操作 // EN端清零,关闭TB5128功率级 //会影响电机锁相,进入脱机状态
            digitalWrite(DIR,LOW);    // 切换电机转动方向
            delayMicroseconds(5);     // 改变方向后,延时一段时间再发脉冲
            digitalWrite(EN,HIGH);    // Set Enable HIGH  // 开启TB5128功率输出  // *   
        //digitalWrite(RUN_ON,HIGH); // 关闭LED指示灯                          // 1a  
            TQ_HIGH;                  // 50% 的设定电流
            hc595Write(data_595);     // 把数据写入到HC595
            delay(2000);              // 半流锁相2秒左右 // 方便观察电源端电流的变化
            TQ_LOW;                   // 输出电流为设定值的 100%  // 恢复设定电流输出
            hc595Write(data_595);     // 把数据写入到HC595   
        //digitalWrite(RUN_ON,LOW); //  开启LED指示灯                          // 1a
        }
    }   
}


使用特权

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

使用特权

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

使用特权

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

mmexport1573203344352.jpg (49.18 KB )

mmexport1573203344352.jpg

使用特权

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

使用特权

评论回复
8
单片机供应商02| | 2020-12-23 07:42 | 只看该作者
供应:ATMEGA328P-AU ATTINY2313A-SU 20+ 原装正品现货库存,若有需求,随时联系我。273401740@qq.com 0755-83212298-8008

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

77

帖子

0

粉丝