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

📄 pwm.c

📁 ARM7 lpc2100 PWM驱动API,源码有详细注解
💻 C
字号:
#include "cfg.h"

void Func_PWM_Single_Adge_Init(uint32 PWM_PR,uint32 PWM_TC,uint8 Int_PWM_MR0Mod,uint8 Int_PWM_MRxMod,uint8 Int_Channel,uint32 PWM_T,uint32 PWM_Rate);
void Func_PWMStart(void);
void Func_PWMReset(void);
void Func_PWMStop(void);
/*********************************************************************************************************
** 函数名称: void Func_PWM_Single_Adge_Init(uint32 PWM_PR,uint32 PWM_TC,uint8 Int_PWM_MR0Mod,uint8 Int_PWM_MRxMod,uint8 Int_Channel,fp32 PWM_T,fp32 PWM_Rate)
** 功能描述:PWM单边沿输出初始化
* 入口参数:PWM_PR,设置PWM预分频寄存器PWMPR值;			
			PWM_TC, 设置PWM计数器PWMTC值
			Int_PWM_MR0Mod,设置PWMMR0模式,参考PWMMCR的设置,有效值 0~7;
			Int_PWM_MRxMod,设置PWMMR(1~6)模式,参考PWMMCR的设置,有效值 0~7;
			Int_Channel,PWMx通道,有效值:1~6;
			PWM_T,设置PWMx时间,时间为浮点运算,单位为us,
			PWM_Rate,设置PWMx占空比,PWM_Rate=50,表示占空比为50%,运算公式:PWMMRx=PWMMR0*100/PWM_Rate;
			对PWM0~PWM6同时使用的设置时,PWM_PR、PWM_TC的参数必须相同			
* 出口参数:无
********************************************************************************************************/
void Func_PWM_Single_Adge_Init(uint32 PWM_PR,uint32 PWM_TC,uint8 Int_PWM_MR0Mod,uint8 Int_PWM_MRxMod,uint8 Int_Channel,uint32  PWM_T,uint32 PWM_Rate)
{	PWMPR=PWM_PR;
	PWMTC=PWM_TC;
/*	PWMPCR=	0<<0  |			//[1:0]无定义
			0<<2  |			//PWMSEL2=0:PWM2选择单边沿;1:双边沿
			0<<3  |			//PWMSEL3=0:PWM2选择单边沿;1:双边沿
			0<<4  |			//PWMSEL4=0:PWM2选择单边沿;1:双边沿
			0<<5  |			//PWMSEL5=0:PWM2选择单边沿;1:双边沿
			0<<6  |			//PWMSEL6=0:PWM2选择单边沿;1:双边沿
			
			0<<7  |			//[8:7]无定义
			
			0<<9  |			//PWMENA1=1:PWM1输出;0:禁止
			0<<10 |			//PWMENA2=1:PWM2输出;0:禁止
			0<<11 |			//PWMENA3=1:PWM3输出;0:禁止
			0<<12 |			//PWMENA4=1:PWM4输出;0:禁止
			0<<13 |			//PWMENA5=1:PWM5输出;0:禁止
			0<<14 |			//PWMENA6=1:PWM6输出;0:禁止
			
			0<<15 ;			//[31:15]无定义
*/
	PWMPCR=1 << Int_Channel+8	;
	PWMMR0=(Fpclk/(PWMPR+1)/1000000-PWMTC)*PWM_T;	//Fpclk=10MHz,PWMPR=0,PWMTC=0,PWM_T=1us,每个PWMTC为0.1us,则PWMMR0=10
	switch(Int_Channel)
	{	case 0x01:PWMMR1=PWMMR0*PWM_Rate/100;break;		//占空比
		case 0x02:PWMMR2=PWMMR0*PWM_Rate/100;break;
		case 0x03:PWMMR3=PWMMR0*PWM_Rate/100;break;
		case 0x04:PWMMR4=PWMMR0*PWM_Rate/100;break;
		case 0x05:PWMMR5=PWMMR0*PWM_Rate/100;break;
		case 0x06:PWMMR6=PWMMR0*PWM_Rate/100;break;
	}
/*						
	PWMMCR=	0<<0  |			//PWMMR0中断,1:PWMMR0与PWMTC值相匹配时将产生中断;		0:禁止
			0<<1  |			//PWMMR0复位,1:PWMMR0与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<2  |			//PWMMR0停止,1:PWMMR0与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<3  |			//PWMMR1中断,1:PWMMR1与PWMTC值相匹配时将产生中断;		0:禁止
			0<<4  |			//PWMMR1复位,1:PWMMR1与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<5  |			//PWMMR1停止,1:PWMMR1与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<6  |			//PWMMR2中断,1:PWMMR2与PWMTC值相匹配时将产生中断;		0:禁止
			0<<7  |			//PWMMR2复位,1:PWMMR2与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<8  |			//PWMMR2停止,1:PWMMR2与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<9  |			//PWMMR3中断,1:PWMMR3与PWMTC值相匹配时将产生中断;		0:禁止
			0<<10 |			//PWMMR3复位,1:PWMMR3与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<11 |			//PWMMR3停止,1:PWMMR3与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<12 |			//PWMMR4中断,1:PWMMR4与PWMTC值相匹配时将产生中断;		0:禁止
			0<<13 |			//PWMMR4复位,1:PWMMR4与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<14 |			//PWMMR4停止,1:PWMMR4与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<15 |			//PWMMR5中断,1:PWMMR5与PWMTC值相匹配时将产生中断;		0:禁止
			0<<16 |			//PWMMR5复位,1:PWMMR5与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<17 |			//PWMMR5停止,1:PWMMR5与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<18 |			//PWMMR6中断,1:PWMMR6与PWMTC值相匹配时将产生中断;		0:禁止
			0<<19 |			//PWMMR6复位,1:PWMMR6与PWMTC值相匹配时将PWMTC产生复位;	0:禁止
			0<<20 |			//PWMMR6停止,1:PWMMR6与PWMTC值相匹配时将产生停止;		0:禁止
			
			0<<21 ;			//[32:21]无定义
			
*/
	PWMMCR = PWMMCR & 0x1FFFF8 | Int_PWM_MR0Mod ;	
							//PWMMCR = 111 111 111 111 111 111 000
							//设置PWMMR0模式
	switch(Int_Channel)
	{	case 0x01:PWMMCR=PWMMCR & 0x1FFFC7 |Int_PWM_MRxMod <<(3 *Int_Channel);break;		
							//PWMMCR = 111 111 111 111 111 000 111 << (3* PWM_Channel);
							//设置PWMMR1模式
		case 0x02:PWMMCR=PWMMCR & 0x1FFE3F |Int_PWM_MRxMod <<(3 *Int_Channel);break;		
							//PWMMCR = 111 111 111 111 000 111 111 << (3* PWM_Channel);
							//设置PWMMR2模式
		case 0x03:PWMMCR=PWMMCR & 0x1FF1FF |Int_PWM_MRxMod <<(3 *Int_Channel);break;		
							//PWMMCR = 111 111 111 000 111 111 111 << (3* PWM_Channel);
							//设置PWMMR3模式
		case 0x04:PWMMCR=PWMMCR & 0x1F8FFF |Int_PWM_MRxMod <<(3 *Int_Channel);break;		
							//PWMMCR = 111 111 000 111 111 111 111 << (3* PWM_Channel);
							//设置PWMMR4模式
		case 0x05:PWMMCR=PWMMCR & 0x1C3FFF | Int_PWM_MRxMod <<(3 *Int_Channel);break;		
							//PWMMCR = 111 000 111 111 111 111 111 << (3* PWM_Channel);
							//设置PWMMR5模式
		case 0x06:PWMMCR=PWMMCR & 0x03FFFF |Int_PWM_MRxMod <<(3 *Int_Channel);break;	
							//PWMMCR = 000 111 111 111 111 111 111 << (3* PWM_Channel);	
							//设置PWMMR6模式
	}
/*	
	PWMLER=	0<<1  |			//使能PWMMR0锁存,1:使能,写入PWMMR0的新值才能在PWMMR0发生匹配后生效;0:禁止
			0<<0  |			//使能PWMMR1锁存,1:使能,写入PWMMR1的新值才能在PWMMR0发生匹配后生效;0:禁止
			0<<0  |			//使能PWMMR2锁存,1:使能,写入PWMMR2的新值才能在PWMMR0发生匹配后生效;0:禁止
			0<<0  |			//使能PWMMR3锁存,1:使能,写入PWMMR3的新值才能在PWMMR0发生匹配后生效;0:禁止
			0<<0  |			//使能PWMMR4锁存,1:使能,写入PWMMR4的新值才能在PWMMR0发生匹配后生效;0:禁止
			0<<0  |			//使能PWMMR5锁存,1:使能,写入PWMMR5的新值才能在PWMMR0发生匹配后生效;0:禁止
			0<<0  |			//使能PWMMR6锁存,1:使能,写入PWMMR6的新值才能在PWMMR0发生匹配后生效;0:禁止
			
			0<<1  ;			//无定义
*/	
	PWMLER=	1<<0  |	  
			1<<Int_Channel ;			
}
/*********************************************************************************************************
** 函数名称: Func_PWMStart()
** 功能描述:PWM使能并开始计数
* 入口参数:无					
* 出口参数:无
********************************************************************************************************/
void Func_PWMStart(void)
{	PWMTCR=	1<<0  |			//计数器使能,1:使能;0:停止
			0<<1  |			//计数器复位,1:PWMPC、PWMTC在下一个上升没复位,等PWMPC、PWMTC复位完成后,该位清0
			0<<2  |			//无定义
			1<<3  |			//PWM使能,1:使能;0:停止
			
			0<<4  ;			//[7:4]无定义
}
/*********************************************************************************************************
** 函数名称: Func_PWMReset()
** 功能描述:PWM复位
* 入口参数:无					
* 出口参数:无
********************************************************************************************************/
void Func_PWMReset(void)
{	PWMTCR=	1<<0  |			//计数器使能,1:使能;0:停止
			1<<1  |			//计数器复位,1:PWMPC、PWMTC在下一个上升没复位,等PWMPC、PWMTC复位完成后,该位清0
			0<<2  |			//无定义
			1<<3  |			//PWM使能,1:使能;0:停止
			
			0<<4  ;			//[7:4]无定义
}
/*********************************************************************************************************
** 函数名称: Func_PWMStop()
** 功能描述:PWM停止,计数器停止
* 入口参数:无					
* 出口参数:无
********************************************************************************************************/
void Func_PWMStop(void)
{	PWMTCR=	0<<0  |			//计数器使能,1:使能;0:停止
			0<<1  |			//计数器复位,1:PWMPC、PWMTC在下一个上升没复位,等PWMPC、PWMTC复位完成后,该位清0
			0<<2  |			//无定义
			0<<3  |			//PWM使能,1:使能;0:停止
			
			0<<4  ;			//[7:4]无定义
}

⌨️ 快捷键说明

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