智能车制作

标题: 新手,求助!!! [打印本页]

作者: papa2009    时间: 2010-1-8 20:19
标题: 新手,求助!!!
本帖最后由 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,看书上是说用外部时钟算的,搞不懂!!!继续纠结…………
作者: tgnui    时间: 2010-1-8 22:34
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
新手,多担待
作者: papa2009    时间: 2010-1-9 00:25
时钟部分我检验过,好像没有问题……
顺便问一下:
像下面这样将初始化定义为一个子程序,然后在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使能
}
作者: chenrunshe_007    时间: 2010-1-9 01:23
回复 3# papa2009
要实现什么功能兄弟你说清楚啊要不我们怎么帮你看,貌似控制舵机的PWM45你没有使能,怎么能使舵机转呢
作者: papa2009    时间: 2010-1-9 11:38
回复 4# chenrunshe_007


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



我的程序只是简单的实现通过四个按键控制小车的转向和加减速,加减速是可以实现的,但是方向就不行了,当键按下去时舵机有要转向的趋势,但它就是只会在那里不停的振而不转,貌似程序每次for循环一次后又会把初始定义的PWMDTY值赋回去……
作者: zhug    时间: 2010-4-24 01:05
fclock 是16M,fbus=1/2fpll.
作者: wangweijun    时间: 2010-4-24 09:17

作者: Bloodfeather    时间: 2010-7-6 16:25
oscclk =???我也是新手




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2