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

📄 lpc_lib_pwm.c

📁 使用embest IDE开发工具开发的基于LPC2294 的触摸屏开发
💻 C
字号:



#include "lpc_lib_pwm.h"




void pwm_init (INT8U edge,pwm_sel channel,INT8U onoff)   //initialize the pwm channels
	{
		INT32U p0_pwm_en,p0_pwm_mask;	 	 //edge:  0:single edge 1:double edge
		INT32U i;							 //onoff: 0:off   1:on
		
	 if (edge==0)
	 	{
	 	 if (channel==pwm5)  //apart pwm5 from other pwm channels
	 	   {
	 	 	p0_pwm_en=P0_21_PWM5_EN;
	 	 	p0_pwm_mask=P0_21_PWM5_MASK;
	 	 	if (onoff==0)
	 	 		{
	 	 					//off the pwm5 channel
	 	 		}
	 	 		else
	 	 		{  	 i = PINSEL1;
			     	 i &= (~p0_pwm_mask);
			     	 i |= p0_pwm_en;
			     	 PINSEL1 = i;	
				}
				return;
	 	 	
	 		}
	 	 else
	 	 	{
	 		 switch(channel)
	 	 		{case pwm1: 	p0_pwm_en=P0_0_PWM1_EN;
	 	 						p0_pwm_mask=P0_0_PWM1_MASK;
	 	 						break;
	 	 		case pwm2: 		p0_pwm_en=P0_7_PWM2_EN;
	 	 						p0_pwm_mask=P0_7_PWM2_MASK;
	 	 						break;				
				case pwm3: 		p0_pwm_en=P0_1_PWM3_EN;
	 	 						p0_pwm_mask=P0_1_PWM3_MASK;
	 	 						break;
	 	 		case pwm4: 		p0_pwm_en=P0_8_PWM4_EN;
	 	 						p0_pwm_mask=P0_8_PWM4_MASK;
	 	 						break;				
				case pwm6: 		p0_pwm_en=P0_9_PWM6_EN;
	 	 						p0_pwm_mask=P0_9_PWM6_MASK;
	 	 						break;
	 	 		default:		
	 	 					break;	
	 	 		}
	 	  	}	
	 	} 	

	 else 	
	 	{
	 		 switch(channel)
	 	 		{
	 	 		case pwm2: 		p0_pwm_en=P0_7_PWM2_EN;
	 	 						p0_pwm_mask=P0_7_PWM2_MASK;		 	 									     	 
						        i=PWM_PCR;  
			     	 			i |=0x04;	// enble double edge
			     	 			PWM_PCR=i;
	 	 						break;				
	 	 		case pwm4: 		p0_pwm_en=P0_8_PWM4_EN;
	 	 						p0_pwm_mask=P0_8_PWM4_MASK;
	 	 						i=PWM_PCR;  
			     	 			i |=0x10;
			     	 			PWM_PCR=i;
	 	 						break;				
				case pwm6: 		p0_pwm_en=P0_9_PWM6_EN;
	 	 						p0_pwm_mask=P0_9_PWM6_MASK;
	 	 						i=PWM_PCR;  
			     	 			i |=0x40;
			     	 			PWM_PCR=i;
	 	 						break;
	 	 		default:		
	 	 					break;	
	 	 		}
	 	}		
	 			
	 if (onoff==0)
	 	{				//off the pwm channels
	 	}
	 else
	 	{	i = PINSEL0;
			i &= (~p0_pwm_mask);
			i |= p0_pwm_en;
			PINSEL0 = i;
		}
		
}		
			

void pwm_set_f(INT32U f)
{	
	INT32U i;
	PWM_PR=PWMPR;					
	i=(INT32U)( PCLKF/((PWMPR+1)*f));
	PWM_MR0=i;	
	
	i=PWM_MCR;  //enable pwm0 to reset
	i |=0x02;
	PWM_MCR=i;
	
	i=PWM_LER;  //lock enable  MR0
	 i |=0x1;
	 PWM_LER=i;
}

void pwm_single_edge(pwm_sel channel,INT32U f,FP32 pulse_prop)
{
	INT32U i,j;
	INT32U ler_en,output_en;
	
	i=(PCLKF*pulse_prop)/((PWMPR+1)*f);
	
	switch(channel)
	 {	case pwm1: 		PWM_MR1=i;
	 					ler_en=(0x01<<1);
	 					output_en=(0x01<<9);
	 					break;
	 	case pwm2: 		PWM_MR2=i;
	 					ler_en=(0x01<<2);
	 					output_en=(0x01<<10);
	 					break;	
	 	case pwm3: 		PWM_MR3=i;
	 					ler_en=(0x01<<3);
	 					output_en=(0x01<<11);
	 					break;	
	 	case pwm4: 		PWM_MR4=i;
	 					ler_en=(0x01<<4);
	 					output_en=(0x01<<12);
	 					break;
	 	case pwm5: 		PWM_MR5=i;
	 					ler_en=(0x01<<5);
	 					output_en=(0x01<<13);
	 					break;	
	 	case pwm6: 		PWM_MR6=i;
	 					ler_en=(0x01<<6);
	 					output_en=(0x01<<14);
	 					break;				
	 	default:		
	 					break;																										
	 }
	  	 
	 i=PWM_LER;//lock enable  MRx
	 i |=ler_en;
	 PWM_LER=i;
	 
	 i=PWM_PCR;		//pwm output enable
	 i |=output_en;
	 PWM_PCR=i;
	 
//	 PWM_TCR=0x09;   //enable pwm function 
}

void pwm_double_edge(pwm_sel channel,INT32U f,INT32U polarity,FP32 pulse_prop,FP32 pulse_position)
{
	INT32U i,j,temp;			//polarity:  0:positive pulse  1:negtive pulse
	 INT32U ler_en,output_en;	//
	
	temp=PCLKF/((PWMPR+1)*f);
	i=pulse_prop*temp/2;
	temp=pulse_position*temp;
	j=temp+i;
	i=temp-i;
	
	if(polarity!=0)
	  {	temp=i;
		i=j;
		j=temp;
	  }	
	  
	switch(channel)
	 	 		{
	 	 		case pwm2: 		PWM_MR1=i;
	 	 						PWM_MR2=j;
	 	 						ler_en=(0x01<<2);
	 							output_en=(0x01<<10);
	 	 						break;				
	 	 		case pwm4: 		PWM_MR3=i;
	 	 						PWM_MR4=j;
	 	 						ler_en=(0x01<<4);
	 							output_en=(0x01<<12);
	 	 						break;				
				case pwm6: 		PWM_MR5=i;
	 	 						PWM_MR6=j;
	 	 						ler_en=(0x01<<6);
	 							output_en=(0x01<<14);
	 							break;
	 	 		default:		
	 	 					break;	
	 	 		}	

	 i=PWM_LER;		//lock enable MRx
	 i |=ler_en;
	 PWM_LER=i;
	 
	 i=PWM_PCR;		//pwm output enable
	 i |=output_en;
	 PWM_PCR=i;
}

void pwm_enable(void)
{
	PWM_TCR=0x09;   //enable pwm function 
}

void pwm_close(void)
{
	PWM_TCR=0x0;   //disable pwm function and stop counter	
}







⌨️ 快捷键说明

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