智能车制作

标题: 急急急急急急急急急急急!!新手求助!!!!!!大虾们快来看看啊!!!!! [打印本页]

作者: longforljy    时间: 2010-1-10 12:30
标题: 急急急急急急急急急急急!!新手求助!!!!!!大虾们快来看看啊!!!!!

硬件平台:MC9S12XS128 80QFP封装

软件平台:codewarrier v4.7以上版本

要求:


1.
将总线时钟(BUSCLOCK)设置为40M.


2.PWM
输出使能。通道01级联,频率100hz



通道23级联,频率10khz



通道45级联,频率10khz


3.
使能16位脉冲累加器,对PT7口计数.


4.
启用实时中断RTI,设置周期为10.24ms


5.
启用模数计数器,并实现自定义的时钟变量1s自增1.

说明:最好每一段程序都注释上自己的理解,尽量实现上述功能。



这个是要求.先说明,并不是我想偷懒或者取巧.由于1月10号,就是今天要交了,实在没办法.有人会问之前我忙什么去了.这里我再解释一下,因为之前第一次使用51系列的单片机参加了学院的一次小车比赛,而比赛是在1月2号,我很认真的完成了这次比赛,并获得了好成绩.之后1月2号到现在都是忙着期末考试啦.学院实在是太没人性了,希望大虾们帮帮忙啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我考完事后一定会认真学习这款单片机的,我不会浪费大虾们的帮助的!!!谢谢了
作者: lim1t    时间: 2010-1-10 12:30
  1. void InitBusCLK_40M(void)
  2. {   
  3.     CLKSEL=0X00;    //disengage PLL to system
  4.     PLLCTL_PLLON=1;   //turn on PLL
  5.     SYNR =0xc0 | 0x04;                        
  6.     REFDV=0xc0 | 0x01;
  7.     POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
  8.     _asm(nop);          //BUS CLOCK=pll clock/2=40M
  9.     _asm(nop);
  10.     while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
  11.     CLKSEL_PLLSEL =1;          //engage PLL to system;
  12. }

  13. void InitPWM(void){
  14.     PWME=0x00;//PWM禁止
  15.     PWMCTL=0xf0;//PWM通道级连,PWM1、PWM3、PWM5、PWM7为对应16bPWM输出
  16.     PWMPOL=0xaa;//对应通道输出
  17.     PWMCAE=0x00;//输出波形左对齐
  18.     PWMPRCLK=0x21;//CLOCKA=40MHZ/2=20MHZ,CLOCKB=40MHZ/4=10MHZ
  19.     PWMSCLB=0x5;//CLOCKSB=CLOCKB/(2*5)=1MHZ
  20.     PWMCLK=0x08;//PWM1、PWM5选择CLOCKA,PWM3选择CLOCKSB,PWM7选择CLOCKB
  21.     PWMPER01=MotorCyc;// 马达PWM周期
  22.     PWMPER45=MotorCyc;// 马达PWM周期
  23.     PWMPER23=RudderCyc;//舵机PWM周期         
  24.     //设置马达初始空比,实时占空比由速度控制函数输出设置
  25.     PWMDTY01=0;   //MotorOUT1;
  26.     PWMDTY45=0;   //MotorOUT2;
  27.     //设置舵机初始占空比,舵机摆正,实时占空比由方向控制函数输出设置
  28.     PWMDTY23=MiddleAngle;
  29.     //PWMSDN=0x00;//PWM紧急关段初始设置
  30.     PWME_PWME1=0;//PWM1通道使能
  31.     PWME_PWME5=0;//PWM5通道使能
  32.     PWME_PWME3=1;//PWM3通道使能
  33. }


  34. //-----------------------------------------------------------
  35. //脉冲累加器初始化函数,测速编码输入到PT7**
  36. //-----------------------------------------------------------
  37. void  InitPulesA(void){
  38.   PACTL=0x50;// 脉冲累加器使能,事件计数模式,上升沿计数,中断禁止
  39. }


  40. //------------------------------------------------------------
  41. //初始化实时中断RTI,时间T=100MS,F=16MHZ/(1.6*10^6)
  42. //------------------------------------------------------------
  43. void InitRTI(void) {
  44.     RTICTL=0xef;
  45.     CRGINT_RTIE=1;
  46. }


  47. void MDCInit()
  48. {
  49.   MCCTL = MCCTL&0xfb;//模数计数器禁止运行
  50.   MCCTL = 0xe1;       //允许中断,模数计数方式 分频常数为4  
  51.   MCCTL = MCCTL|0X04;
  52.   MCCNT = 25*nF; //(1/25M)*100*nF =4us*nF
  53.   MCCTL = MCCTL|0x08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
  54. }
复制代码
都是自己用的,有点乱,跟你要求的有点出入,不过修改下应该能用的。

另外提醒下,PWM做初始化的时候,几个通道的clock不一定相同的。

bus clock、clockA、clockB、clocksB,所以级联的时候要考虑好。
作者: shangshu    时间: 2010-1-10 15:04

作者: lim1t    时间: 2010-1-10 15:16
回复 3# shangshu


    哈哈哈,shangshu你知不知道这样有灌水的嫌疑。。。
