标题:
MicroMouse高级实验源码
[打印本页]
作者:
Dawn科技
时间:
2018-10-1 16:37
标题:
MicroMouse高级实验源码
MicroMouse源程序如下:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2011-03-11
** Last Version: V1.01
** Descriptions: The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by: 廖茂刚
** Created date: 2008-02-14
** Version: V1.00
** Descriptions: MicroMouse615上的无记忆功能的走迷宫实验
**
**--------------------------------------------------------------------------------------------------------
** Modified by: FanLinyun
** Modified date: 2011-03-11
** Version: V1.01
** Descriptions: 移植到MicroMouse1752上
**
** Rechecked by:
*********************************************************************************************************/
#include "..\config.h"
/*********************************************************************************************************
按键宏定义
*********************************************************************************************************/
#define KEY (1 << 6) /* 按键连接的端口 */
#define KEY_PRESS() (!(FIO2PIN & KEY)) /* 按键是否按下判断 */
/*********************************************************************************************************
IR相关宏定义
*********************************************************************************************************/
#define IR_SIDE_LFT (1ul << 0) /* 左方传感器输出的信号 */
#define IR_DIG_LFT (1ul << 1) /* 左前方传感器输出的信号 */
#define IR_FRONT (1ul << 4) /* 前方传感器输出的信号 */
#define IR_DIG_RGT (1ul << 8) /* 右前方传感器输出的信号 */
#define IR_SIDE_RGT (1ul << 9) /* 右方传感器输出的信号 */
#define FRONT_SIDE_PWM_INDEX 1 /* 左前右驱动传感器PWM索引号 */
#define DIG_PWM_INDEX 2 /* 左前右前驱动传感器PWM索引号 */
#define PWM_RESET() PWM1TCR = 0x02 /* PWM复位 */
#define PWM_START() PWM1TCR = 0x05 /* PWM使能 */
#define PWM_FRQ_SET(x) PWM1MR0 = (FPCLK / (x)) /* PWM频率设置 */
#define FRONTSIDE_PWM_PULSE_SET(x) PWM1MR2 = (x) /* 左前右PWM占空比设置 */
#define DIG_PWM_PULSE_SET(x) PWM1MR1 = (x) /* 左前右前PWM占空比设置 */
#define FRONTSIDE_PWM_EN() PWM1PCR |= (1 << 10) /* 左前右PWM输出使能 */
#define DIG_PWM_EN() PWM1PCR |= (1 << 9) /* 左前右前PWM输出使能 */
#define FRONTSIDE_PWM_DIS() PWM1PCR &= ~(1 << 10) /* 左前右PWM输出禁能 */
#define DIG_PWM_DIS() PWM1PCR &= ~(1 << 9) /* 左前右前PWM输出禁能 */
#define IR_PIN_MODE_IN() FIO1DIR &= /* 配置传感器检测引脚为输入 */\
~(IR_SIDE_LFT | IR_DIG_LFT | IR_FRONT | IR_DIG_RGT | IR_SIDE_RGT)
#define IR_READ() FIO1PIN /* 红外信号读取 */
/*********************************************************************************************************
电机相关宏定义
*********************************************************************************************************/
/*
* 左电机接口
*/
#define MT_LFT_A1 (1 << 2)
#define MT_LFT_A2 (1 << 3)
#define MT_LFT_B1 (1 << 4)
#define MT_LFT_B2 (1 << 5)
/*
* 右电机接口
*/
#define MT_RGT_A1 (1 << 25)
#define MT_RGT_A2 (1 << 26)
#define MT_RGT_B1 (1 << 28)
#define MT_RGT_B2 (1 << 29)
/*
* 左电机拍数宏定义
*/
#define MT_LFT_OFF() FIO2CLR = (MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2)
#define MT_LFT_STEP1_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_A1
#define MT_LFT_STEP2_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_A1 | MT_LFT_B1
#define MT_LFT_STEP3_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_B1
#define MT_LFT_STEP4_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_A2 | MT_LFT_B1
#define MT_LFT_STEP5_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_A2
#define MT_LFT_STEP6_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_A2 | MT_LFT_B2
#define MT_LFT_STEP7_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_B2
#define MT_LFT_STEP8_SET() FIO2CLR = MT_LFT_A1 | MT_LFT_A2 | MT_LFT_B1 | MT_LFT_B2; \
FIO2SET = MT_LFT_A1 | MT_LFT_B2
/*
* 右电机拍数宏定义
*/
#define MT_RGT_OFF() FIO1CLR = (MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2)
#define MT_RGT_STEP1_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_A1
#define MT_RGT_STEP2_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_A1 | MT_RGT_B1
#define MT_RGT_STEP3_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_B1
#define MT_RGT_STEP4_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_A2 | MT_RGT_B1
#define MT_RGT_STEP5_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_A2
#define MT_RGT_STEP6_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_A2 | MT_RGT_B2
#define MT_RGT_STEP7_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_B2
#define MT_RGT_STEP8_SET() FIO1CLR = MT_RGT_A1 | MT_RGT_A2 | MT_RGT_B1 | MT_RGT_B2; \
FIO1SET = MT_RGT_A1 | MT_RGT_B2
/*********************************************************************************************************
定时器宏定义
*********************************************************************************************************/
#define TIMER0_INT_CLR() T0IR = 0x01 /* 定时器0清中断标志 */
#define TIMER1_INT_CLR() T1IR = 0x01 /* 定时器1清中断标志 */
#define TIMER0_LOAD_SET(x) T0TCR = 0x02; /* 定时器0装载值设定 */ \
T0MR0 = x; \
T0TCR = 0x01
#define TIMER1_LOAD_SET(x) T1TCR = 0x02; /* 定时器1装载值设定 */ \
T1MR0 = x; \
T1TCR = 0x01
/*********************************************************************************************************
前进一个迷宫格步进电机需要走的步数宏定义
*********************************************************************************************************/
#define ONE_BLOCK 125
/*********************************************************************************************************
电脑鼠状态宏定义
*********************************************************************************************************/
#define STOP 0 /* 电脑鼠停止 */
#define GO_AHEAD 1 /* 电脑鼠前进 */
#define TURN_LEFT 3 /* 电脑鼠向左转 */
#define TURN_RIGHT 4 /* 电脑鼠向右转 */
#define TURN_BACK 5 /* 电脑鼠向后转 */
/*********************************************************************************************************
传感器宏定义
*********************************************************************************************************/
#define LEFT 0 /* 左方传感器 */
#define FRONTL 1 /* 左前方传感器 */
#define FRONT 2 /* 前方传感器 */
#define FRONTR 3 /* 右前方传感器 */
#define RIGHT 4 /* 右方传感器 */
/*********************************************************************************************************
电机状态宏定义
*********************************************************************************************************/
#define MOTOR_STOP 0 /* 电机停止 */
#define WAITONE_STEP 1 /* 电机暂停一步 */
#define MOTOR_RUN 2 /* 电机运行 */
/*********************************************************************************************************
常量宏定义--电机运行方向
*********************************************************************************************************/
#define MOTOR_GO_AHEAD 0 /* 电机前进 */
#define MOTOR_GO_BACK 1 /* 电机后退 */
/*********************************************************************************************************
结构体定义
*********************************************************************************************************/
struct motor {
volatile INT8S cState; /* 电机运行状态 */
volatile INT8S cDir; /* 电机运行方向 */
volatile INT32U ulPulse; /* 电机需要转动的步数 */
volatile INT32U ulPulseCtr; /* 电机已转动的步数 */
volatile INT32S lSpeed; /* 电机转动速度 */
};
typedef struct motor MOTOR;
/*********************************************************************************************************
定义全局变量
*********************************************************************************************************/
static MOTOR GmRight = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0}; /* 定义并初始化右电机状态 */
static MOTOR GmLeft = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0}; /* 定义并初始化左电机状态 */
static volatile INT8U GucMouseState = STOP; /* 保存电脑鼠当前运行状态 */
static INT32U GulAccelTable[300] = {0}; /* 电机加减速各阶段定时器值 */
static INT32S GlMaxSpeed = 60; /* 保存允许运行的最大速度 */
static volatile INT8U GucDistance[5] = {0}; /* 记录传感器状态 */
/*********************************************************************************************************
** Function name: myDelay
** Descriptions: 软件延时
** input parameters: 延时时间,单位为us
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delayMs(INT32U ulTime)
{
INT32U i;
while (ulTime--) {
for (i = 0; i < (FCCLK / 1000 / 3); i++);
}
}
/*********************************************************************************************************
** Function name: lftMtCtrl
** Descriptions: 左步进电机驱动时序
** input parameters: GmLeft.cDir :电机运行方向
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void lftMtCtrl (void)
{
static INT8U ucRunStep = 0; /* 保存电机当前位置 */
switch (GmLeft.cDir) {
case MOTOR_GO_AHEAD: /* 向前步进 */
if (++ucRunStep >= 8) {
ucRunStep = 0;
}
break;
case MOTOR_GO_BACK: /* 向后步进 */
if (--ucRunStep >= 8) { /* 溢出 */
ucRunStep = 7;
}
break;
default:
break;
}
switch (ucRunStep) { /* 执行步进电机时序 */
case 0:
MT_LFT_STEP1_SET();
break;
case 1:
MT_LFT_STEP2_SET();
break;
case 2:
MT_LFT_STEP3_SET();
break;
case 3:
MT_LFT_STEP4_SET();
break;
case 4:
MT_LFT_STEP5_SET();
break;
case 5:
MT_LFT_STEP6_SET();
break;
case 6:
MT_LFT_STEP7_SET();
break;
case 7:
MT_LFT_STEP8_SET();
break;
default:
break;
}
}
/*********************************************************************************************************
** Function name: rgtMtCtrl
** Descriptions: 右步进电机驱动时序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void rgtMtCtrl (void)
{
static INT8U ucRunStep = 0; /* 保存电机当前位置 */
switch (GmRight.cDir) {
case MOTOR_GO_AHEAD: /* 向前步进 */
if (--ucRunStep >= 8) { /* 溢出 */
ucRunStep = 7;
}
break;
case MOTOR_GO_BACK: /* 向后步进 */
if (++ucRunStep >= 8) {
ucRunStep = 0;
}
break;
default:
break;
}
switch (ucRunStep) { /* 执行步进电机时序 */
case 0:
MT_RGT_STEP1_SET();
break;
case 1:
MT_RGT_STEP2_SET();
break;
case 2:
MT_RGT_STEP3_SET();
break;
case 3:
MT_RGT_STEP4_SET();
break;
case 4:
MT_RGT_STEP5_SET();
break;
case 5:
MT_RGT_STEP6_SET();
break;
case 6:
MT_RGT_STEP7_SET();
break;
case 7:
MT_RGT_STEP8_SET();
break;
default:
break;
}
}
/*********************************************************************************************************
** Function name: lftMtSpeedCtrl
** Descriptions: 左电机速度调节
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void lftMtSpeedCtrl (void)
{
INT32S lDownPusle;
lDownPusle = GmLeft.ulPulse - GmLeft.ulPulseCtr; /* 统计电机还剩余的步数 */
if (lDownPusle <= GmLeft.lSpeed) {
GmLeft.lSpeed--;
} else { /* 非减速区间,则加速到最大值 */
if (GmLeft.lSpeed < GlMaxSpeed) {
GmLeft.lSpeed++;
}
}
if (GmLeft.lSpeed < 0) { /* 设置速度下限 */
GmLeft.lSpeed = 0;
}
TIMER0_LOAD_SET(GulAccelTable[GmLeft.lSpeed]); /* 设置定时时间 */
}
/*********************************************************************************************************
** Function name: rgtMtSpeedCtrl
** Descriptions: 右电机速度调节
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void rgtMtSpeedCtrl (void)
{
INT32S lDownPusle;
lDownPusle = GmRight.ulPulse - GmRight.ulPulseCtr; /* 统计电机还剩余的步数 */
if (lDownPusle <= GmRight.lSpeed) {
GmRight.lSpeed--;
} else { /* 非减速区间,则加速到最大值 */
if (GmRight.lSpeed < GlMaxSpeed) {
GmRight.lSpeed++;
} else {
GmRight.lSpeed--;
}
}
if (GmRight.lSpeed < 0) { /* 设置速度下限 */
GmRight.lSpeed = 0;
}
TIMER1_LOAD_SET(GulAccelTable[GmRight.lSpeed]); /* 设置定时时间 */
}
/*********************************************************************************************************
** Function name: timer0Isr
** Descriptions: Timer0中断服务函数
** input parameters: GmLeft.cState :驱动步进电机的时序状态
** GmLeft.cDir :步进电机运动的方向
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void timer0Isr(void)
{
static INT8S ucCnt1 = 0, ucCnt2 = 0; /* 修正姿态计数变量 */
TIMER0_INT_CLR(); /* 清除中断标志 */
switch (GmLeft.cState) {
case MOTOR_STOP: /* 停止,同时清零速度和脉冲值 */
GmLeft.lSpeed = 0;
GmLeft.ulPulse = 0;
GmLeft.ulPulseCtr = 0;
break;
case WAITONE_STEP: /* 暂停一步 */
GmLeft.cState = MOTOR_RUN;
break;
case MOTOR_RUN: /* 电机运行 */
if (GucMouseState == GO_AHEAD) { /* 根据传感器状态微调电机位置 */
if (GucDistance[FRONTR] && /* 前右方有挡板 */\
(GucDistance[FRONTL]==0)) { /* 前左方无挡板 */
if (ucCnt1 == 1) {
GmLeft.cState = WAITONE_STEP; /* 使下一步暂停 */
}
if (++ucCnt1 > 3) { /* 3步暂停一步 */
ucCnt1 = 0;
}
} else {
ucCnt1 = 0;
}
if ((GucDistance[LEFT] == 1) && /* 左远方有挡板 */\
(GucDistance[RIGHT] == 0)) { /* 右方无挡板 */
if(ucCnt2 == 3) {
GmLeft.cState = WAITONE_STEP; /* 使下一步暂停 */
}
if (++ucCnt2 > 6) { /* 6步暂停一步 */
ucCnt2 = 0;
}
} else {
ucCnt2 = 0;
}
}
lftMtCtrl(); /* 电机驱动程序 */
break;
default:
break;
}
/*
* 是否完成任务判断
*/
if (GmLeft.cState != MOTOR_STOP) {
GmLeft.ulPulseCtr++; /* 运行脉冲计数 */
lftMtSpeedCtrl(); /* 速度调节 */
if (GmLeft.ulPulseCtr >= GmLeft.ulPulse) {
GmLeft.cState = MOTOR_STOP;
GmLeft.ulPulseCtr = 0;
GmLeft.ulPulse = 0;
GmLeft.lSpeed = 0;
}
}
}
/*********************************************************************************************************
** Function name: timer1Isr
** Descriptions: Timer1中断服务函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void timer1Isr(void)
{
static INT8S ucCnt1 = 0, ucCnt2 = 0; /* 修正姿态计数变量 */
TIMER1_INT_CLR(); /* 清除中断标志 */
switch (GmRight.cState) {
case MOTOR_STOP: /* 停止,同时清零速度和脉冲值 */
GmRight.lSpeed = 0;
GmRight.ulPulse = 0;
GmRight.ulPulseCtr = 0;
break;
case WAITONE_STEP: /* 暂停一步 */
GmRight.cState = MOTOR_RUN;
break;
case MOTOR_RUN: /* 电机运行 */
if (GucMouseState == GO_AHEAD) { /* 根据传感器状态微调电机位置 */
if (GucDistance[FRONTL] && /* 前左方有挡板 */\
(GucDistance[FRONTR]==0)) { /* 前右方无挡板 */
if (ucCnt1 == 1) {
GmRight.cState = WAITONE_STEP; /* 使下一步暂停 */
}
if (++ucCnt1 > 3) { /* 3步暂停一步 */
ucCnt1 = 0;
}
} else {
ucCnt1 = 0;
}
if ((GucDistance[RIGHT] == 1) && /* 右远方有挡板 */\
(GucDistance[LEFT] == 0)) { /* 左方无挡板 */
if(ucCnt2 == 3) {
GmRight.cState = WAITONE_STEP; /* 使下一步暂停 */
}
if (++ucCnt2 > 6) { /* 6步暂停一步 */
ucCnt2 = 0;
}
} else {
ucCnt2 = 0;
}
}
rgtMtCtrl(); /* 推动电机转动一步 */
break;
default:
break;
}
/*
* 是否完成任务判断
*/
if (GmRight.cState != MOTOR_STOP) {
GmRight.ulPulseCtr++; /* 运行脉冲计数 */
rgtMtSpeedCtrl(); /* 速度调节 */
if (GmRight.ulPulseCtr >= GmRight.ulPulse) {
GmRight.cState = MOTOR_STOP;
GmRight.ulPulseCtr = 0;
GmRight.ulPulse = 0;
GmRight.lSpeed = 0;
}
}
}
/*********************************************************************************************************
** Function name: irSend
** Descriptions: 红外发射启动函数
** input parameters: ucIndex: 红外发射索引号
** ulFreq : 红外载波频率
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void irSend (INT8U ucIndex, INT32U ulFreq)
{
switch (ucIndex) {
case FRONT_SIDE_PWM_INDEX:
PWM_RESET();
PWM_FRQ_SET(ulFreq);
FRONTSIDE_PWM_PULSE_SET(FPCLK / ulFreq / 2);
PWM_START();
FRONTSIDE_PWM_EN();
break;
case DIG_PWM_INDEX:
PWM_RESET();
PWM_FRQ_SET(ulFreq);
DIG_PWM_PULSE_SET(FPCLK / ulFreq / 2);
PWM_START();
DIG_PWM_EN();
break;
default:
break;
}
}
/*********************************************************************************************************
** Function name: irCheck
** Descriptions: 红外线传感器检测。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void irCheck (void)
{
static INT8U ucState = 0;
static INT32U ulIRCheck;
switch (ucState) {
case 0:
irSend(FRONT_SIDE_PWM_INDEX, 32200); /* 探测左右两侧近距 */
irSend(DIG_PWM_INDEX, 35000); /* 驱动斜角上的传感器检测 */
break;
case 1:
ulIRCheck = IR_READ(); /* 读取传感器状态 */
FRONTSIDE_PWM_DIS(); /* 禁止PWM发生器2 */
DIG_PWM_DIS(); /* 禁止PWM发生器1 */
if (ulIRCheck & IR_SIDE_LFT) {
GucDistance[LEFT] &= 0xfd;
} else {
GucDistance[LEFT] |= 0x02;
}
if (ulIRCheck & IR_DIG_LFT) {
GucDistance[FRONTL] = 0x00;
} else {
GucDistance[FRONTL] = 0x01;
}
if (ulIRCheck & IR_DIG_RGT) {
GucDistance[FRONTR] = 0x00;
} else {
GucDistance[FRONTR] = 0x01;
}
if (ulIRCheck & IR_SIDE_RGT) {
GucDistance[RIGHT] &= 0xfd;
} else {
GucDistance[RIGHT] |= 0x02;
}
break;
case 2:
irSend(FRONT_SIDE_PWM_INDEX, 36000); /* 驱动检测左前右三个方向远距 */
break;
case 3:
ulIRCheck = IR_READ(); /* 读取传感器状态 */
FRONTSIDE_PWM_DIS(); /* 禁止PWM发生器2 */
break;
case 4:
irSend(FRONT_SIDE_PWM_INDEX, 36000); /* 重复检测左前右三个方向远距 */
break;
case 5:
ulIRCheck &= IR_READ(); /* 读取传感器状态 */
FRONTSIDE_PWM_DIS(); /* 禁止PWM发生器2 */
if (ulIRCheck & IR_SIDE_LFT) {
GucDistance[LEFT] &= 0xfe;
} else {
GucDistance[LEFT] |= 0x01;
}
if (ulIRCheck & IR_FRONT) {
GucDistance[FRONT] &= 0xfe;
} else {
GucDistance[FRONT] |= 0x01;
}
if (ulIRCheck & IR_SIDE_RGT) {
GucDistance[RIGHT] &= 0xfe;
} else {
GucDistance[RIGHT] |= 0x01;
}
break;
default:
break;
}
if (++ucState >= 6) {
ucState = 0;
}
}
/*********************************************************************************************************
** Function name: keyCheck
** Descriptions: 读取按键
** input parameters: 无
** output parameters: 无
** Returned value: true: 按键已按下
** false: 按键未按下
*********************************************************************************************************/
BOOLEAN keyCheck (void)
{
if (KEY_PRESS()) { /* 按键按下 */
delayMs(10); /* 延时10ms消抖动 */
if (KEY_PRESS()) { /* 按键按下 */
delayMs(10); /* 延时10ms消抖动 */
while(!KEY_PRESS()); /* 等待按键释放 */
return (true);
}
}
return (false);
}
/*********************************************************************************************************
** Function name: sysTickIsr
** Descriptions: 定时中断扫描。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void sysTickIsr(void)
{
static INT32S lLft = 0, lRgt = 0;
/*
* 如果左电机长时间停止,则断电
*/
if (GmLeft.cState == MOTOR_STOP) {
lLft++;
} else {
lLft = 0;
}
if (lLft >= 500) {
MT_LFT_OFF();
}
/*
* 如果右电机长时间停止,则断电
*/
if (GmRight.cState == MOTOR_STOP) {
lRgt++;
} else {
lRgt = 0;
}
if (lRgt >= 500) {
MT_RGT_OFF();
}
/*
* 红外线检测
*/
irCheck();
}
/*********************************************************************************************************
** Function name: sensorInit
** Descriptions: 传感器控制初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void sensorInit (void)
{
IR_PIN_MODE_IN(); /* 红外检测引脚配置为输入引脚 */
PWM1TCR = 0x02; /* 复位PWM1定时器 */
PWM1TC = 0; /* 定时器设置为0 */
PWM1PR = 0; /* 时钟不分频 */
PWM1MCR = 0x02; /* 设置PWMMR0匹配后复位PWMTC, */
/* 并产生中断标志 */
PWM1MR0 = FPCLK / 38000; /* 38KHz频率 */
PWM1MR1 = FPCLK / 38000 / 2;
PWM1MR2 = FPCLK / 38000 / 2;
PWM1PCR &= ~((1 << 9) | (1 << 10)); /* 禁止输出 */
PWM1TCR = 0x05; /* 启动定时器 */
}
/*********************************************************************************************************
** Function name: stepMotorIint
** Descriptions: 步进电机控制初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void stepMotorIint (void)
{
INT32U n;
/*
* 设置驱动步进电机的八个I/O口为输出模式
*/
FIO1DIR |= (1 << 25) | (1 << 26) | (1 << 28) | (1 << 29);
FIO2DIR |= (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
/*
* 对左右电机转动的位置初始化
*/
MT_LFT_STEP1_SET();
MT_RGT_STEP1_SET();
/*
* 初始化加速/减速时定时器加载值的数据表
* C0=F*sqrt(2/w) , W=1000时,sqrt(2/w) = 0.04472136
* C1 = 0.4142*C0
*/
GulAccelTable[0] = (INT32U)(FPCLK * 0.04472136);
GulAccelTable[1] = (INT32U)((unsigned long long)GulAccelTable[0] * 4142 / 10000);
for(n = 2; n < 300; n++) {
GulAccelTable[n] = GulAccelTable[n - 1] - (2 * GulAccelTable[n - 1] / (4 * n + 1));
}
/*
* 初始化定时器0,用来控制左电机的转速
*/
T0TCR = 0x02;
T0IR = 1;
T0CTCR = 0;
T0TC = 0;
T0PR = 0;
T0MR0 = GulAccelTable[0]; /* 装载值 */
T0MCR = 0x03; /* 匹配后产生中断 */
zyIsrSet(NVIC_TIMER0, (unsigned long)timer0Isr, PRIO_THREE); /* 设置中断并使能 */
T0TCR = 0x01; /* 启动定时器0 */ /* 使能定时器0 */
/*
* 初始化定时器1,用来控制右电机的转速
*/
T1TCR = 0x02;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
MicroMouse_高级实验.zip
(137.56 KB, 下载次数: 10)
2018-10-1 16:36 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1