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

📄 main.c

📁 周立功LPC2131开发板 控制步进电机
💻 C
字号:
/****************************************Copyright (c)**************************************************
********************************************************************************************************/
#include "config.h"


#define DIR    1 << 2    // P0.2控制电机方向
#define PULSE  1 << 5	 // P0.5控制电机脉冲	

volatile uint16 u16MStepCount = 0;
volatile uint16 u16CoderCount = 0;
/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_Timer0(void)
{
    if ((IO0SET & PULSE) == 0)
		IO0SET = PULSE;			//电机脉冲为高电平	
	else
		IO0CLR = PULSE;         //电机脉冲为低电平
	
    u16MStepCount++;
    

    
	if(u16MStepCount >= 1000)
	{ 
	   T0TCR  = 0;		    // 关闭定时器0				
	   IO0SET = PULSE;		// 电机脉冲为高电平
	}
	  
	T0IR = 0x01;				// 清除中断标志
	VICVectAddr = 0x00;			// 通知VIC中断处理结束		
}


/*
*********************************************************************************************************
** 函数名称 :Timer1_CapInt()
** 函数功能 :定时器1捕获中断服务程序 计数
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq Timer1_CapInt(void)
{
    
    T1IR = 1 << 6;							// 清除CAP1.2中断标志
    u16CoderCount = T1TC;                   // 读取编码器计数值
    VICVectAddr   = 0x00;					// 向量中断处理结束
}

//*******************************************************************************************************//
//** 函数名称   SetMotor(uint8 dir, uint16 Freq,uint16 setstep)*******//
//** 函数功能 :设置步进电机并启动电机*******//
//** 入口参数 :电机转向:0-1;电机速度:脉冲频率0-1000Hz,电机转动脉冲数:0连续转动*******//
//** 出口参数 :无*******//
//*******************************************************************************************************//

void SetMotor(uint8 dir, uint16 Freq)
{
    if(Freq > 1000) Freq = 1000;
	if(dir == 1)
	  IO0SET = DIR;                  // P0.2控制方向,输出高电平 顺时针转动
	else
	  IO0CLR = DIR;                  // P0.2控制方向,输出低电平 逆时针转动     				
	T0MR0  = Fpclk / (Freq<<1);	     // 输出脉冲频率控制											
	T0TCR  = 0x01;		             // 启动定时器0 电机开始运动	
}




/**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :
** 调试说明 :
**********************************************************************************************************/

int main (void)
{   
    PINSEL0 = 0x00000000;                   // 设置引脚连接GPIO
    PINSEL1 = 1 << 2;		                // P0.17连接捕获1.2	                  
    IO0DIR = DIR|PULSE;                     // 设置P0.2和P0.5控制口输出
    
    IRQEnable();							// 使能IRQ中断
	
	/* 设置中断 */    
	VICIntSelect = 0x00000000;				// 设置所有的通道为IRQ中断
	VICVectCntl0 = 0x20 | 4;				// Timer0分配到IRQ slot0,即最高优先级
	VICVectAddr0 = (uint32)IRQ_Timer0;	    // 设置Timer0向量地址
	VICVectCntl1 = 0x20 | 5;				// Timer1分配到IRQ slot1,即次高优先级
	VICVectAddr1 = (uint32)Timer1_CapInt;	// 设置Timer1向量地址
	VICIntEnable = (1 << 4)|(1 << 5);		// 使能Timer0/Timer1中断
    
    T0TC   = 0;         // 定时器设置为0
	T0PR   = 0;			// 时钟不分频								
	T0MCR  = 0x03;		// 设置T0MR0匹配后复位T0TC  并产生中断     
   											
	T1TC  = 0;
	T1CCR = (1 << 7) | (1 << 8);	// 设置CAP1.2下降沿捕获	允许产生中断		
	T1CTCR = (0x02 << 0) |			// 计数器,在CAP的下降沿递增
		     (0x02 << 2);			// 选择CAP1.2
	T1TCR = 0x01;					// 启动计数器1	
	
	SetMotor(1, 650);
	
    while(1);   
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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