新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于PIC18F452單片機的仿生機器魚的舵機控制

        基于PIC18F452單片機的仿生機器魚的舵機控制

        作者: 時間:2011-11-24 來源:網絡 收藏

        3 舵機的控制
        3.1 舵機的工作原理:
        舵機主要由以下幾個部分組成:舵盤、減速齒輪組、比例電位器(位置反饋電位計)、直流電機(馬達)、控制電路板等。其工作原理:控制電路板接受來自信號線的控制信號,控制直流電機轉動,直流電機帶動一系列齒輪組,其齒輪組的輸出軸與一個線性的比例電位器相連,該電位器把輸出軸轉過的角度θ 轉換成比例的電壓反饋給控制電路,控制電路將其與輸入的控制脈沖信號比較,產生糾偏脈沖,并驅動馬達正向或反向地轉動,使齒輪組的輸出位置與期望值相符,令糾正脈沖趨于為0,從而達到使舵機精確定位的目的。舵機是一個典型閉環反饋系統,其工作原理由圖3 所示。

        舵機的輸入線共有三條,紅色中間,是電源線,一邊黑色的是地線,這兩根線給舵機提供最基本的能源保證,主要是電機的轉動消耗。電源有兩種規格,一是4.8V,一是6.0V,分別對應不同的轉矩標準,另外一根線是控制信號線,一般為白色。
        3.2 單舵機和多舵機的角度控制
        3.2.1 單舵機的角度控制:
        由舵機的工作原理可知,給舵機輸入一個周期在20ms 左右,脈沖寬度在0.5ms 至2.5ms 之間的周期性脈沖信號,驅動舵機輸出軸達到-90°到90° 之間的轉角,呈線性變化。并且無論外界轉矩怎樣改變,舵機的輸出軸都會保持在一個相對應的角度上,直到給它提供一個另外寬度的脈沖信號,才會改變輸出角度到新的對應的位置上。通過編程,借助單片機的輸出端口得到需要的周期性脈沖信號。
        程序示例:(晶振為:4MHZ,脈沖從PORTDbits.RD0 輸出)
        void delay(int j) //此函數用于產生0.25ms*j 的延時
        {
        for(i=0;ij;i++)
        {

        INTCONbits.TMR0IF=0; //清TMR0 中斷標志位
        T0CON=0XCF; //設定TMR0L 工作于8 位定時器方式、內部時鐘、
        TMR0 不用分頻
        TMR0L=0X14; //設定TMR0 每0.25ms 產生一次中斷
        L1: if(INTCONbits.TMR0IF==1)
        {
        INTCONbits.TMR0IF==0; //清TMR0 中斷標志位,關計時器
        T0CON=0X4F;
        }
        else goto L1;
        }
        }
        PORTDbits.RD0=1; // 輸出脈沖寬度為2ms,周期為20ms 的脈沖信號
        delay(8);
        PORTDbits.RD0=0;
        delay(72);
        從上面的程序可知,通過改變delay 函數的形參j,可以根據需要,得到具有相應脈沖寬度和周期的脈沖信號。例如,改變以上程序段的1 至4 行為:
        PORTDbits.RD0=1;
        delay(4);
        PORTDbits.RD0=0;
        delay(76);
        得到輸出脈沖寬度為1ms,周期為20ms 的脈沖信號,然后借助for 循環,將能得到所需要的周期性脈沖信號,驅動舵機輸出軸達到-90°到90° 之間的轉角。
        3.2.2 多舵機不同角度的控制:
        通過多舵機不同角度的控制,可以控制幾個舵機同時向不同角度扭轉,以達到預期的控制目的。
        具體的實現方法是:在定時器延時函數中設定一個計時值t(在程序中t 在初始化時值為0),使t 在每次定時器計時完畢時加1。例如,定時器一周期的定時時間為0.25ms,則t值每加1 就相當于0.25ms。當t 的代表值達到20ms 也就是當t 等于80 時清零,這樣就可以將脈沖周期控制在20ms,再通過使用if 語句查詢方式,可以調節同一周期脈沖的脈沖寬度,即能使多舵機同時向不同角度旋轉。
        程序示例:(晶振為:4MHZ,脈沖從PORTDbits.RD0,PORTDbits.RD1,PORTDbits.RD2三個端口中輸出)
        if(t=0) //端口初始化
        {
        PORTDbits.RD0=1
        PORTDbits.RD1=1
        PORTDbits.RD2=1
        }
        INTCONbits.TMR0IF=0; //清TMR0 中斷標志位
        T0CON=0XCF; //設定TMR0L 工作于8 位定時器方式、內部時鐘、TMR0不用分頻
        TMR0L=0X14; //設定TMR0 每0.25ms 產生一次中斷
        L1: if(INTCONbits.TMR0IF==1)
        {
        INTCONbits.TMR0IF==0; //清TMR0 中斷標志位,關計時器
        T0CON=0X4F;
        t++
        }
        else goto L1;
        if(t=4)
        PORTDbits.RD0=0; //脈沖寬度為:1ms
        else if(t=6)
        PORTDbits.RD1=0; //脈沖寬度為:1.5ms
        else if(t=8)
        PORTDbits.RD2=0; //脈沖寬度為:2ms
        else(t=80)
        t=0; //脈沖周期為:0.25ms*80=20ms



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 麟游县| 晋城| 运城市| 宝清县| 湖口县| 宁阳县| 临西县| 巫溪县| 谢通门县| 太仓市| 湖北省| 金坛市| 石棉县| 四子王旗| 无棣县| 洛扎县| 会宁县| 丰原市| 永清县| 绥芬河市| 荣成市| 保德县| 河西区| 维西| 高平市| 马尔康县| 湖南省| 榆树市| 扶风县| 信丰县| 康乐县| 蓬莱市| 门源| 厦门市| 泾源县| 驻马店市| 仁布县| 镇沅| 台安县| 平和县| 龙门县|