您的位置 首页 技术

飞思卡尔那些事之pwm输出操控伺服电机转向

资源:1、伺服电机。PWM输出周期在一定范围内,舵机的转向会和PWM的占空比成正比例关系。2、HCS12的PWM输出。方案:1、HCS12中的PWM模块,

资源:

1、伺服电机。PWM输出周期在必定范围内,舵机的转向会和PWM的占空比成正比例联系。
2、HCS12的PWM输出。
计划:
1、HCS12中的PWM模块,经过硬件进行PWM输出。
2、HCS12中的ECT的比较输出模块,经过比较输出进行PWM的输出。
鉴于PWM模块为输出PWM专用模块,经过设置相应寄存器即可完成PWM输出,简略便利,并且准确。故选用PWM模块进行PWM输出。
阐明:
1、经过PWM操控舵机的转角,舵机接口一般为3根线,黑色地线,赤色为电源线,一般选用4.8V和6V两种规范。别的一根线为操控信号线。
2、经过级联方法完成16位PWM输出。
3、周期为18MS~20MS即输出周期为56Hz~50Hz。
4、对齐方法为PWM左对齐方法。
5、输出极性为开始高电平。
6、脉宽为1100us~1900us不等,完成-45°到45°的转向角。
7、经过级联方法完成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)
经过循环即可以求出伺服电机滚动视点对应的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;//挑选级联方法输出
}

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位的最大的差异不是周期长短或者是占空比巨细什么的。现实上位数上的不同,影响影响最大的是调制精度。位数越大,能设定的通道周期越小,这样在设定的周期和占空比上,就能更准确。而不是之前了解的那样,能供给更大的输出周期。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/261101.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部