作者: xinxinms    时间: 2010-1-10 15:21
LZ作弊。。。
作者: shangshu    时间: 2010-1-10 15:22
如果这样有嫌疑的话,就把表情取消了撒。表情也代表一种想法。
作者: lim1t    时间: 2010-1-10 15:28
你的板子测试得如何了。能用不。
作者: longforljy    时间: 2010-1-10 19:46
晕...怎么直接点别人回复框下面的回复按钮回复的时候,看不见的....哪里去了
作者: longforljy    时间: 2010-1-10 19:47
话说这个悬赏怎么给的?...
作者: longforljy    时间: 2010-1-10 19:49
今天晚上有空的话我想还是得自己看看,稍微修改下源代码...要不肯定一下子就被揭穿
作者: lim1t    时间: 2010-1-10 20:16
其实初始化代码都是差不多的,搞懂寄存器的作用和奏效就行了,同学加油。
作者: lxiongh    时间: 2010-1-10 20:57
已经揭穿
作者: xinxinms    时间: 2010-1-10 21:03
揭穿+1
作者: longforljy    时间: 2010-1-11 00:48
努力ing
作者: longforljy    时间: 2010-1-11 02:43
搞了一个晚上,还是搞不掂...

// PLL初始化子程序   BUS Clock=40M
void setbusclock(void)
{   
    CLKSEL=0X00;    //disengage PLL to system
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR=4;         
    REFDV=1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
    _asm(nop);          //BUS CLOCK=40M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;          //engage PLL to system;
}
//PWM
void InitPWM(void)
{
    PWME=0x00;//PWM输出禁止
    PWMCTL=0xf0;//高八位置1,PWM通道级连,PWM1、PWM3、PWM5、PWM7为对应16bPWM输出
    PWMPOL=0xaa;//对应通道输出
    PWMCAE=0x00;//输出波形左对齐,即从周期原点开始计时
   
    PWMPRCLK=0x44;//预分频  CLOCKA=40MHZ/16=2.5MHZ,CLOCKB=40MHZ/16=2.5MHZ
   
    PWMSCLA=0x64;//CLOCKSA=CLOCKA/(2*100)=12.5kHZ
    PWMSCLB=0x64;//CLOCKSB=CLOCKB/(2*100)=12.5kHZ
    //0,1要求是100hz,则输出频率=时钟频率/(x+1)=100hz,得x=124,换成16进制0x7c
    PWMPER1=0x7c;
    //3,5要求是10khz,得x=249,即0xF9,7不做要求
    PWMPER3=0xF9;
    PWMPER5=0xF9;
    PWMCLK=0x82;//PWM1选择CLOCKSA,PWM5选择CLOCKA,PWM3选择CLOCKB,PWM7选择CLOCKSB        
    PWME=0x2a;//1,3,5输出使能
    PACTL=0x50;// 脉冲累加器使能,事件计数模式,上升沿计数,中断禁止      //此处,使能16位脉冲累加器,对PT7口计数.不知道该怎么写

//实时中断RTI
//------------------------------------------------------------
void InitRTI(void)
{
    RTICTL=0x6c;   //时间T=(1/40MHZ)*(12.5*2^15)=10.24ms,12.5取13,所以得T=10.64ms
    CRGINT=0x80;    //开实时中断
}



//模数计数器
void SetMDC(void)
{
      //启用模数计数器,并实现自定义的时钟变量1s自增1.   这个也不怎么懂~~~~大虾们打救
}
作者: longforljy    时间: 2010-1-11 02:44
1.将总线时钟(BUSCLOCK)设置为40M.
   2.PWM输出使能。通道0,1级联,频率100hz;
     通道2,3级联,频率10khz;
     通道4,5级联,频率10khz;
   3.使能16位脉冲累加器,对PT7口计数.
   4.启用实时中断RTI,设置周期为10.24ms
   5.启用模数计数器,并实现自定义的时钟变量1s自增1.

这是要求,补充下

不行了,睡觉哩
作者: 法拉利    时间: 2010-1-11 12:17
参考参考。。。
作者: DEMOK    时间: 2010-1-13 20:57
学习了
作者: yuan    时间: 2010-1-16 13:00
void MDCInit()

{

  MCCTL = MCCTL&0xfb;//模数计数器禁止运行

  MCCTL = 0xe1;       //允许中断,模数计数方式 分频常数为4  

  MCCTL = MCCTL|0X04;

  MCCNT = 25*nF; //(1/25M)*100*nF =4us*nF

  MCCTL = MCCTL|0x08 ; //把模数常数寄存器的值加载到模数计数器FLMC;

}
错了,XS128中不适用
作者: bullybully    时间: 2010-3-16 21:52
谢谢
作者: xiaohaipolang    时间: 2010-3-20 11:51

作者: zczc003    时间: 2010-4-23 21:04
good
作者: sunnylee    时间: 2010-4-24 14:28
看看
作者: kangluoyi    时间: 2010-4-24 15:29
yuuu
作者: 4819142    时间: 2011-3-29 12:08
学习了
作者: wandsq    时间: 2011-3-29 21:52
vb g




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