📄 motor.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 + -