智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3272|回复: 7
打印 上一主题 下一主题

新手,求助!!!

[复制链接]

9

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
威望
326
贡献
23
兑换币
0
注册时间
2010-1-7
在线时间
37 小时
跳转到指定楼层
1#
发表于 2010-1-8 20:19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 papa2009 于 2010-1-8 20:23 编辑

麻烦各位高手帮小弟看看下面这段代码啊,刚刚入手智能车,不知道为什么程序总无法实现想要的功能,不知道什么问题,纠结了很久啊,谢谢了!


#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

void delayms(int ms)//延时ms毫秒
{
  int i,j;
  for(i=0;i<ms;i++)
  {
    j=3000;
    while(j--);
  }
}

void clkinitial()//超频到24MHz
{
  CLKSEL=0X00;//disengage PLL to system
  PLLCTL_PLLON=1;       
  REFDV=1;//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)=2*8*(2+1)/(1+1)=24MHz
  SYNR=2;
  _asm(nop);
  _asm(nop);
  while(CRGFLG_LOCK==0);//等待直到稳定
  CLKSEL_PLLSEL =1;
}

void IOinitial()
{
  DDRB=0xFF;//二极管发光
  PORTB=0xFF;
  DDRA=0xF0;//高四位输出,33886的端口控制
  PORTA=0xC0;//低四位输入,控制车子运动方向
}
  
void pwminitial()//PWM初始化,通道01,23控制电机,通道45控制舵机
{             
  PWMPOL=0x2A;//通道01,23,45输出波形开始极性为1
  PWMCAE=0x00;//左对齐输出模式   
  PWMCTL=0x70;//通道01,23,45级联
  PWMCLK=0x20;//通道45选择SA为时钟源   
  PWMSCLA=0x04;//通道45时钟SA为3MHz(24/(2*4))
        
  PWMPER01=6000;//设定通道01输出频率(4kHz)
  PWMPER23=6000;//设定通道23输出频率(4kHz)
  PWMDTY23=3000;
  
  PWMPER45=60000;//设定通道45输出频率(50Hz)
  PWMDTY45=4210;  
  PWME=0x2A;//通道01,23使能
}

unsigned char keyscan()//键盘扫描
{
  delayms(10);
  if(PORTA_BIT0==0) return 'l'; // LEFT
  else if(PORTA_BIT1==0) return 'u'; // UP
  else if(PORTA_BIT2==0) return 'd'; // DWON
  else if(PORTA_BIT3==0) return 'r'; // RIGHT
  else return 0xff;
}  
  
void main()
{
  unsigned char keytemp=0,key=0xff;

  clkinitial();
  pwminitial();   
        IOinitial();                                                               
  EnableInterrupts;
   
  for(;;)
  {
    PORTB=~PORTB;

    keytemp=keyscan();
    if(keytemp!=0xff)
      key=keytemp;
    switch(key)
    {
      case 'l':
        if(PWMDTY45>3210)
          PWMDTY45-=20;
        key=0xff;
        break;
      case 'r':
        if(PWMDTY45<5210)
          PWMDTY45+=20;
        key=0xff;
        break;
      case 'u':
        if(PWMDTY01<6000)
          PWMDTY01+=500;
        key=0xff;
        break;
      case 'd':
        if(PWMDTY01>0)
          PWMDTY01-=500;
        key=0xff;
        break;   
      default:
        break;
    }  
    delayms(50);
   
  } /*wait forever */
  /* please make sure that you never leave this function */
}


对了,我的板子是MC9S12DG128B的,上面的晶振写着16MHz,但是在超频时发现好像是要用8MHz来计算PLLCLK,看书上是说用外部时钟算的,搞不懂!!!继续纠结…………

0

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
QQ
威望
188
贡献
20
兑换币
0
注册时间
2009-10-9
在线时间
11 小时
2#
发表于 2010-1-8 22:34:49 | 只看该作者
CLKSEL=0X00;//disengage PLL to system
  PLLCTL_PLLON=1;        
  REFDV=1;//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)=2*      16  *(2+1)/(1+1)=24MHz
  SYNR=2;
貌似不对呀,总线是24吧,书上的例子这样写的,在孙同景老师的Freescale十六位单片机原理及嵌入式开发技术上的例子p57—58
上课锁相环的例子
CLKSEL=0x00;    //禁止PLL
PLLCTL=0xe1;   //PLL电路允许         
SYNR=2;REFDV=1;   //设置倍频参数
PLLCTL=0x60;          //时钟监控禁止
while(0==(CRGFLG&0x08));//等待稳定
CLKSEL=0x80; //选择PLL作为时钟
//若晶振为16M,则PLLCLK=2*16*3/2=48MHz,则总线频率是24MHz
新手,多担待
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
威望
326
贡献
23
兑换币
0
注册时间
2010-1-7
在线时间
37 小时
3#
 楼主| 发表于 2010-1-9 00:25:14 | 只看该作者
时钟部分我检验过,好像没有问题……
顺便问一下:
像下面这样将初始化定义为一个子程序,然后在main函数里调用它后再设置PWMDTY就无法实现吗?
程序跑的时候舵机总是会偏向最右,PWMDTY的数值设置时没错的,放在PWME前就可以实现,在后面就不行了
void pwminitial()//PWM初始化,通道01,23控制电机,通道45控制舵机
{              
  PWMPOL=0x2A;//通道01,23,45输出波形开始极性为1
  PWMCAE=0x00;//左对齐输出模式   
  PWMCTL=0x70;//通道01,23,45级联
  PWMCLK=0x20;//通道45选择SA为时钟源   
  PWMSCLA=0x04;//通道45时钟SA为3MHz(24/(2*4))
        
  PWMPER01=6000;//设定通道01输出频率(4kHz)
  PWMPER23=6000;//设定通道23输出频率(4kHz)
  
  PWMPER45=60000;//设定通道45输出频率(50Hz)
  PWME=0x2A;//通道01,23使能
}
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
4#
发表于 2010-1-9 01:23:38 | 只看该作者
回复 3# papa2009
要实现什么功能兄弟你说清楚啊要不我们怎么帮你看,貌似控制舵机的PWM45你没有使能,怎么能使舵机转呢
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
威望
326
贡献
23
兑换币
0
注册时间
2010-1-7
在线时间
37 小时
5#
 楼主| 发表于 2010-1-9 11:38:48 | 只看该作者
回复 4# chenrunshe_007


    PWME=0x2A;//通道01,23使能
这一句不是使用了吗,注释的时候写少了



我的程序只是简单的实现通过四个按键控制小车的转向和加减速,加减速是可以实现的,但是方向就不行了,当键按下去时舵机有要转向的趋势,但它就是只会在那里不停的振而不转,貌似程序每次for循环一次后又会把初始定义的PWMDTY值赋回去……
回复 支持 反对

使用道具 举报

2

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
685
威望
285
贡献
346
兑换币
14
注册时间
2009-3-11
在线时间
27 小时
6#
发表于 2010-4-24 01:05:14 | 只看该作者
fclock 是16M,fbus=1/2fpll.
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
威望
194
贡献
30
兑换币
0
注册时间
2010-4-2
在线时间
4 小时
7#
发表于 2010-4-24 09:17:55 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
威望
251
贡献
49
兑换币
0
注册时间
2010-7-4
在线时间
4 小时
8#
发表于 2010-7-6 16:25:57 | 只看该作者
oscclk =???我也是新手
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 21:39 , Processed in 0.182449 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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