智能车制作

标题: 飞思卡尔 [打印本页]

作者: huhuiru88    时间: 2010-5-6 20:38
标题: 飞思卡尔
百度空间 | 百度首页 | 登录 奋斗编程学习不是一时半会儿就能学会的,需要努力,需要理解。 主页博客相册|个人档案 |好友   查看文章   
XS128初始化参考方案2010-02-03 20:45#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#include "Hard.h"
//----------------------XS128 PLL初始化函数--------------------------------*
//功 能:                                                                  *
//    芯片初始化设置:通过设置CLKSEL寄存器,确定内部总线的时钟源;通过PLL编 *
//    程,设置PLLCLK;通过设置INTCR和COPCTL寄存器,分别决定是否允许IRQ中断和 *
//    看门狗。                                                             *
//    (1)外部晶振=16MHZ BusClock=40MHZ                                     *
//    (3)禁止看门狗                                                        *
//参 数:无                                                                *
//返 回:无                                                                *
//-------------------------------------------------------------------------*
//定义波特率Bt=14400,SCI0BD=fBUS/(16*Bt)
static void PLL_Init(void)
{   
    //(2)CLKSEL的第7位置0,选择系统时钟源为OSCCLK
    //在PLL程序执行前,内部总线频率=OSCCLK/2
    //clksel.7(PLL选择位)决定内部总线时钟来源
    //=O,BusClock=OSCCLK/2; =1,BusClock=PLLCLK/2
    CLKSEL &= 0x7f;      //此时:BusClock=OSCCLK/2
    //(3)禁止PLL
    PLLCTL &= 0xbf;//PLLCTL.6(pllon)设为0;先关闭PLL              
    //(4)根据需要的时钟频率设置SYNR和REFDV寄存器
    //计算公式LLCLK=2*OSCCLK*((SYNR+1)/(REFDV+1))
    SYNR = 0x04;         //对PLLCLK增频的因子
    REFDV = 0x01;        //对PLLCLK分频的因子
        
    //(5)打开PLL                                                
    PLLCTL |= (1<<6);    //PLLCTL.6(pllon)设为1;开PLL
    //(6)通过判断CRGFLG寄存器的LOCK位,确定PLL是否稳定
    while ((CRGFLG&0x08) == 0x00);
    //(7)时钟频率稳定后,允许锁相环时钟源作为系统时钟源;
    CLKSEL |= (1<<7);    //本句执行后:BusClock=PLLCLK/2
    //(8)设置是否允许IRQ中断、是否允许看门狗
    IRQCR &= 0xbf;       //IRQCR.6(IRQEN) =0禁止IRQ中断(默认开)
    COPCTL = 0x00;       //COPCTL.2-0(cr2:cr0) =000禁止看门狗
}
void IOInit(){
//DDRB = 0xff;    //测试用的IO口
// PORTB = 0x0f;
DDRH = 0xcf;   //NRF24L01无线发送端口占用低6位
DDRM |= 0x03; //PM0、1口控制电机
PTM |= 0x03;    //初始时,电机停止转动
//A0 = 0, A1 = 1 直流电机倒转
//A0 = 1, A1 = 0 直流电机正转
}
/*****************************************************
功能:未级联时直接选择PP3作为控制舵机的口,级联后,需要
      改为PP3口作为舵机控制口。
最好的方案:选择23口级联
******************************************************/
void PwmInit(void)
{
PWME=0X00;           //禁止PWM输出
PWMCTL_CON23 = 1;      //通道2,3级联
PWMCAE_CAE3 = 0;       //左对齐
PWMPOL_PPOL3 = 1;      //PWM输出起始为高电平
PWMPRCLK = 0X00;       //ClockB不分频
PWMSCLB = 0X05;        //ClockSB=fbus/10 ClockSB为4MHZ
PWMCLK_PCLK3 = 1;      //时钟来源选择ClockSB
PWMPER23 = 40000;      //输出周期=(1/4M)*(40000) =10ms
PWMDTY23 = 5950;       //高电平持续时间1.5ms,使舵机输出转角为0,舵机处于正中间
PWME_PWME3 = 1;        //启动PWM输出
}
/*****************************************************
功能:直流电机速度端口初始化
端口:PTP1口,方向端口:PTM0 1
******************************************************/
void MOTOR_PWM_Init(void){
PWMCTL_CON01 = 1;      //通道01级联
PWMCAE_CAE1 = 0;       //左对齐
PWMPOL_PPOL1 = 1;      //PWM输出起始为高电平
PWMPRCLK = 0X00;       //ClockA不分频
PWMSCLA = 0X01;        //ClockSA=fbus/4 ClockSA为10MHZ
PWMCLK_PCLK1 = 1;      //时钟来源选择ClockSA
PWMPER01 = 10000;       //输出周期=(1/10M)*(10000) =1ms
PWMDTY01 = 3000;//高电平时间325us //启动速度 调试时待改
PWME_PWME1 = 1;        //启动PWM输出
}
/*****************************************************
功能:传感器检测路面信息初始化
占用端口:原ATD转换多用口,作为普通IO口使用时需设ATD0DIEN为全1.
******************************************************/
void SeniorInit(){
DDR01AD0 &= 0xf000; //光电传感器借PAD0~PAD11口
                      //占PAD0低8位,占PAD0H口低三位
PT01AD0 = 0x0000;   //初始给端口低电平
ATD0DIEN = 0xffff; //普通IO使能
}
/*****************************************************
功能:时基中断初始化,实现5ms中断
这次使用:中断里500ms进行一次测速。
******************************************************/
void initPIT(void)
{
    PITCFLMT_PITE=0; //定时中断通道0关
    PITCE_PCE0=1;//定时器通道0使能
    PITMTLD0=40-1;//8位定时器初值设定。40分频,在40MHzBusClock下,为1MHz。即 1us.
    PITLD0=PITTIME-1;//16位定时器初值设定。PITTIME*0.001MS
    PITINTE_PINTE0=1;//定时器中断通道0中断使能
    PITCFLMT_PITE=1;//定时器通道0使能
}
/*****************************************************
功能:脉冲累加器初始化,实现脉冲测速。
端口使用:PTT7口,电路接法:需要上拉电阻5.1千欧姆
******************************************************/
void initPACA(void)//初始化脉冲累加器A
{
PACTL=0x50;     //PT7上升沿脉冲计数
PACNT =0x00;    //累加器置初值
}
/*****************************************************
功能:硬件初始化,包括以上各初始化
所有初始化都要在这里进行
******************************************************/
void HardInit() {
DisableInterrupts;//关闭中断
IOInit();//IO初始化
SeniorInit();//传感器设置
PLL_Init();//总线时钟设置
initPIT(); //定时中断
initPACA();//脉冲累加器中断
PwmInit(); //舵机初始化
MOTOR_PWM_Init();//控制直流电机
nRF24L01_Initial();//nRF2401初始化
EnableInterrupts;
}
作者: 海军10291147    时间: 2012-2-13 20:56
谢谢
作者: Solemn胜威    时间: 2012-2-20 16:39
你这个里面用到了NRF24L01,能给个NRF24L01的具体程序吗?谢谢




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