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

📄 main.c

📁 此为ARM的电机程序,能够实现ARM对于电机的控制
💻 C
📖 第 1 页 / 共 2 页
字号:
					T1TCR  =  0X00;				 // 停止TIME1捕获
					IO0CLR = A_IN1|B_IN1;
   					IO0CLR = A_IN2|B_IN2;
   					//IO0CLR = PWM1;
   					//IO0CLR = PWM3;	
   					k = 1;
				}
				break;
									
				
			case 0xef:
			if(FunChgKey)						//按键4,功能为左转键
				{ 	
				PWMTCR = 0X00;
				PWMPCR = 0X0200;
				PWMTCR   = 0x09;             // 启动PWM输出
				T0TCR  =  0X01;				 // 启动TIME0
				T1TCR  =  0X01;				 // 启动TIME1捕获
   				IO0CLR = PWM3;
   				
   				k=0;
				 }
				  break;
		    case 0xF7:
			if(FunChgKey)						//按键3,功能为右转键
			{
			PWMTCR = 0X00;	
			PWMPCR = 0X0800;
				PWMTCR   = 0x09;             // 启动PWM输出
				T0TCR  =  0X01;				 // 启动TIME0
				T1TCR  =  0X01;				 // 启动TIME1捕获
   				IO0CLR = PWM1;
   				
   				k=0;
				 }
				 break; 
			case 0xbf:						//移位
				if(l)
				{	if(ShiftKey<7)
						ShiftKey++;
					else
						ShiftKey=0;
						
				}
				break;
			case 0xdf:
				if(FunChgKey)						//按键5,功能为上翻键
				{flag++;
				ParaBCD1(FunData[flag]);
				ParaBCD2(flag);
				k=1;
				 }
				  break;
			case 0x7f:
				if(l)
				{	if(BCDDATA[ShiftKey]<9)
						BCDDATA[ShiftKey]++;
					else
						BCDDATA[ShiftKey]=0;
						k=1;
				}
				break;
			default:
						 break;
		}
	}
}

