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

📄 pwm.c

📁 直流电机控制程序 基于ti公司 dsp tms320lf2407a 运行环境 ccs2.2 原创 虽然很简单
💻 C
字号:
// 该程序利用EVA模块的PWM1--PWM4引脚产生不同占空比的方波调节直流电机的电压
#include	"C2407A.h"
#include    "stdio.h"
#include    "math.h"

#define run1   0X0F3D                                         //电动机正向转动(按奇数次),正向制动(按偶数次)
#define stop1  0X0F37                                          //电动机反向转动(按奇数次),反向转动(按偶数次)
#define run2   0X0FD3                                          //电动机加速“+”
#define stop2  0X0F73                                          //电动机减速“-”
#define stop       0X0FFF                                          // 0000 1111 1111 1111  全部输出强制为高
int t=150;                                                      //声明一个外部变量
int K1=0,K2=0,K3=0,K4=0;
int key1=0,key2=0,key3=0,key4=0;                                             
int flag=0;
int  initial()
{
  asm(" setc	INTM");	      //DISABLE_INTS();
	asm(" setc	SXM");  			// 符号位扩展有效
	asm(" clrc	OVM");				// 累加器中结果正常溢出
	asm(" clrc	CNF");				// B0被配置为数据存储空间
	*SCSR1=0x0304;			    	// CLKIN=20M,CLKOUT=2*CLKIN=40M
	*WDCR=0x0e8;			      	// 不使能看门狗,因为SCSR2中的WDOVERRIDE
		     				            // 即WD保护位复位后的缺省值为1,故可以用
		     			            	 // 软件禁止看门狗
	*IMR=0x02;			         	// 禁止所有中断
	*IFR=0xFF;		      	                // 清除全部中断标志,"写1清0"
 	WSGR=0X0Fff;		    	                // 禁止所有的等待状态

}
// 定时器1的初始化子程序
int  timer1int()
{
    
	*EVAIMRA=*EVAIMRA|0X0200;	               // 允许定时器1的下溢中断
	*EVAIFRA=*EVAIFRA&0X0200;	               // 清除定时器1 下溢中断标志
	*EVAIMRB=0X0000         ;                                      // 屏蔽所有事件管理器中断?
	*EVAIMRC=0X0000;
	*T1CNT=0X00;				    // Timer1的计数器清零
} 
// EVA模块的PWM初始化程序

int  pwminitial()
{
	*MCRA=*MCRA|0X0fc0;		        // 被配置为基本功能方式,PWM1-6
	*ACTRA=stop;			        //run10X0666 PWM6,4,2 高有效,PWM5,3,1 低有效0000 
	*DBTCONA=0X05F4;			  	// 使能死区控制
	*CMPR1=0;
	*CMPR2=0;
	*T1PR=2000;				        // 设置定时器1的周期寄存器,并设置CMPR1-3,以确定不
                                                                                                        
	*COMCONA=0X8200;	     		// 使能比较操作
	*T1CON=0X0842;			    	// 定时器1为连续增减
}


// 定时器1下溢中断服务程序 设定好占空比初始值设为1000
void interrupt GISR2( )
{   
    
  extern t;
     
	flag=*EVAIFRA&0X0200;
	if(flag!=0x0200)
	{        
		asm(" clrc	INTM");          //ENABLE_INTS( );	// 允许总中断
		return;					     // 如果不是定时器1周期中断,则直接返回
	}
	
//如果是定时器1周期中断定时器1的周期中断,则执行下面的产生pwm程序
	*CMPR1=10*t;
	*CMPR2=10*t;
    *EVAIFRA=*EVAIFRA&0X0200;	        // 清除定时器1 下溢中断标志
    asm(" clrc	INTM");					// 允许总中断,因一进中断服务程序后总中断就自动关闭了
	return ;					     	// 中断返回
}

// 但可能由于干扰会引起他们的执行,故该中断服务程序无额外操作,直接返回
void interrupt nothing( )
{
	asm(" clrc	INTM");//ENABLE_INTS( );				    // 允许总中断,因一进中断服务程序后总中断就自动关闭了
	return;					        	// 中断返回
}

void  inline ENABLE_INTS( )             //开总中断
{
  asm(" clrc	INTM");				 
						     	
}

//void inline  DISABLE_INTS()	            //关总中断
//{
//  asm("	setc	INTM	");		
						     
//}
// 键扫描程序
int keyscan()
{ extern K1,K2,K3,K4;
  extern key1,key2,key3,key4;
  extern t;
    K1=key&0X000F;

	K2=K1;//asm("IN K2,0007h");
	K3=K1;//asm("IN K3,0007h");
	K4=K1;//asm("IN K4,0007h");
  //K1
  led=K1;
  if(K1<15)
  	{
  	  delay();  //去抖
   	 	K1=key&0X000F;//asm("IN K1,0007h");
	K2=K1;//asm("IN K2,0007h");
	K3=K1;//asm("IN K3,0007h");
	K4=K1;//asm("IN K4,0007h");
	  
  	if((K1&0X0001)==0)
  		key1=(key1+1)%2;                   //键1按下 
  	if((K2&0X0002)==0) 
  		key2=(key2+1)%2;                   //键2按下
  	if((K3&0X0004)==0)
  		key3=1;                            //键3按下
  	if((K4&0X0008)==0)
  		key4=1; }                            //键4按下
  	          //返回键值
  	
	return;
	}

  
int delay()
{
int i;
for(i=0;i++;i<10000){i=i;}	
}
// 主程序
void main()
{ extern key1,key2,key3,key4;    //定义四个键的初值
  
	initial();						// 系统初始化
 	timer1int();					// 定时器1的初始化
 	pwminitial();                                                                             
	asm(" clrc	INTM");//ENABLE_INTS();				

while(1)
{ keyscan();
	if(key1==1)
	 {*ACTRA=0X0F3D;	                 //run10X0666 电动机正向转动(按奇数次)
	    for(;;)
	    {
	    	keyscan();
	    if(key1==0)
	      	{
	      		*ACTRA=stop1;	          //电动机正向制动(按偶数次)
                break;
          }
       else if((key3==1)&&(t<200)) //分为20档 电机转速有20个档位  
  		       {t=t+1;}        
  		 else if((key4==1)&&(t>0))  
  		 	     {t=t-1;}    	                       
  		   		        
  	  }      
   }
	else if(key2==1)
	 {*ACTRA=run2;	 //电动机反向转动(按奇数次)
	 	  for(;;)
	 	  {
	 	  	keyscan();
	 		if(key2==0)
	 		    {
	 			    *ACTRA=stop2;	 //电动机反向制动(按偶数次)
	                break;
	             }
	     else if((key3==1)&&(t<200)) //分为20档 电机转速有20个档位  
  		       {t=t+1;}         //每个档位差为0.6v电压差,对应占空比100/2000;
  		 else if((key4==1)&&(t>0))  
  		 	     {t=t-1;}    	                       
  		   	
	     }
	 }
						    	

}
}

⌨️ 快捷键说明

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