新聞中心

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

飛思卡爾那些事之pwm輸出控制伺服電機(jī)轉(zhuǎn)向

作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
資源:
1、伺服電機(jī)。PWM輸出周期在一定范圍內(nèi),舵機(jī)的轉(zhuǎn)向會和PWM的占空比成正比例關(guān)系。
2、HCS12的PWM輸出。
方案:
1、HCS12中的PWM模塊,通過硬件進(jìn)行PWM輸出。
2、HCS12中的ECT的比較輸出模塊,通過比較輸出進(jìn)行PWM的輸出。
鑒于PWM模塊為輸出PWM專用模塊,通過設(shè)置相應(yīng)寄存器即可實現(xiàn)PWM輸出,簡單方便,而且精確。故選用PWM模塊進(jìn)行PWM輸出。
說明:
1、通過PWM控制舵機(jī)的轉(zhuǎn)角,舵機(jī)接口一般為3根線,黑色地線,紅色為電源線,一般采用4.8V和6V兩種標(biāo)準(zhǔn)。另外一根線為控制信號線。
2、通過級聯(lián)方式實現(xiàn)16位PWM輸出。
3、周期為18MS~20MS即輸出周期為56Hz~50Hz。
4、對齊方式為PWM左對齊方式。
5、輸出極性為起始高電平。
6、脈寬為1100us~1900us不等,實現(xiàn)-45°到45°的轉(zhuǎn)向角。
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。
預(yù)分頻: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、占空比設(shè)置:
左對齊起始輸出高電平:
占空比=[(PWMDTYx+1)/(PWMPERx+1)]*100%
PWMDTYx=占空比*(PWMPERx+1)/100%
根據(jù)公式:
[(PWMDTYx+1)/(PWMPERx+1)]*100%=脈寬寬度/輸出周期*100%
PWMDTYx=(脈寬寬度*PWMPERx)/輸出周期-1
=(脈寬寬度*9999)20000-1

脈寬寬度=旋轉(zhuǎn)角度*(400)/45+1500(us)
通過循環(huán)即可以求出伺服電機(jī)轉(zhuǎn)動角度對應(yīng)的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輸出控制伺服電機(jī)轉(zhuǎn)動
//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初始化設(shè)置
{
PWMPRCLK=0X66;//設(shè)置通道周期
PWMSCLA=0X03;
PWMSCLB=0X03;
PWMCLK=0XFF;

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

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

PWMPER4=PWMPERH;//設(shè)置輸出周期
PWMPER5=PWMPERL;

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

PWMDTY4=PWMDTYH;//設(shè)置脈寬
PWMDTY5=PWMDTYL;

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

EnableInterrupts;
for(;;) {}

}

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


關(guān)鍵詞: 飛思卡爾pwm輸出伺服電

評論


技術(shù)專區(qū)

關(guān)閉