• 
    <ul id="auswy"><sup id="auswy"></sup></ul>
  • <ul id="auswy"></ul>
    ABB
    關注中國自動化產業發展的先行者!
    CAIAC 2025
    2025工業安全大會
    OICT公益講堂
    當前位置:首頁 >> 案例 >> 案例首頁

    案例頻道

    臺達變頻器和C51單片機通訊
    • 企業:中達電通股份有限公司     行業:礦業     領域:機器人    
    • 點擊數:2491     發布時間:2008-04-21 16:35:41
    • 分享到:


    摘  要:臺達VFD全系列變頻器均能夠通過通訊進行參數的讀寫和控制,隨著單片機功能的越來越強大,在嵌入控制中的應用更加的廣泛。如何實現單片機和變頻器之間的通訊是本文的介紹重點。同時本文給出了單片機和變頻器通訊的硬件電路圖和通訊源程序C51,有助于讀者掌握臺達變頻器在嵌入式系統的通訊應用技術。

    關鍵詞:變頻器  C51 單片機 

    1 引言

        臺達VFD全系列變頻器和C51單片機通訊采用串行異步原理。通訊速度用波特率表示。波特率即數據傳送的速率,其定義是每秒鐘傳送的二進制數的位數。例如,數據傳送的速率是120字符/s,而每個字符如上述規定包含10數位,則傳送波特率為1200波特。通訊方向:在串行通訊中,把通訊接口只能發送或接收的單向傳送方法叫單工傳送;而把數據在甲乙兩機之間的雙向傳遞,稱之為雙工傳送。在雙工傳送方式中又分為半雙工傳送和全雙工傳送。半雙工傳送是兩機之間不能同時進行發送和接收,任一時該,只能發或者只能收信息。

        8051單片機串行異步通訊的方式用一個起始位表示字符的開始,用停止位表示字符的結束。其每幀的格式如下:在一幀格式中,先是一個起始位0,然后是8個數據位,規定低位在前,高位在后,接下來是奇偶校驗位(可以省略),最后是停止位1。用這種格式表示字符,則字符可以一個接一個地傳送。在異步通訊中,CPU與外設之間必須有兩項規定,即字符格式和波特率。字符格式的規定是雙方能夠在對同一種0和1的串理解成同一種意義。原則上字符格式可以由通訊的雙方自由制定,但從通用、方便的角度出發,一般還是使用一些標準為好,如采用ASCII標準。

    2 通訊約規

        2.1 臺達VFD變頻器通訊約規

        (1)臺達變頻器通訊字符格式。臺達變頻器通訊字符格式有ASCII和RTU格式,如圖1所示。





    圖1 臺達變頻器通訊字符格式

        (2)臺達變頻器通訊格式的表格描述。臺達變頻器通訊格式的表格描述參見表1。

        表1臺達變頻器通訊格式的表格描述
     

    3 單片機通訊設計

        3.1 C52單片機的串行接口結構

        8051串行接口是一個可編程的全雙工串行通訊接口。它可用作異步通訊方式(UART),與串行傳送信息的外部設備相連接,或用于通過標準異步通訊協議進行全雙工的8051多機系統也可以通過同步方式,使用TTL或CMOS移位寄存器來擴充I/O口。8051單片機通過引腳RXD(P3.0,串行數據接收端)和引腳TXD(P3.1,串行數據發送端)與外界通訊。SBUF是串行口緩沖寄存器,包括發送寄存器和接收寄存器。它們有相同名字和地址空間,但不會出現沖突,因為它們兩個一個只能被CPU讀出數據,一個只能被CPU寫入數據。

        臺達變頻器接受的RS485信號,單片機輸出的是TTL電平。因此要變頻器和單片機通訊要有通訊轉換芯片,目前常用的RS485芯片有MAX485、MAX483,S75176等。在本例子中采用了MAX485和S75176芯片,同時電路圖中預留了RS232電路的接口,方便單片機以RS232通訊方式和其他外設進行通訊。主單片機采用ATMEL公司的AT89C52單片機。

        3.2 軟件調試界面
         
        單片機程序通過在KEIL環境下開發編譯的,調試界面如下:
     

        3.3通訊源程序

    /*********************************************************
    *  本程序是AT89C52單片機和臺達B系列、M系列、L系列、F系列通訊例子.
    *  通訊協議ASCII格式,幀格式為“1位起始位、7位數據、奇偶位(或無)、結束位”共10位.
    *  臺達VFD系列變頻器一幀的通訊格式:第0位:“:”起始位;第1,2位:站號地址.
    *  第3,4位:功能號碼;第5,6,7,8位:寫入的地址;第9,10,11,12位:傳輸數據.
    *  第13,14位:校驗碼;第15,116位:停止0X0D,0X0A.
    *  該程序通過向2000H地址寫入0012H數據來啟動變頻器;向2000H地址寫入0012H數據來停止變頻器.
    *  由P1.0來控制MCU發送數據,P2來控制通訊指示燈.*
    *  編譯環境:KEIL V3.30
    *  作者:劉元剛
    *  部門:中達電通股份有限公司AMD產品處
    *  編寫時間:2008.1.8
    *  修改時間:
    *  修改內容:
    **********************************************************/
    #include <reg51.h>
    char send[17]={0};
    char send1[8]={0x01,0x06,0x01,0x00,0x17,0x70,0x86,0x22};
    char count;
    int  temp;
    bit motor_flag=0;
    /*********ASCII格式變量定義**********/
    char number ;     //設備站號
    char function ;   //功能
    char address_h;   //地址高
    char address_l;   //地址低
    char  data_h ;    //數據
    char  data_l ;    //數據
    char CRC_H;       //校驗
    char CRC_L;       //校驗
    char send_temp;
    int  sum_temp;
    /*
         函數ASCII()實現了臺達變頻器通訊協議轉換為ASCII協議格式的功能。
    */
    void ASCII(void);
    /*
     init_serial()函數串行通訊初始化函數
     實現了:波特率的設定,定時器的選擇,發送模式的選擇
    */
    void init_serial(void);
    //函數ASCII7N2()以數據格式 7,N 2方式發送數據
    void ASCII7N2(void);
    //函數ASCII7O1()以數據格式 7,O 1方式發送數據
    void ASCII7O1(void);
    //函數ASCII7E1()以數據格式 7,E 1方式發送數據
    void ASCII7E1(void);

    main()
    {
         init_serial();
    /***********VFD系列變頻器通訊資料初始化*****/
         number=0x01;
         function=0x06;
         address_h=0x20;
         address_l=0x00;
         data_h=0X00;
         data_l=0x12;
    /******************************************/
         while(1)
      {
       if(P1!=0XFF)
       {
      for(temp=0;temp<3000;temp++)//延時一段時間
       {;}
       if(P1!=0XFF)
       {
        P2=0;
        TI=0;
       ASCII();//發送數據的處理

       ASCII7N2();//以通訊協議為ASCII 9600,7,N,2發送數據
       ASCII7O1();//以通訊協議為ASCII 9600,7,O,1發送數據
       ASCII7E1();//以通訊協議為ASCII 9600,7,E,1發送數據
       
       for(temp=0;temp<10000;temp++)
    //發送完數據之后延時一段時間
        {;}
       for(temp=0;temp<10000;temp++)
        {;}
       motor_flag=~motor_flag;       //完成了變頻器啟動和停止之間的切換
       if(motor_flag==1){data_l=0x11;}
       else{data_l=0x12;}
       P1=0XFF;
       P2=0XFF;
       }
       }       
      } 
    }
    /*******************************************************************************
    ******
    函數nop名稱:void init_serial(void)
    函數功能:
    參數列表:
    返回值  :
    影響資源:
    實現過程:
    ********************************************************************************
    *****/
    void init_serial(void)
    {
        SCON=0x40;//工作在方式1,
     TMOD=0x20;
     TH1=0xFD; //波特率為9600,晶振11.0592MHZ
     TL1=0xFD; 
        TR1=1;        //啟動定時器1
     P1=0XFF;
    }

    void ASCII7N2(void)
    {
         for(count=0;count<17;count++)
        {
        SBUF=send[count]|0X80;
        while(TI==0);
        TI=0;
           }
    }
    void ASCII7O1(void)
    {
     for(count=0;count<17;count++)
        {
       temp=0;
        ACC=send[count]&0X7F;
       send_temp=ACC;
       temp=P;
       send_temp=(temp<<7)|send_temp;
       SBUF=send_temp;
        while(TI==0);
        TI=0;
           }
    }
    void ASCII7E1(void)
    {
     for(count=0;count<17;count++)
        {
       temp=0;
        ACC=send[count]&0X7F;
       send_temp=ACC;
       temp=~P;
       send_temp=(temp<<7)|send_temp;
       SBUF=send_temp;
        while(TI==0);
        TI=0;
           }
    }
    /*******************************************************************************
    函數nop名稱:void ASCII(void)  該函數應該作精簡,可以考慮用結構來實現目前僅僅是測試版本
    函數功能:
    參數列表:
    返回值  :
    影響資源:
    實現過程:
    *******************************************************************************/
    void ASCII()     
    {
        send[0]=0x3A;
        send[1]=((number&0xF0)>>4)+0x30;
        if(send[1]>0x39)(send[1]=(send[1]-0x39)+0x40);
        send[2]=((number&0x0F)+0x30);
        if(send[2]>0x39)(send[2]=(send[2]-0x39)+0x40);
        send[3]=((function&0xF0)>>4)+0x30;
        if(send[3]>0x39)(send[3]=(send[3]-0x39)+0x40);
        send[4]=((function&0x0F)+0x30);
        if(send[4]>0x39)(send[4]=(send[4]-0x39)+0x40); 
        send[5]=((address_h&0xF0)>>4)+0x30;
        if(send[5]>0x39)(send[5]=(send[5]-0x39)+0x40);
        send[6]=((address_h&0x0F)+0x30);
        if(send[6]>0x39)(send[6]=(send[6]-0x39)+0x40); 
        send[7]=((address_l&0xF0)>>4)+0x30;
        if(send[7]>0x39)(send[7]=(send[7]-0x39)+0x40);
        send[8]=((address_l&0x0F)+0x30);
        if(send[8]>0x39)(send[8]=(send[8]-0x39)+0x40);
        send[9]=((data_h&0xF0)>>4)+0x30;
        if(send[9]>0x39)(send[9]=(send[9]-0x39)+0x40);
        send[10]=((data_h&0x0F)+0x30);
        if(send[10]>0x39)(send[10]=(send[10]-0x39)+0x40);
        send[11]=((data_l&0xF0)>>4)+0x30;
        if(send[11]>0x39)(send[11]=(send[11]-0x39)+0x40);
        send[12]=((data_l&0x0F)+0x30);
        if(send[12]>0x39)(send[12]=(send[12]-0x39)+0x40);
        sum_temp=number+function+address_h+address_l+data_h+data_l;
        sum_temp=(~sum_temp)+1 ;
        send[13]=((sum_temp&0xF0)>>4)+0x30;
        if(send[13]>0x39)(send[13]=(send[13]-0x39)+0x40);
        send[14]=((sum_temp&0x0F)+0x30);
        if(send[14]>0x39)(send[14]=(send[14]-0x39)+0x40);
        send[15]=0x0D;
        send[16]=0X0A;     
     }

    4 結束語

        隨著嵌入式技術的飛速發展,單片機與變頻器的通訊設計技術變得越來越有強烈的工程實用意義。在定制化或者客制化應用系統里的單片機與變頻器通訊集成系統不但可以有更加緊湊經濟靈活的體系結構,特別是還有利于形成具有獨立技術特點和獨立知識產權的主權增值產品。

    作者簡介:

        劉元剛   中達電通股份有限公司AMD產品處   工程師

    熱點新聞

    推薦產品

    x
    • 在線反饋
    1.我有以下需求:



    2.詳細的需求:
    姓名:
    單位:
    電話:
    郵件: