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

📄 pwwmmtt1.c

📁 用430做的PWM程序
💻 C
字号:
/*******************************************************************************
文件名:pwm_timer_b.c
编写者:czhang
描述:使用定时器B进行PWM输出。输出的频率和占空比由串行口发送来的指令确定。
版本:	1.0	2005-2-20
*******************************************************************************/
#include <MSP430x14x.h>

#define PWM_DIR P4DIR
#define PWM_SEL P4SEL
#define PWM_OUT P4OUT
#define PWM_IN  P4IN

#define  PWM_IO  BIT2       //一个PWM输出端由一个TBCCRX控制

void TimerBInit(void);
void SetScale(unsigned int sc);
void SetFre(unsigned int fre);
unsigned char GoPwm(unsigned char doit);
void InitSys( void );

unsigned int iFre;      //频率
unsigned int iScale;	   //占空比

void main( void )
{
  InitSys( );
  SetScale(150);
  SetFre(250);
  while(1)
  {
    GoPwm(100);
  }
}

/*****************************************************************************
初始化定时器B
*****************************************************************************/
void TimerBInit(void)
{
	TBCTL = TBSSEL1 + TBCLR ; //时钟源为SMCLK
	TBCCTL1 = OUTMOD_7;   	  //工作在复位/置位 模式

	PWM_SEL |= PWM_IO;	//选择输出端口的第二功能
	PWM_DIR |= PWM_IO;
}

/*****************************************************************************
设置占空比
sc:要修改的占空比值
*****************************************************************************/
void SetScale(unsigned int sc)
{
	iScale=sc;
}

/*****************************************************************************
设置频率
fre:要修改的输出频率值
*****************************************************************************/
void SetFre(unsigned int fre)
{
	iFre=fre;
}

/*****************************************************************************
控制PWM运行或者停止
doit:0:停止  100:运行  其它:什么都不做,只返回运行状态
返回值:运行状态。 同doit的值
*****************************************************************************/
unsigned char GoPwm(unsigned char doit)
{
	TBCTL &= ~(MC0+MC1);   //关闭定时器
	if(doit==100)
	{
	   TBCCR2 = iScale;
	   TBCCR0 = iFre;
		TBCTL |= MC1;   	//打开定时器,计数模式2
	}
	if((TBCTL&MC_0)==0)	//判断PWM是否运行
		return 0;
	else
		return 100;
}


void InitSys( void )
{
   unsigned int iq0;
   WDTCTL = WDTPW + WDTHOLD;               	//关闭看门狗

	//使用XT2振荡器
   BCSCTL1&=~XT2OFF;     				        //打开XT2振荡器
   do
   {
 		IFG1 &= ~OFIFG;				          // 清除振荡器失效标志
 		for (iq0 = 0xFF; iq0 > 0; iq0--);	 // 延时,等待XT2起振
 	}
 	while ((IFG1 & OFIFG) != 0);			    // 判断XT2是否起振

 	BCSCTL2 =SELM_2+SELS;				       //选择MCLK、SMCLK为XT2
 	TimerBInit();					             //初始化定时器B
	_EINT();	                               //打开全局中断控制,若不需要打开,可以屏蔽本句
}

⌨️ 快捷键说明

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