欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1