<th id="alkcr"><pre id="alkcr"></pre></th>

  • 打印

    [UNO] 當TB5128遇上Arduino UNO,第一次親密接觸

    [復制鏈接]
    243|4
    跳轉到指定樓層
    樓主
    本帖最后由 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, 下載次數: 5)

          其中有一個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, 下載次數: 3)
    UNO-TB5128應用說明.pdf (158.38 KB, 下載次數: 4)

    完整資料包: UNO5128資料包.zip (283.7 KB, 下載次數: 4)

    測試視頻容量超過文件限制,正在編輯中……

    使用特權

    評論回復
    板凳
     樓主 | 2019-9-24 16:25 | 只看該作者
    附帶測試視頻:
    UNO5128驅動步進電機正反轉測試視頻.zip (4.52 MB, 下載次數: 3)

    視頻中看到電機正反轉和指示燈的變化。

    另外,在程序看到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 | 只看該作者

    使用特權

    評論回復
    掃描二維碼,隨時隨地手機跟帖
    您需要登錄后才可以回帖 登錄 | 注冊

    本版積分規則

    我要發帖 投訴建議 創建版塊 申請版主

    快速回復

    您需要登錄后才可以回帖
    登錄 | 注冊
    高級模式

    論壇熱帖

    關閉

    熱門推薦上一條 /3 下一條

    在線客服 快速回復 返回頂部 返回列表
    成人短片线上看