|
|
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上的無記憶功能的走迷宮實(shí)驗(yàn)
- **
- **--------------------------------------------------------------------------------------------------------
- ** 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相關(guān)宏定義
- *********************************************************************************************************/
- #define IR_SIDE_LFT (1ul << 0) /* 左方傳感器輸出的信號(hào) */
- #define IR_DIG_LFT (1ul << 1) /* 左前方傳感器輸出的信號(hào) */
- #define IR_FRONT (1ul << 4) /* 前方傳感器輸出的信號(hào) */
- #define IR_DIG_RGT (1ul << 8) /* 右前方傳感器輸出的信號(hào) */
- #define IR_SIDE_RGT (1ul << 9) /* 右方傳感器輸出的信號(hào) */
- #define FRONT_SIDE_PWM_INDEX 1 /* 左前右驅(qū)動(dòng)傳感器PWM索引號(hào) */
- #define DIG_PWM_INDEX 2 /* 左前右前驅(qū)動(dòng)傳感器PWM索引號(hào) */
- #define PWM_RESET() PWM1TCR = 0x02 /* PWM復(fù)位 */
- #define PWM_START() PWM1TCR = 0x05 /* PWM使能 */
- #define PWM_FRQ_SET(x) PWM1MR0 = (FPCLK / (x)) /* PWM頻率設(shè)置 */
- #define FRONTSIDE_PWM_PULSE_SET(x) PWM1MR2 = (x) /* 左前右PWM占空比設(shè)置 */
- #define DIG_PWM_PULSE_SET(x) PWM1MR1 = (x) /* 左前右前PWM占空比設(shè)置 */
- #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 &= /* 配置傳感器檢測(cè)引腳為輸入 */\
- ~(IR_SIDE_LFT | IR_DIG_LFT | IR_FRONT | IR_DIG_RGT | IR_SIDE_RGT)
- #define IR_READ() FIO1PIN /* 紅外信號(hào)讀取 */
- /*********************************************************************************************************
- 電機(jī)相關(guān)宏定義
- *********************************************************************************************************/
- /*
- * 左電機(jī)接口
- */
- #define MT_LFT_A1 (1 << 2)
- #define MT_LFT_A2 (1 << 3)
- #define MT_LFT_B1 (1 << 4)
- #define MT_LFT_B2 (1 << 5)
- /*
- * 右電機(jī)接口
- */
- #define MT_RGT_A1 (1 << 25)
- #define MT_RGT_A2 (1 << 26)
- #define MT_RGT_B1 (1 << 28)
- #define MT_RGT_B2 (1 << 29)
- /*
- * 左電機(jī)拍數(shù)宏定義
- */
- #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
- /*
- * 右電機(jī)拍數(shù)宏定義
- */
- #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
- /*********************************************************************************************************
- 定時(shí)器宏定義
- *********************************************************************************************************/
- #define TIMER0_INT_CLR() T0IR = 0x01 /* 定時(shí)器0清中斷標(biāo)志 */
- #define TIMER1_INT_CLR() T1IR = 0x01 /* 定時(shí)器1清中斷標(biāo)志 */
- #define TIMER0_LOAD_SET(x) T0TCR = 0x02; /* 定時(shí)器0裝載值設(shè)定 */ \
- T0MR0 = x; \
- T0TCR = 0x01
- #define TIMER1_LOAD_SET(x) T1TCR = 0x02; /* 定時(shí)器1裝載值設(shè)定 */ \
- T1MR0 = x; \
- T1TCR = 0x01
- /*********************************************************************************************************
- 前進(jìn)一個(gè)迷宮格步進(jìn)電機(jī)需要走的步數(shù)宏定義
- *********************************************************************************************************/
- #define ONE_BLOCK 125
- /*********************************************************************************************************
- 電腦鼠狀態(tài)宏定義
- *********************************************************************************************************/
- #define STOP 0 /* 電腦鼠停止 */
- #define GO_AHEAD 1 /* 電腦鼠前進(jìn) */
- #define TURN_LEFT 3 /* 電腦鼠向左轉(zhuǎn) */
- #define TURN_RIGHT 4 /* 電腦鼠向右轉(zhuǎn) */
- #define TURN_BACK 5 /* 電腦鼠向后轉(zhuǎn) */
- /*********************************************************************************************************
- 傳感器宏定義
- *********************************************************************************************************/
- #define LEFT 0 /* 左方傳感器 */
- #define FRONTL 1 /* 左前方傳感器 */
- #define FRONT 2 /* 前方傳感器 */
- #define FRONTR 3 /* 右前方傳感器 */
- #define RIGHT 4 /* 右方傳感器 */
- /*********************************************************************************************************
- 電機(jī)狀態(tài)宏定義
- *********************************************************************************************************/
- #define MOTOR_STOP 0 /* 電機(jī)停止 */
- #define WAITONE_STEP 1 /* 電機(jī)暫停一步 */
- #define MOTOR_RUN 2 /* 電機(jī)運(yùn)行 */
- /*********************************************************************************************************
- 常量宏定義--電機(jī)運(yùn)行方向
- *********************************************************************************************************/
- #define MOTOR_GO_AHEAD 0 /* 電機(jī)前進(jìn) */
- #define MOTOR_GO_BACK 1 /* 電機(jī)后退 */
- /*********************************************************************************************************
- 結(jié)構(gòu)體定義
- *********************************************************************************************************/
- struct motor {
- volatile INT8S cState; /* 電機(jī)運(yùn)行狀態(tài) */
- volatile INT8S cDir; /* 電機(jī)運(yùn)行方向 */
- volatile INT32U ulPulse; /* 電機(jī)需要轉(zhuǎn)動(dòng)的步數(shù) */
- volatile INT32U ulPulseCtr; /* 電機(jī)已轉(zhuǎn)動(dòng)的步數(shù) */
- volatile INT32S lSpeed; /* 電機(jī)轉(zhuǎn)動(dòng)速度 */
- };
- typedef struct motor MOTOR;
- /*********************************************************************************************************
- 定義全局變量
- *********************************************************************************************************/
- static MOTOR GmRight = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0}; /* 定義并初始化右電機(jī)狀態(tài) */
- static MOTOR GmLeft = {MOTOR_STOP, MOTOR_GO_AHEAD, 0, 0, 0}; /* 定義并初始化左電機(jī)狀態(tài) */
-
- static volatile INT8U GucMouseState = STOP; /* 保存電腦鼠當(dāng)前運(yùn)行狀態(tài) */
- static INT32U GulAccelTable[300] = {0}; /* 電機(jī)加減速各階段定時(shí)器值 */
- static INT32S GlMaxSpeed = 60; /* 保存允許運(yùn)行的最大速度 */
- static volatile INT8U GucDistance[5] = {0}; /* 記錄傳感器狀態(tài) */
- /*********************************************************************************************************
- ** Function name: myDelay
- ** Descriptions: 軟件延時(shí)
- ** input parameters: 延時(shí)時(shí)間,單位為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: 左步進(jìn)電機(jī)驅(qū)動(dòng)時(shí)序
- ** input parameters: GmLeft.cDir :電機(jī)運(yùn)行方向
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void lftMtCtrl (void)
- {
- static INT8U ucRunStep = 0; /* 保存電機(jī)當(dāng)前位置 */
-
- switch (GmLeft.cDir) {
- case MOTOR_GO_AHEAD: /* 向前步進(jìn) */
- if (++ucRunStep >= 8) {
- ucRunStep = 0;
- }
- break;
- case MOTOR_GO_BACK: /* 向后步進(jìn) */
- if (--ucRunStep >= 8) { /* 溢出 */
- ucRunStep = 7;
- }
- break;
- default:
- break;
- }
-
- switch (ucRunStep) { /* 執(zhí)行步進(jìn)電機(jī)時(shí)序 */
- 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: 右步進(jìn)電機(jī)驅(qū)動(dòng)時(shí)序
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void rgtMtCtrl (void)
- {
- static INT8U ucRunStep = 0; /* 保存電機(jī)當(dāng)前位置 */
-
- switch (GmRight.cDir) {
- case MOTOR_GO_AHEAD: /* 向前步進(jìn) */
- if (--ucRunStep >= 8) { /* 溢出 */
- ucRunStep = 7;
- }
- break;
- case MOTOR_GO_BACK: /* 向后步進(jìn) */
- if (++ucRunStep >= 8) {
- ucRunStep = 0;
- }
- break;
- default:
- break;
- }
-
- switch (ucRunStep) { /* 執(zhí)行步進(jìn)電機(jī)時(shí)序 */
- 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: 左電機(jī)速度調(diào)節(jié)
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void lftMtSpeedCtrl (void)
- {
- INT32S lDownPusle;
-
- lDownPusle = GmLeft.ulPulse - GmLeft.ulPulseCtr; /* 統(tǒng)計(jì)電機(jī)還剩余的步數(shù) */
- if (lDownPusle <= GmLeft.lSpeed) {
- GmLeft.lSpeed--;
- } else { /* 非減速區(qū)間,則加速到最大值 */
- if (GmLeft.lSpeed < GlMaxSpeed) {
- GmLeft.lSpeed++;
- }
- }
- if (GmLeft.lSpeed < 0) { /* 設(shè)置速度下限 */
- GmLeft.lSpeed = 0;
- }
-
- TIMER0_LOAD_SET(GulAccelTable[GmLeft.lSpeed]); /* 設(shè)置定時(shí)時(shí)間 */
- }
- /*********************************************************************************************************
- ** Function name: rgtMtSpeedCtrl
- ** Descriptions: 右電機(jī)速度調(diào)節(jié)
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void rgtMtSpeedCtrl (void)
- {
- INT32S lDownPusle;
-
- lDownPusle = GmRight.ulPulse - GmRight.ulPulseCtr; /* 統(tǒng)計(jì)電機(jī)還剩余的步數(shù) */
- if (lDownPusle <= GmRight.lSpeed) {
- GmRight.lSpeed--;
- } else { /* 非減速區(qū)間,則加速到最大值 */
- if (GmRight.lSpeed < GlMaxSpeed) {
- GmRight.lSpeed++;
- } else {
- GmRight.lSpeed--;
- }
- }
- if (GmRight.lSpeed < 0) { /* 設(shè)置速度下限 */
- GmRight.lSpeed = 0;
- }
- TIMER1_LOAD_SET(GulAccelTable[GmRight.lSpeed]); /* 設(shè)置定時(shí)時(shí)間 */
- }
- /*********************************************************************************************************
- ** Function name: timer0Isr
- ** Descriptions: Timer0中斷服務(wù)函數(shù)
- ** input parameters: GmLeft.cState :驅(qū)動(dòng)步進(jìn)電機(jī)的時(shí)序狀態(tài)
- ** GmLeft.cDir :步進(jìn)電機(jī)運(yùn)動(dòng)的方向
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void timer0Isr(void)
- {
- static INT8S ucCnt1 = 0, ucCnt2 = 0; /* 修正姿態(tài)計(jì)數(shù)變量 */
- TIMER0_INT_CLR(); /* 清除中斷標(biāo)志 */
- switch (GmLeft.cState) {
- case MOTOR_STOP: /* 停止,同時(shí)清零速度和脈沖值 */
- GmLeft.lSpeed = 0;
- GmLeft.ulPulse = 0;
- GmLeft.ulPulseCtr = 0;
- break;
- case WAITONE_STEP: /* 暫停一步 */
- GmLeft.cState = MOTOR_RUN;
- break;
- case MOTOR_RUN: /* 電機(jī)運(yùn)行 */
- if (GucMouseState == GO_AHEAD) { /* 根據(jù)傳感器狀態(tài)微調(diào)電機(jī)位置 */
- 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) && /* 左遠(yuǎn)方有擋板 */\
- (GucDistance[RIGHT] == 0)) { /* 右方無擋板 */
- if(ucCnt2 == 3) {
- GmLeft.cState = WAITONE_STEP; /* 使下一步暫停 */
- }
- if (++ucCnt2 > 6) { /* 6步暫停一步 */
- ucCnt2 = 0;
- }
- } else {
- ucCnt2 = 0;
- }
- }
- lftMtCtrl(); /* 電機(jī)驅(qū)動(dòng)程序 */
- break;
- default:
- break;
- }
- /*
- * 是否完成任務(wù)判斷
- */
- if (GmLeft.cState != MOTOR_STOP) {
- GmLeft.ulPulseCtr++; /* 運(yùn)行脈沖計(jì)數(shù) */
- lftMtSpeedCtrl(); /* 速度調(diào)節(jié) */
- if (GmLeft.ulPulseCtr >= GmLeft.ulPulse) {
- GmLeft.cState = MOTOR_STOP;
- GmLeft.ulPulseCtr = 0;
- GmLeft.ulPulse = 0;
- GmLeft.lSpeed = 0;
- }
- }
- }
- /*********************************************************************************************************
- ** Function name: timer1Isr
- ** Descriptions: Timer1中斷服務(wù)函數(shù)
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void timer1Isr(void)
- {
- static INT8S ucCnt1 = 0, ucCnt2 = 0; /* 修正姿態(tài)計(jì)數(shù)變量 */
- TIMER1_INT_CLR(); /* 清除中斷標(biāo)志 */
-
- switch (GmRight.cState) {
- case MOTOR_STOP: /* 停止,同時(shí)清零速度和脈沖值 */
- GmRight.lSpeed = 0;
- GmRight.ulPulse = 0;
- GmRight.ulPulseCtr = 0;
- break;
- case WAITONE_STEP: /* 暫停一步 */
- GmRight.cState = MOTOR_RUN;
- break;
- case MOTOR_RUN: /* 電機(jī)運(yùn)行 */
- if (GucMouseState == GO_AHEAD) { /* 根據(jù)傳感器狀態(tài)微調(diào)電機(jī)位置 */
- 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) && /* 右遠(yuǎn)方有擋板 */\
- (GucDistance[LEFT] == 0)) { /* 左方無擋板 */
- if(ucCnt2 == 3) {
- GmRight.cState = WAITONE_STEP; /* 使下一步暫停 */
- }
- if (++ucCnt2 > 6) { /* 6步暫停一步 */
- ucCnt2 = 0;
- }
- } else {
- ucCnt2 = 0;
- }
- }
- rgtMtCtrl(); /* 推動(dòng)電機(jī)轉(zhuǎn)動(dòng)一步 */
- break;
- default:
- break;
- }
- /*
- * 是否完成任務(wù)判斷
- */
- if (GmRight.cState != MOTOR_STOP) {
- GmRight.ulPulseCtr++; /* 運(yùn)行脈沖計(jì)數(shù) */
- rgtMtSpeedCtrl(); /* 速度調(diào)節(jié) */
- if (GmRight.ulPulseCtr >= GmRight.ulPulse) {
- GmRight.cState = MOTOR_STOP;
- GmRight.ulPulseCtr = 0;
- GmRight.ulPulse = 0;
- GmRight.lSpeed = 0;
- }
- }
- }
- /*********************************************************************************************************
- ** Function name: irSend
- ** Descriptions: 紅外發(fā)射啟動(dòng)函數(shù)
- ** input parameters: ucIndex: 紅外發(fā)射索引號(hào)
- ** 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: 紅外線傳感器檢測(cè)。
- ** 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); /* 探測(cè)左右兩側(cè)近距 */
- irSend(DIG_PWM_INDEX, 35000); /* 驅(qū)動(dòng)斜角上的傳感器檢測(cè) */
- break;
- case 1:
- ulIRCheck = IR_READ(); /* 讀取傳感器狀態(tài) */
- FRONTSIDE_PWM_DIS(); /* 禁止PWM發(fā)生器2 */
- DIG_PWM_DIS(); /* 禁止PWM發(fā)生器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); /* 驅(qū)動(dòng)檢測(cè)左前右三個(gè)方向遠(yuǎn)距 */
-
- break;
- case 3:
- ulIRCheck = IR_READ(); /* 讀取傳感器狀態(tài) */
- FRONTSIDE_PWM_DIS(); /* 禁止PWM發(fā)生器2 */
- break;
- case 4:
- irSend(FRONT_SIDE_PWM_INDEX, 36000); /* 重復(fù)檢測(cè)左前右三個(gè)方向遠(yuǎn)距 */
- break;
- case 5:
- ulIRCheck &= IR_READ(); /* 讀取傳感器狀態(tài) */
- FRONTSIDE_PWM_DIS(); /* 禁止PWM發(fā)生器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); /* 延時(shí)10ms消抖動(dòng) */
- if (KEY_PRESS()) { /* 按鍵按下 */
- delayMs(10); /* 延時(shí)10ms消抖動(dòng) */
- while(!KEY_PRESS()); /* 等待按鍵釋放 */
- return (true);
- }
- }
- return (false);
- }
- /*********************************************************************************************************
- ** Function name: sysTickIsr
- ** Descriptions: 定時(shí)中斷掃描。
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void sysTickIsr(void)
- {
- static INT32S lLft = 0, lRgt = 0;
-
- /*
- * 如果左電機(jī)長(zhǎng)時(shí)間停止,則斷電
- */
- if (GmLeft.cState == MOTOR_STOP) {
- lLft++;
- } else {
- lLft = 0;
- }
- if (lLft >= 500) {
- MT_LFT_OFF();
- }
- /*
- * 如果右電機(jī)長(zhǎng)時(shí)間停止,則斷電
- */
- if (GmRight.cState == MOTOR_STOP) {
- lRgt++;
- } else {
- lRgt = 0;
- }
- if (lRgt >= 500) {
- MT_RGT_OFF();
- }
- /*
- * 紅外線檢測(cè)
- */
- irCheck();
- }
- /*********************************************************************************************************
- ** Function name: sensorInit
- ** Descriptions: 傳感器控制初始化
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void sensorInit (void)
- {
- IR_PIN_MODE_IN(); /* 紅外檢測(cè)引腳配置為輸入引腳 */
-
- PWM1TCR = 0x02; /* 復(fù)位PWM1定時(shí)器 */
- PWM1TC = 0; /* 定時(shí)器設(shè)置為0 */
- PWM1PR = 0; /* 時(shí)鐘不分頻 */
- PWM1MCR = 0x02; /* 設(shè)置PWMMR0匹配后復(fù)位PWMTC, */
- /* 并產(chǎn)生中斷標(biāo)志 */
- PWM1MR0 = FPCLK / 38000; /* 38KHz頻率 */
- PWM1MR1 = FPCLK / 38000 / 2;
- PWM1MR2 = FPCLK / 38000 / 2;
- PWM1PCR &= ~((1 << 9) | (1 << 10)); /* 禁止輸出 */
- PWM1TCR = 0x05; /* 啟動(dòng)定時(shí)器 */
- }
- /*********************************************************************************************************
- ** Function name: stepMotorIint
- ** Descriptions: 步進(jìn)電機(jī)控制初始化
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void stepMotorIint (void)
- {
- INT32U n;
- /*
- * 設(shè)置驅(qū)動(dòng)步進(jìn)電機(jī)的八個(gè)I/O口為輸出模式
- */
- FIO1DIR |= (1 << 25) | (1 << 26) | (1 << 28) | (1 << 29);
- FIO2DIR |= (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5);
- /*
- * 對(duì)左右電機(jī)轉(zhuǎn)動(dòng)的位置初始化
- */
- MT_LFT_STEP1_SET();
- MT_RGT_STEP1_SET();
- /*
- * 初始化加速/減速時(shí)定時(shí)器加載值的數(shù)據(jù)表
- * C0=F*sqrt(2/w) , W=1000時(shí),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));
- }
- /*
- * 初始化定時(shí)器0,用來控制左電機(jī)的轉(zhuǎn)速
- */
- T0TCR = 0x02;
- T0IR = 1;
- T0CTCR = 0;
- T0TC = 0;
- T0PR = 0;
- T0MR0 = GulAccelTable[0]; /* 裝載值 */
- T0MCR = 0x03; /* 匹配后產(chǎn)生中斷 */
-
- zyIsrSet(NVIC_TIMER0, (unsigned long)timer0Isr, PRIO_THREE); /* 設(shè)置中斷并使能 */
- T0TCR = 0x01; /* 啟動(dòng)定時(shí)器0 */ /* 使能定時(shí)器0 */
-
- /*
- * 初始化定時(shí)器1,用來控制右電機(jī)的轉(zhuǎn)速
- */
- T1TCR = 0x02;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
MicroMouse_高級(jí)實(shí)驗(yàn).zip
(137.56 KB, 下載次數(shù): 10)
2018-10-1 16:36 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|