MC9S12XS128 16位PWM 电…

来源:互联网 发布:tensorflow中文版文档 编辑:程序博客网 时间:2024/06/01 09:10

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;    //disengagePLL to system
   PLLCTL_PLLON=1;   //turnon 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 is80MHz/8=10000kHz 2分频得到Clock B is 80MHz/2=40000kHz
  PWMCTL=0x30;  //0 1 和 2 3 通道级联成16位PWM通道 引脚PP1 PP3
  PWMSCLA=0X05;  //对Clock A5*2分频,时钟SA为80M/8/5/2=1000kHz
  PWMSCLB=0X02;  //对Clock B2*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  PP1PP3引脚
  
}



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();
             
                
}

 

0 0