⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 使用MC9S12DG128芯片
💻 C
字号:
//pwm
 
#include "includes.h"

/*******************************************************************
display the choice of pwm channel
"have Pwm Channel"
" 1,01 2,23 3,45
*******************************************************************/

INT8U iMenuPWM[] = {"Have Pwm Channel 1.01 2.23 3.45 "};

 
                      
/********************************************************************
the PWM of Function
You can choice the one of PWMs,decide the  cycle and duty.

********************************************************************/ 
void PWM_Func (void) {
      
     for(;;) {
      
      LcdWriteAll(iMenuPWM);        //display PWM menu
      
      while (KeyFlag == ON) {
        
         KeyFlag = OFF;
        
        if (ValueKey == Enter){InputPwmValue();} 
        
        else if (ValueKey == Exit) return;    //if have exit key,go back
        
       }
      
     }
  
}

/***********************************************************************

***********************************************************************/

void InputPwmValue(void) {

 INT8U flag = ON;
 
 INT8U i=0; 
 
 INT8U DesignPwm[] = {"Channel: ,Period:  ms,Duty:  %  "};
 
 INT8U PwmData[5] = {0,0,0,0,0};
 
  
 while (flag == ON) {
 
  
     LcdWriteAll(DesignPwm);
     
     DesignPwm[8] = (PwmData[0]+0x30);    //change x to 'x' 
     
     
     DesignPwm[17] = (PwmData[1]+0x30);
     
     DesignPwm[18] = (PwmData[2]+0x30);
     
     DesignPwm[27] = (PwmData[3]+0x30);
     
     DesignPwm[28] = (PwmData[4]+0x30);
     
     while (KeyFlag == ON) {
      
      KeyFlag = OFF;
      
      if ((ValueKey>=0)&&(ValueKey<=9)) {PwmData[i] = ValueKey;i++;} 
      
      else if (ValueKey == Exit) {return;} 
      
      else if (ValueKey == Enter) {flag = OFF;} 
      
      else if (ValueKey == reset) {StopPWM01();StopPWM23();StopPWM45();}
      
   }
 
 }
 
 
 switch (PwmData[0]) {
 
  case 1 :
          InitPWM01();
          
          SetPWM01((PwmData[1]*10000+PwmData[2]*1000),((PwmData[1]*10000+PwmData[2]*1000)/100*(PwmData[3]*10+PwmData[4])));
          
          StartPWM01();
          
          break;
          
  case 2 :
  
          InitPWM23();
          
          SetPWM23((PwmData[1]*10000+PwmData[2]*1000),((PwmData[1]*10000+PwmData[2]*1000)/100*(PwmData[3]*10+PwmData[4])));
          
          StartPWM23();
          
          break;
 
  case 3 :
  
          InitPWM45();
          
          SetPWM45((PwmData[1]*10000+PwmData[2]*1000),((PwmData[1]*10000+PwmData[2]*1000)/100*(PwmData[3]*10+PwmData[4])));
          
          StartPWM45();
          
          break;
  
  default:
           break;

}
  
 
  
  
 
  
}

/****************************************************************************
* 注意 *   当总线频率为8MHz时, 且PWMCLK_PCLK1 = 0x0,选用时钟A,
            PWMPRCLK_PCKA = 0x3,PWM一个周期的最小分度为一微妙
            所以1ms = 1000,当倍频到24MHz时1ms为 3000

****************************************************************************/


/****************************************************************************
 控制PWM01口,16位
****************************************************************************/

void SetPWM01(INT16U period, INT16U duty) {

/*  if( duty < 3500 || duty > 5400) {
    
#if DEBUG == ON    
    //HAVE_AN_ERROR();
#endif

    return;                              
  } */
  
  PWMPER01 = period;
  
  PWMDTY01 = duty;	
}

