智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3348|回复: 4
打印 上一主题 下一主题

飞思卡尔光电管 舵机,电机控制程序2

[复制链接]

2

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
444
QQ
威望
232
贡献
212
兑换币
0
注册时间
2010-4-17
在线时间
0 小时
跳转到指定楼层
1#
发表于 2010-4-17 15:22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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

5

主题

127

帖子

0

精华

高级会员

Rank: 4

积分
894
QQ
威望
349
贡献
495
兑换币
0
注册时间
2010-4-7
在线时间
25 小时
2#
发表于 2010-5-7 23:43:23 | 只看该作者
领教
回复 支持 反对

使用道具 举报

9

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1515
QQ
威望
392
贡献
1057
兑换币
0
注册时间
2010-5-4
在线时间
33 小时
3#
发表于 2010-5-8 16:47:03 | 只看该作者
暂时看不懂!呵呵
回复 支持 反对

使用道具 举报

7

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
QQ
威望
348
贡献
128
兑换币
0
注册时间
2010-2-6
在线时间
3 小时
4#
发表于 2010-5-8 17:16:51 | 只看该作者
楼主真好
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
1500
贡献
760
兑换币
525
注册时间
2011-9-7
在线时间
172 小时
5#
发表于 2012-2-17 13:11:07 | 只看该作者
看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 20:10 , Processed in 0.154154 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表