智能车制作
标题:
飞思卡尔光电管 舵机,电机控制程序2
[打印本页]
作者:
chensmake
时间:
2010-4-17 15:22
标题:
飞思卡尔光电管 舵机,电机控制程序2
本帖最后由 chensmake 于 2010-4-17 15:27 编辑
//延时查询表 6*6
static UNIT DelayTable[]=
{
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
}
void PWMInit() //32HHz
{
PWMCTL_CON01= 1; //0, 1合为16bit
PWMCAE_CAE1= 1; //Center mode
PWMCLK_PLCK1= 0; //Clock A
PWMPRCLK_PCKA= 5; //Clock A= 32MHz/32= 1MHz
PWMPOL_PPOL1= 0; //开始为低电压
PWMPER0,1= 10000; //50Hz PWM输出
PWMDTY0,1= MIDDLE; //(10000- 750)* 100%= 92。5%占空比,1.5ms高电压时间
PWME_PWME1= 1; //enable
}
static void delay(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<2770;jj++); //32MHz--1ms
}
static void SetPWM(UINT m_nPWM) //PWM设置
{
PWMDTY0,1= m_nPWM;
}
//number 9种情况,sub 7种情况,LeftRight 2中情况
//共128种情况,采用模糊控制暂时归纳为11种情况
//11种情况将填入表中提供查询,11中情况分别为:
//左右5, 15, 30, 45, 60度
//和正中间0度
static UINT GetPWM(UCHAR number, UINT sub, UCHAR LeftRight)
{
switch(sub) //通过sub算出索引值
{
case 0x8000- 0x0100:
case 0x0100- 0x0001;
case 0x0100- 0x0002;
sub= 0;
break;
case 0x4000- 0x0100:
case 0x0100- 0x0004:
sub= 1;
break;
case 0x2000- 0x0100:
case 0x0100- 0x0008:
sub= 2;
break;
case 0x1000- 0x0100:
case 0x0100- 0x0010:
sub= 3;
break;
case 0x0800- 0x0100:
case 0x0100- 0x0020:
sub= 4;
break;
case 0x0400- 0x0100:
case 0x0100- 0x0040:
sub= 5;
break;
case 0x0200- 0x0100:
case 0x0100- 0x0100:
case 0x0100- 0x0080:
sub= 6;
break;
}
return PWMTable[number+ sub* 10+ LeftRight* 70];
}
//通过m_nPWM来改变速度,并返回改变的值
static UINT ChangeSpeed(UINT m_nPWM)
{
UINT m_nSpeed;
switch(m_nPWM) //根据m_nPWM 调节速度
{
case LEFT60:
Speed(SPEED60);
m_nSpeed= SPEED60;
break;
case LEFT45:
Speed(SPEED45);
m_nSpeed= SPEED45;
break;
case LEFT30:
Speed(SPEED30);
m_nSpeed= SPEED30;
break;
case LEFT15:
Speed(SPEED15);
m_nSpeed= SPEED15;
break;
case LEFT5:
Speed(SPEED5);
m_nSpeed= SPEED5;
break;
case MIDDLE:
Speed(SPEED0);
m_nSpeed= SPEED0;
break;
case RIGHT60:
Speed(SPEED60);
m_nSpeed= SPEED60;
break;
case RIGHT45:
Speed(SPEED45);
m_nSpeed= SPEED45;
break;
case RIGHT30:
Speed(SPEED30);
m_nSpeed= SPEED30;
break;
case RIGHT15:
Speed(SPEED15);
m_nSpeed= SPEED15;
break;
case RIGHT5:
Speed(SPEED5);
m_nSpeed= SPEED5;
break;
}
return m_nSpeed;
}
//获得查表时的索引值
UINT GetIndex(UINT m_nSpeed)
{
if(m_nSpeed<= SPEED60)
{
m_nSpeed= 0;
}
else if(m_nSpeed<= SPEED45)
{
m_nSpeed= 1;
}
else if(m_nSpeed<= SPEED30)
{
m_nSpeed= 2;
}
else if(m_nSpeed<= SPEED15)
{
m_nSpeed= 3;
}
else if(m_nSpeed<= SPEED5)
{
m_nSpeed= 4;
}
else
{
m_nSpeed= 5;
}
return m_nSpeed;
}
//m_nSpeed2为欲设值
//m_nSpeed为当前速度
UINT GetDelay(UINT m_nSpeed, UINT m_nSpeed2)
{
m_nSpeed= GetIndex(m_nSpeed);
m_nSpeed2= GetIndex(m_nSpeed2);
return DelayTable[m_nSpeed* 6+ m_nSpeed2];
}
void Turn(UCHAR number, UINT sub, UCHAR LeftRight, UCHAR ret)//ret not be used now
{
UINT m_nPWM;
UINT m_nSpeed;
UINT m_nSpeed2;
UINT m_nDelay; //延时参数
m_nPWM= GetPWM(number, sub, LeftRight);
m_nSpeed= GetSpeed() //测速模块
m_nSpeed2= ChangeSpeed(m_nPWM);
if(m_nSpeed2> m_nSpeed)
m_nSpeed= m_nSpeed2- m_nSpeed;
else
m_nSpeed= m_nSpeed- m_nSpeed2;
SetPWM(m_nPWM); //转角
m_nDelay= GetDelay(m_nSpeed, m_nSpeed2);
delay(m_nDelay); //根据速度和角度延时
SetPWM(MIDDLE); //舵机摆正
}
转载于:
http://zhidao.baidu.com/question/90016084.html?si=1
作者:
星雨
时间:
2010-5-7 23:43
领教
作者:
安杰
时间:
2010-5-8 16:47
暂时看不懂!呵呵
作者:
嗷嗷疯
时间:
2010-5-8 17:16
楼主真好
作者:
龙游天下明
时间:
2012-2-17 13:11
看不懂
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2