MC9S12XS128 16位PWM 电…

2019-04-14 12:35发布

Designed by 袁思远
E-mail:fantasy_ysy@163.com 
最后更新:2012年10月29日           
相关信息参考下列地址:
博客:  http://blog.163.com/fantasy_ysy/
本程序主要包括以下功能:
1. 设置系统工作在80MHZ 总线时钟
2. 电机控制  PP3引脚   10K
3. 舵机控制  PP1引脚   20ms
3. 测速      PT7       脉冲计数 
4. 产生周期10ms的中断
unsigned int PAnum;

void SetBusCLK_80M(void)
{   
    CLKSEL=0X00;    //disengage PLL to system
    PLLCTL_PLLON=1;   //turn on PLL
    SYNR =0xc0 | 0x09;                        
    REFDV=0x80 | 0x01; 
    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
    _asm(nop);          //BUS CLOCK=80M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;          //engage PLL to system; 
}
void PWMcsh(void) 
{
  
  PWMPOL=0X0a;   //通道 1 3 输出波形开始极性为1
  PWMCAE=0x00;   //左对齐输出模式
  PWMCLK=0X0a;   //PWM通道1时钟源为 SAClock 通道3时钟源为 SBClock
  PWMPRCLK=0X13; //总线时钟8分频得到Clock A is 80MHz/8=10000kHz 2分频得到Clock B is 80MHz/2=40000kHz
  PWMCTL=0x30;   //0 1 和 2 3 通道级联成16位PWM通道 引脚PP1 PP3
  PWMSCLA=0X05;  //对Clock A 5*2分频,时钟SA为80M/8/5/2=1000kHz
  PWMSCLB=0X02;  //对Clock B 2*2分频,时钟SB为80M/2/2/2=10000kHz
  
  PWMPER0=0X4e;  //周期因数高8位   0x4e20 = 20000
  PWMPER1=0X20;  //周期因数低8位,输出周期=通道时钟周期*20000,即频率=1000k/20k=50Hz, 即周期为20ms
  
  PWMPER2=0X03;  //周期因数高8位   0x03e8 = 1000
  PWMPER3=0Xe8;  //周期因数低8位,输出周期=通道时钟周期*1000,即频率=10000k/1000=10k PWMDTY01=1550;   //占空比    1550/20000   零点
  
  PWMDTY23=320;    //占空比    320/1000
  
  PWME=0X0a;     //通道 1 3 使能 enable pwm channel 1 3  PP1 PP3引脚
  
}

void PAInit(void)
 
   PACNT=0x0000;          //设置脉冲累加器计数寄存器初始值为0
   PACTL=0x40;          //使能 计数模式 下降沿计数 禁止中断  禁止定时器不影响脉冲累加器计数功能的使用
   
}
void PIT_Init(void)
{
    PITCFLMT = 0x00;    //禁止PIT模块
    PITCE_PCE0 = 1;     //使能定时器通道0
    PITMUX = 0x00;      //定时器通道0使用Base Timer0(微定时基准0)
    PITMTLD0 = 0xff;    //设置8位微定时装载寄存器0初值(8位计数器初值)
    PITLD0 = 0xC34;    //设置16位装载寄存器0初值(16位计数器初值)
                        //定时周期=($PITMTLD0+1)*($PITLD0+1)*(1/fbus)
                        //        =256*3125/80000000
                        //        =0.01s = 10ms
    PITINTE = 0x01;     //使能PIT定时器通道0中断
    PITCFLMT = 0x80;    //使能PIT模块 }
#pragma CODE_SEG __NEAR_SEG NON_BANKED
//void interrupt 66 PIT_ISR(void)
void interrupt VectorNumber_Vpit0 PIT_ISR(void)
{   
   PITTF_PTF0 = 1;               //清中断标志 PAnum=PACNT;     //读脉冲计数
   PACNT=0;         //设置脉冲累加器计数寄存器初始值为0 
 //  PTM=~PTM;
} 
#pragma CODE_SEG DEFAULT

void delay( int aa)
{
   int ii,jj,kk;
   for(ii=aa;ii>0;ii--)
   {
   for(jj=300;jj>0;jj--)
   for(kk=30;kk>0;kk--);
   }
}
void main(void) 
{ 
  EnableInterrupts;
  SetBusCLK_80M();
  PWMcsh(); 
  PIT_Init();
  PAInit();
  
  DDRM = 0x03;     //PM0引脚作为输出
  PTM = 0x00;      // PM0引脚为0
 
  for(;;) 
  {
     PTM=0x01;
     delay(330);
     
     PTM=0x00;
     delay(330);
  
    //_FEED_COP();
  }             
                
}