飛思卡爾那些事之pwm輸出控制伺服電機(jī)轉(zhuǎn)向
1、伺服電機(jī)。PWM輸出周期在一定范圍內(nèi),舵機(jī)的轉(zhuǎn)向會(huì)和PWM的占空比成正比例關(guān)系。
2、HCS12的PWM輸出。
方案:
1、HCS12中的PWM模塊,通過(guò)硬件進(jìn)行PWM輸出。
2、HCS12中的ECT的比較輸出模塊,通過(guò)比較輸出進(jìn)行PWM的輸出。
鑒于PWM模塊為輸出PWM專用模塊,通過(guò)設(shè)置相應(yīng)寄存器即可實(shí)現(xiàn)PWM輸出,簡(jiǎn)單方便,而且精確。故選用PWM模塊進(jìn)行PWM輸出。
說(shuō)明:
1、通過(guò)PWM控制舵機(jī)的轉(zhuǎn)角,舵機(jī)接口一般為3根線,黑色地線,紅色為電源線,一般采用4.8V和6V兩種標(biāo)準(zhǔn)。另外一根線為控制信號(hào)線。
2、通過(guò)級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。
3、周期為18MS~20MS即輸出周期為56Hz~50Hz。
4、對(duì)齊方式為PWM左對(duì)齊方式。
5、輸出極性為起始高電平。
6、脈寬為1100us~1900us不等,實(shí)現(xiàn)-45°到45°的轉(zhuǎn)向角。
7、通過(guò)級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。通道PWM45組成通道A。
8、時(shí)鐘源選擇。
BusBlock:24MHz。
void pllclk(void) //24MHz
{
SYNR=0x02; //PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
REFDV=0x01;
CLKSEL=0x80; //選定PLL時(shí)鐘
}
9、PWM時(shí)鐘。
通道時(shí)鐘周期2us
輸出周期20MS
PWM輸出頻率:50Hz。
預(yù)分頻:8分頻 3MHz
PWMPRCLK=0x66
分頻:6分頻 500kHz
ClockSX=ClockX/(2*PWMSCLX)
PWMSCLx=ClockX/ClockSX*2=3M/(500k*2)=3=0x03
通過(guò)兩次分頻可得通道時(shí)鐘周期為:100US即10KHZ
通道A時(shí)鐘頻率選擇PWMPRCLK和PWMSCLA;
通道B時(shí)鐘頻率選擇PWMPRCLK和PWMSCLB;
周期計(jì)算公式:
左對(duì)齊方式:
輸出周期=通道時(shí)鐘周期*(PWMPERx+1)
PWMPERx=輸出周期/通道時(shí)鐘周期-1
=20MS/2us-1
=9999=0x270f
10、占空比設(shè)置:
左對(duì)齊起始輸出高電平:
占空比=[(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)
通過(guò)循環(huán)即可以求出伺服電機(jī)轉(zhuǎn)動(dòng)角度對(duì)應(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:%dus cycle:20MS PWMDTYx:%d PWMPERx:9999n",X,y,(int)((9999.0/20000.0)*y)-1);
X--;
}
}
CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//===========================================================//
//16位PWM輸出控制伺服電機(jī)轉(zhuǎn)動(dòng)
//author: yangtze
//time:2009/4/21/
//===========================================================//
#define PWMPERx 0x270F;
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時(shí)鐘
}
void PWMServoMotor_init(void)//PWM初始化設(shè)置
{
PWMPRCLK=0X66;//設(shè)置通道周期
PWMSCLA=0X03;
PWMSCLB=0X03;
PWMCLK=0XFF;
PWMPOL=0X00;//起始輸出為高電平
PWMCAE=0X00;//波形左對(duì)齊
PWMCTL=0XFC;//選擇級(jí)聯(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使能開(kāi)
}
void main(void)
{
unsigned int PWMDTYx;
PWMDTYx=PWMDTYxtable[5];
pllclk();
PWMServoMotor_init();
PWM_Pulse(PWMPERx,PWMDTYx);
EnableInterrupts;
for(;;) {}
}
//上次編寫(xiě)直流電機(jī)驅(qū)動(dòng)的程序時(shí),本來(lái)是用16位的PWM調(diào)制,可是最后使用的卻僅僅只是8位的。這次又是在使用PWM模塊,認(rèn)真的去研究了這個(gè)模塊的使用方式,才知道,16位的和8位的最大的區(qū)別不是周期長(zhǎng)短或者是占空比大小什么的。事實(shí)上位數(shù)上的差別,影響影響最大的是調(diào)制精度。位數(shù)越大,能設(shè)定的通道周期越小,這樣在設(shè)定的周期和占空比上,就能更精確。而不是之前理解的那樣,能提供更大的輸出周期。
2、HCS12的PWM輸出。
方案:
1、HCS12中的PWM模塊,通過(guò)硬件進(jìn)行PWM輸出。
2、HCS12中的ECT的比較輸出模塊,通過(guò)比較輸出進(jìn)行PWM的輸出。
鑒于PWM模塊為輸出PWM專用模塊,通過(guò)設(shè)置相應(yīng)寄存器即可實(shí)現(xiàn)PWM輸出,簡(jiǎn)單方便,而且精確。故選用PWM模塊進(jìn)行PWM輸出。
說(shuō)明:
1、通過(guò)PWM控制舵機(jī)的轉(zhuǎn)角,舵機(jī)接口一般為3根線,黑色地線,紅色為電源線,一般采用4.8V和6V兩種標(biāo)準(zhǔn)。另外一根線為控制信號(hào)線。
2、通過(guò)級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。
3、周期為18MS~20MS即輸出周期為56Hz~50Hz。
4、對(duì)齊方式為PWM左對(duì)齊方式。
5、輸出極性為起始高電平。
6、脈寬為1100us~1900us不等,實(shí)現(xiàn)-45°到45°的轉(zhuǎn)向角。
7、通過(guò)級(jí)聯(lián)方式實(shí)現(xiàn)16位PWM輸出。通道PWM45組成通道A。
8、時(shí)鐘源選擇。
9、PWM時(shí)鐘。
10、占空比設(shè)置:
根據(jù)公式:
[(PWMDTYx+1)/(PWMPERx+1)]*100%=脈寬寬度/輸出周期*100%
脈寬寬度=旋轉(zhuǎn)角度*(400)/45+1500
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++)
{
}
}
CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//===========================================================//
//16位PWM輸出控制伺服電機(jī)轉(zhuǎn)動(dòng)
//author: yangtze
//time:2009/4/21/
//===========================================================//
#define PWMPERx
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
{
}
void PWMServoMotor_init(void)//PWM初始化設(shè)置
{
}
void PWM_Pulse(unsigned int PWMPERx,unsigned int PWMDTYx)//PWM輸出周期和占空比設(shè)置
{
}
void main(void)
{
}
評(píng)論