新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 飛思卡爾那些事之pwm輸出控制伺服電機轉向

        飛思卡爾那些事之pwm輸出控制伺服電機轉向

        作者: 時間:2016-11-23 來源:網絡 收藏
        資源:
        1、伺服電機。PWM輸出周期在一定范圍內,舵機的轉向會和PWM的占空比成正比例關系。
        2、HCS12的PWM輸出。
        方案:
        1、HCS12中的PWM模塊,通過硬件進行PWM輸出。
        2、HCS12中的ECT的比較輸出模塊,通過比較輸出進行PWM的輸出。
        鑒于PWM模塊為輸出PWM專用模塊,通過設置相應寄存器即可實現(xiàn)PWM輸出,簡單方便,而且精確。故選用PWM模塊進行PWM輸出。
        說明:
        1、通過PWM控制舵機的轉角,舵機接口一般為3根線,黑色地線,紅色為電源線,一般采用4.8V和6V兩種標準。另外一根線為控制信號線。
        2、通過級聯(lián)方式實現(xiàn)16位PWM輸出。
        3、周期為18MS~20MS即輸出周期為56Hz~50Hz。
        4、對齊方式為PWM左對齊方式。
        5、輸出極性為起始高電平。
        6、脈寬為1100us~1900us不等,實現(xiàn)-45°到45°的轉向角。
        7、通過級聯(lián)方式實現(xiàn)16位PWM輸出。通道PWM45組成通道A。
        8、時鐘源選擇。
        BusBlock:24MHz。
        void pllclk(void) //24MHz
        {
        SYNR=0x02;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
        REFDV=0x01;
        CLKSEL=0x80;//選定PLL時鐘
        }
        9、PWM時鐘。
        通道時鐘周期2us
        輸出周期20MS
        PWM輸出頻率:50Hz。
        預分頻:8分頻3MHz
        PWMPRCLK=0x66
        分頻:6分頻 500kHz
        ClockSX=ClockX/(2*PWMSCLX)
        PWMSCLx=ClockX/ClockSX*2=3M/(500k*2)=3=0x03
        通過兩次分頻可得通道時鐘周期為:100US即10KHZ
        通道A時鐘頻率選擇PWMPRCLK和PWMSCLA;
        通道B時鐘頻率選擇PWMPRCLK和PWMSCLB;
        周期計算公式:
        左對齊方式:
        輸出周期=通道時鐘周期*(PWMPERx+1)
        PWMPERx=輸出周期/通道時鐘周期-1
        =20MS/2us-1
        =9999=0x270f
        10、占空比設置:
        左對齊起始輸出高電平:
        占空比=[(PWMDTYx+1)/(PWMPERx+1)]*100%
        PWMDTYx=占空比*(PWMPERx+1)/100%
        根據公式:
        [(PWMDTYx+1)/(PWMPERx+1)]*100%=脈寬寬度/輸出周期*100%
        PWMDTYx=(脈寬寬度*PWMPERx)/輸出周期-1
        =(脈寬寬度*9999)20000-1

        脈寬寬度=旋轉角度*(400)/45+1500(us)
        通過循環(huán)即可以求出伺服電機轉動角度對應的PWMDTx的值。
        PWMDTYx[28]={859,855,850,846,841,837,832,828,824,819,815,810,806,801,797,792,788,784,779,775,
        770,766,761,757,752,748,744,740,735,731,726,722,717,713,708,704,700,695,691,686,
        682,677,673,668,664,660,655,651,646,642,637}
        求PWMDTYx值的程序如下:
        #include
        void main()
        {
        long int i,X,y;
        X=25;
        for(i=-25;i<=25;i++)
        {
        y=X*(400)/45+1500;
        printf("angle:%3d°pulse:%duscycle:20MSPWMDTYx:%dPWMPERx:9999n",X,y,(int)((9999.0/20000.0)*y)-1);
        X--;
        }
        }

        CODE:
        #include
        #include
        #pragma LINK_INFO DERIVATIVE "mc9s12xs128"

        //===========================================================//
        //16位PWM輸出控制伺服電機轉動
        //author: yangtze
        //time:2009/4/21/
        //===========================================================//
        #define PWMPERx0x270F;
        unsigned int PWMDTYxtable[]={
        0x035b,0x0357,0x0352,0x034e,0x0349,0x0345,
        0x0340,0x033c,0x0338,0x0333,0x032f,0x032a,
        0x0326,0x0321,0x031d,0x0318,0x0314,0x0310,
        0x030b,0x0307,0x0302,0x02fe,0x02f9,0x02f5,
        0x02f0,0x02ec,0x02e8,0x02e4,0x02df,0x02db,
        0x02d6,0x02d2,0x02cd,0x02c9,0x02c4,0x02c0,
        0x02bc,0x02b7,0x02b3,0x02ae,0x02aa,0x02a5,
        0x02a1,0x029c,0x0298,0x0294,0x028f,0x028b,
        0x0286,0x0282,0x027d};
        void pllclk(void)//24MHz
        {
        SYNR=0x02;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
        REFDV=0x01;
        CLKSEL=0x80;//選定PLL時鐘
        }


        void PWMServoMotor_init(void)//PWM初始化設置
        {
        PWMPRCLK=0X66;//設置通道周期
        PWMSCLA=0X03;
        PWMSCLB=0X03;
        PWMCLK=0XFF;

        PWMPOL=0X00;//起始輸出為高電平
        PWMCAE=0X00;//波形左對齊
        PWMCTL=0XFC;//選擇級聯(lián)方式輸出
        }

        void PWM_Pulse(unsigned int PWMPERx,unsigned int PWMDTYx)//PWM輸出周期和占空比設置
        {
        PWMPERH=(PWMPERx>>8)&0X00FF;
        PWMPERL=PWMPERx&0X00FF;

        PWMPER4=PWMPERH;//設置輸出周期
        PWMPER5=PWMPERL;

        PWMDTYH=(PWMDTYx>>8)&0X00FF;
        PWMDTYL=PWMDYx&0X00FF;

        PWMDTY4=PWMDTYH;//設置脈寬
        PWMDTY5=PWMDTYL;

        PWME=0X18;//通道45使能開
        }
        void main(void)
        {
        unsigned int PWMDTYx;
        PWMDTYx=PWMDTYxtable[5];
        pllclk();
        PWMServoMotor_init();
        PWM_Pulse(PWMPERx,PWMDTYx);

        EnableInterrupts;
        for(;;) {}

        }

        //上次編寫直流電機驅動的程序時,本來是用16位的PWM調制,可是最后使用的卻僅僅只是8位的。這次又是在使用PWM模塊,認真的去研究了這個模塊的使用方式,才知道,16位的和8位的最大的區(qū)別不是周期長短或者是占空比大小什么的。事實上位數上的差別,影響影響最大的是調制精度。位數越大,能設定的通道周期越小,這樣在設定的周期和占空比上,就能更精確。而不是之前理解的那樣,能提供更大的輸出周期。


        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 揭西县| 饶平县| 扶余县| 柳江县| 高要市| 沁源县| 苍山县| 达日县| 临泉县| 清新县| 习水县| 鄂尔多斯市| 凤城市| 深圳市| 呈贡县| 乐都县| 延川县| 武山县| 上蔡县| 栾川县| 土默特右旗| 新建县| 岢岚县| 精河县| 襄樊市| 东台市| 临西县| 屏山县| 奉贤区| 陇南市| 南平市| 巴彦淖尔市| 天津市| 宜川县| 饶河县| 大冶市| 镇巴县| 兴隆县| 黎川县| 遂溪县| 慈利县|