/*
*********************************************************************************************************
** 函数名称 :Timer0_Init()
** 函数功能 :定时器0中断服务程
**入口参数:无
**出口参数:无
** 调试说明 :
*********************************************************************************************************
*/
void __irq Timer0_Int (void)
{	T1CCR = 0X00;
	H1=0X00;
	H2 = 0X00;
	NP1 = k1;
	NP2 = k2;
	k1=0;
	k2=0;
	if(CAP2_1>CAP1_1)
	F1 = (Fpclk/((CAP2_1-CAP1_1)/(NP1-1)));
	if(CAP2_2>CAP1_2)
	F2 = (Fpclk/((CAP2_2-CAP1_2)/(NP2-1)));
	T0IR = 0X01;
	
	T1CCR = (1<<7)|
   			(1<<8)|
   			(1<<10)|
   			(1<<11);
VICVectAddr = 0x00;
}
/*
*********************************************************************************************************
** 函数名称 :Timer1_CapInit()
** 函数功能 :定时器1捕获中断服务程
**入口参数:无
**出口参数:无
** 调试说明 :有问题???????
*********************************************************************************************************
*/
void __irq Timer1_CapInt (void)
{	
if((T1IR&0X40)!=0)
		{if(H1==0)
		{CAP1_1= T1CR2;
		H1 = 0X01;}
		else
		CAP2_1=T1CR3;
		k1++;
		
		FunData1[0]=k1/12;
		T1IR = 1<<6;}
if((T1IR&0X80)!=0)
		{if(H2==0)
		 {CAP1_2=T1CR2;
		 H2=0X01;}
		 else
		 CAP2_2 = T1CR3;
		k2++;
		FunData2[0]=k2/12;
		T1IR = 1<<7;}
VICVectAddr = 0x00;
 }
 /*
*********************************************************************************************************
** 函数名称 :I2cInit()
** 函数功能 :I2C初始化
** 入口参数 :Fi2c	I2C总线频率(最大400K)
** 出口参数 :无
*********************************************************************************************************
*/
void I2cInit(uint32 Fi2c)
{
	if (Fi2c > 400000)
		Fi2c = 400000;
		
   	//PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x50; 			/* 设置I2C控制口有效 				*/
	PINSEL0 = (PINSEL0 & (~0xF0)) | 0x50; 	// 不影响其它管脚连接
	I2SCLH = (Fpclk/Fi2c + 1) / 2;						/* 设定I2C时钟 						*/
	I2SCLL = (Fpclk/Fi2c)/2;
	I2CONCLR = 0x2C;
	
	/* 设置I2C中断允许 
	VICIntSelect = 0x00000000;							// 设置所有通道为IRQ中断 			
	VICVectCntl0 = (0x20 | 0x09);						// I2C通道分配到IRQ slot0,最高优先级
	VICVectAddr0 = (int32)IRQ_I2C;						// 设置I2C中断向量 					
	VICIntEnable = (1 << 9);							// 使能I2C中断 						*/
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :PWM音乐输出实验。
** 调试说明 :需要将music.h包含进来。
*********************************************************************************************************
*/
int	 main	 (void)
{
    
    PINSEL0 = 0x0000550A;		                // 设置SPI管脚连接
												// P0.0选择PWM1功能,P0.1选择PWM3功能
    PINSEL1	=0X00000014;						// P0.17选择CAP1.2功能,P0.18选择CAP1.3功能
 	PINSEL2 = 0x00000000;
 	MSPI_Init();
	DispBoardInit();
	IO0DIR = RCLK|A_IN1|A_IN2|B_IN1|B_IN2|PWM1|PWM3;
	IO1DIR = RCLK|led;
	IO1SET = RCLK|led;
	I2cInit(400000);
	 
   /*设置TIMER0/1中断*/
    IRQEnable();
	VICIntSelect = 0x00000000;
	VICVectCntl0 = 0x20|0x04;
	VICVectCntl1 = 0x20|0x05;
	VICVectCntl2 = 0x20|0x09;
	VICVectAddr0 = (uint32)Timer0_Int;
	VICVectAddr1 = (uint32)Timer1_CapInt;
	VICVectAddr2 = (int32)IRQ_I2C;						/* 设置I2C中断向量 					*/

	 //VICIntEnable = (1<<0X05);
  	VICIntEnable = (1<<0X04)|(1<<0X05)|(1<<0X09);
	IO1SET = RCLK;					//打开中断
	I2CONSET = 0x40;									//使能主I2C 
	I2C_ReadNByte(CAT1025, ONE_BYTE_SUBA, 0x00, FunData, 10);
	DelayNS(10);
	I2CONSET = 0x00;									// 禁止主I2C 
	//IO0SET = A_IN1|B_IN1;
	//IO0SET |= B_IN1;
   	//IO0CLR = A_IN2;
   	//IO0CLR	|=B_IN2;
    /* PWM初始化 */
    PWMPR    = 0x00;		    // 不分频,计数频率为Fpclk
    PWMMCR   = 0x02;			// 设置PWMMR0匹配时复位PWMTC
   
    PWMMR0   = Fpclk /(FunData[5]*10);
    PWMMR1   = PWMMR0/2;		// 50%占空比
    
    
    PWMMR3   = PWMMR0/2;
   PWMLER   = 0x0A;			// PWM0和PWM1/3匹配锁存
    
    PWMTCR   = 0x02;            // 复位PWMTC
   
   /* TIME0初始化 */
   T0TC = 0;
   T0PR = 0;
   T0MCR = 0X03;
   T0MR0 = Fpclk/10;			//1S定时
   
   
   
   /* TIME1初始化 */ 
   T1PR = 0;
   T1CCR = (1<<7)|
   			(1<<8)|
   			(1<<10)|
   			(1<<11);
   T1TC  =0;
   T1CR2 = 0;
   T1CR3 = 0;
  // T1MR0 = Fpclk*2;
   
	
   
   
  
  IO0CLR = PWM1;
  IO0CLR = PWM3;
  	//PWMTCR   = 0x09;             	// 启动PWM输出
    //T0TCR  =  0X01;				 	// 启动TIME0
	//T1TCR  =  0X01;			 		// 启动TIME1捕获
   //PWMTCR    = 0X00;
    //T1TCR  =  0X00;
    //flag = 0;
    //ParaBCD1(FunData[flag]);
	//ParaBCD2(flag);
    while(1)
    {	
		Sensor = ((IO0PIN &0X0000AA00)>>8);
		
			
		switch(Sensor)
			{case 0xAA:{ORA = FunData[1]*10;
						ORB = FunData[2]*10;}
						//IO0CLR = led;
						//DelayNS(10);}
						break;
			 case 0x8A:{ORA = (FunData[1]-FunData[3])*10;
			 			ORB = (FunData[1]+FunData[3])*10;}
			 			break;
			 case 0xA2:{ORA = (FunData[1]+FunData[3])*10;
			 			ORB = (FunData[1]-FunData[3])*10;}
			 			break;
			 case 0x2A:{ORA =( FunData[1]-5*FunData[3])*10;
			 			ORB = (FunData[1]+5*FunData[3])*10;}
			 			break;
			 case 0xA8:{ORA = (FunData[1]+5*FunData[3])*10;
			 			ORB = (FunData[1]-5*FunData[3])*10;}
			 			break;
			default:break;
			 }
		
		EK1_2 = ORA - F1;
		EK2_2 = ORB - F2;
		UK1 = UK1 +150*(EK1_2-EK1_1)+5*EK1_1; 
		UK2 = UK2 +150*(EK2_2-EK2_1)+5*EK2_1;
		EK1_1 = EK1_2;
		EK2_1 = EK2_2;
		if(UK1>(PWMMR0-10))
		UK1 = (PWMMR0 - 10);
		if(UK1<10)
		UK1=10;
		if(UK2>(PWMMR0-10))
		UK2 = (PWMMR0 - 10);
		if(UK2<10)
		UK2=10;
		PWMMR1 = UK1;
		PWMMR3 = UK2;
		PWMLER =0X0A;
		
    	KeyScan();
    	DisplayFun();
    	
    }
 
    return 0;
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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