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

📄 motor.h

📁 香港科大机器人资料 单片机相关知识
💻 H
字号:
//***********************************************************
//电机
//***********************************************************

#ifndef MOTOR_H
#define MOTOR_H

#include "io_assign.h"
#include "delay.h"

//------------------电机控制宏-------------------
#define STOP(p)			MotorCtrl=0;speed=p;
#define GO(p) 			MotorCtrl=1;speed=p;
#define BACK(p)			MotorCtrl=2;speed=p;
#define GOLEFT(p)		MotorCtrl=3;speed=p;	
#define GORIGHT(p)		MotorCtrl=4;speed=p;
#define BACKLEFT(p)		MotorCtrl=5;speed=p;
#define BACKRIGHT(p)	MotorCtrl=6;speed=p;
#define TURNLEFT(p)		MotorCtrl=7;speed=p;	
#define TURNRIGHT(p)	MotorCtrl=8;speed=p;
//------------------------------------------------

//-----------变量声明----------------------------------
unsigned char MotorCtrl=0;		//电机控制变量
unsigned char T2_interrupts=0;	//电机脉冲波周其计算
unsigned char speed=5;			//车速
extern volatile uint wheelCountLeft=0;	//左边转数计算
extern volatile uint wheelCountRight=0;	//右边转数计算

//-----------函数声明----------------------------------
void PWM_Init(void);//初始化PWM

//低层函数
void setPWM0(uint value);//PWM0装载匹配值设置
void setPWM1(uint value);//PWM1装载匹配值设置
void setPWM2(uint value);//PWM2装载匹配值设置

//应用函数
void lift(uchar h);//升降
void nip(uchar a);//夹东西
//-------------------------------------------------

//==================T2中断===============================
void Time2(void) interrupt 5
{
	T2CON=0x04;
	if(MotorCtrl==0){MLD=0;MRD=0;}	//停止
	else if(T2_interrupts<speed&&MotorCtrl==1)
	{ML1=1;ML2=0;MLD=1; MR1=1;MR2=0;MRD=1;}	//前进
	else if(T2_interrupts<speed&&MotorCtrl==2)
	{ML1=0;ML2=1;MLD=1; MR1=0;MR2=1;MRD=1;}//后退
	else if(T2_interrupts<speed+2&&MotorCtrl==1)
	{MLD=0; MR1=1;MR2=0;MRD=1;}	//前进,抑制左轮速度
	else if(T2_interrupts<speed+2&&MotorCtrl==2)
	{MLD=0; MR1=0;MR2=1;MRD=1;}	//后退,抑制左轮速度
	else {MLD=0;MRD=0;}
	T2_interrupts++;
	if(T2_interrupts>20)T2_interrupts=0;
}

//==========PCA中断=======================
void PCA(void) interrupt 6 using 2
{
	if (CF==1)
	{
		CF=0;
 		CH = 0xB7;
		CL = 0xFF;
	    PWM0=1;
  	    PWM1=1;
  	    PWM2=1;
	}
	if (CCF3==1)
	{
		CCF3=0;
		wheelCountLeft++;		
	}
	if (CCF4==1)
	{	
		CCF4=0;
		wheelCountRight++;
	}
	
}

/********************************************************
函数功能:PWM0装载匹配值
入口参数:value		左臂向外张开的量值
定值参数:0xBF7F	左臂初始位置对应的PCA匹配值
*********************************************************/
void setPWM0(uint value)
{
	CCAP0L = low_byte(0xBF7F-value);    
	CCAP0H = high_byte(0xBF7F-value);   
}

/********************************************************
函数功能:PWM1装载匹配值
入口参数:value	中臂向后拉开的量值
定值参数:0xBBCF	中臂初始位置对应的PCA匹配值
*********************************************************/
void setPWM1(uint value)
{
	CCAP1L = low_byte(0xBBCF+value);    
	CCAP1H = high_byte(0xBBCF+value);   
}

/********************************************************
函数功能:PWM2装载匹配值
入口参数:value	右臂向外张开的量值
定值参数:0xBA6C	右臂初始位置对应的PCA匹配值
*********************************************************/
void setPWM2(uint value)
{
	CCAP2L = low_byte(0xBA6C+value);    
	CCAP2H = high_byte(0xBA6C+value);   
}

/***********************************************************************
函数功能:初始化PCA
入口参数:h		中臂向外张开的量值
定值参数:101	中臂从初始位置0到物品升到最高时的位置800之间均分成100份
************************************************************************/
void PWM_Init(void)
{
	PWM0=1;
    PWM1=1;
	PWM2=1;
	MCOUNTL=1;
	MCOUNTR=1;
	
	CMOD = 0x00;	//使能Timer PCA中断
	   
	EC = 1;      	//允许中断
	CH = 0xB7;		//Timer PCA中断周期为20ms
	CL = 0xFF;	 
	CCAPM3=0x51;	 
	CCAPM4=0x51;
	CR = 1;    
}

/***********************************************************************
函数功能:升高物品
入口参数:h		中臂向外张开的量值
定值参数:101	中臂从初始位置0到物品升到最高时的位置800之间均分成100份
************************************************************************/
void lift(uchar h)
{
	if(h>0&&h<=101)		//锁定高度于8*h
	{
		CCAPM1=0x4C;
		setPWM1(8*h);
	}
	else if(h==0)				//h=0,则松开
	{
		CCAPM1=0;
	}
}

/**************************************************************
函数功能:夹取物品
入口参数:a		双臂向外张开的量值
定值参数:101	双臂从初始位置0到90度角位置800之间均分成100份
***************************************************************/
void nip(uchar a)
{
	if(a>0&&a<=101)		//锁定张开角度于8*a
	{
		CCAPM0=0x4C;
		setPWM0(8*a);
		CCAPM2=0x4C;
		setPWM2(8*a);
	}
	else if(a==0)				//a=0,则松开
	{
		CCAPM0=0;
		CCAPM2=0;
	}
}


#endif

⌨️ 快捷键说明

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