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
|