/*********************************************************************************/ 
void InitPWM01(void) {
	
	PWMCTL_CON01 = 0x1;		/* 连接PWM0 和 1 */
	
	PWMPOL_PPOL1 = 0x1;		/* 开始是高 */
	
	PWMCLK_PCLK1 = 0x0;   	/* 选用时钟A, 一为SA */
	
	PWMPRCLK_PCKA = 0x3;  	/* 把时钟A分为原来的8分之1 */
	
	PWMCAE_CAE1 = 0x0;		/* 左对齐 */	
	
	PWMCNT01 = 0x0;			/* 清零 PWM计数器,置多少都一样 */
/*	PWMSCLA = ?;            设置SA把时钟A分多少频,当你用SA的时候 */	
}



/*********************************************************************************/ 
// 控制PWM23口,16位
/*********************************************************************************/
void SetPWM23(INT16U period, INT16U duty) {
  
  if( period < 100 ) {
    
    HAVE_AN_ERROR();
    
    return;                              
  } 
  
  PWMPER23 = period;
  
  PWMDTY23 = duty;	
}

/*******************************************************************************/
	

void InitPWM23(void) {
	
	PWMCTL_CON23 = 0x1;		/* 连接PWM 2 和 3 */
	
	PWMPOL_PPOL3 = 0x0;	/* 开始是低 */
	
	PWMCLK_PCLK3 = 0x0;   /* 选用时钟B, 一为SB */
	
	PWMPRCLK_PCKB = 0x3;  /* 把时钟B分为原来的8分之1 */
	
	PWMCAE_CAE3 = 0x0;		/* 左对齐 */	
	
	PWMCNT23 = 0x0;			/* 清零 PWM计数器,置多少都一样 */
/*	PWMSCLA = ?;            设置SA把时钟A分多少频,当你用SA的时候 */	
}



/********************************************************************************
 控制PWM45口,16位
********************************************************************************/

void SetPWM45(INT16U period, INT16U duty) {
  
  if( period < 100 ) {
    
    HAVE_AN_ERROR();
    
    return;                              
  } 
  
  PWMPER45 = period;
  
  PWMDTY45 = duty;	
}

/******************************************************************************/


void InitPWM45(void) {
	
	PWMCTL_CON45 = 0x1;		/* 连接PWM 4 和 5 */
	
	PWMPOL_PPOL5 = 0x0;	/* 开始是低 */
	
	PWMCLK_PCLK5 = 0x0;   /* 选用时钟B, 一为SB */
	
	PWMPRCLK_PCKA = 0x3;  /* 把时钟B分为原来的8分之1 */
	
	PWMCAE_CAE5 = 0x0;		/* 左对齐 */	
	
	PWMCNT45 = 0x0;			/* 清零 PWM计数器,置多少都一样 */
/*	PWMSCLA = ?;            设置SA把时钟A分多少频,当你用SA的时候 */	
}

		 
/*********************************************************************************/ 
// 控制PWM6口,8位
/*********************************************************************************/
void SetPWM6(INT8U period,INT8U duty){

  PWMPER6 = period;               //250 means 8KHz
  
  PWMDTY6 = duty;
  
}

/**********************************************************************************/
void InitPWM6(void){

  PWMPOL_PPOL6  =  1;        //disign the pwm clock is the 1/24 bus clock,so pwm clock is 1MHz
  
  PWMCLK_PCLK6  =  1;
  
  PWMPRCLK_PCKB = 0x01;
  
  PWMSCLB = 0x03;
  
  
  
}
 
/*********************************************************************************/ 
// 控制PWM7口,8位
/*********************************************************************************/
void SetPWM7(INT8U period,INT8U duty) {
  
  PWMPER7 = period;               //250 means 8KHz
  
  PWMDTY7 = duty;
}
/*********************************************************************************/
void InitPWM7(void) {

  PWMPOL_PPOL7  =  1;
  
  PWMCLK_PCLK7  =  1;
  
  PWMPRCLK_PCKB = 0x01;
  
  PWMSCLB = 0x03;
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -