這個是我們電腦鼠的程序,可以用IAR下的流明諾瑞驅動庫進行編譯調試
單片機源程序如下:
- /****************************************Copyright (c)****************************************************
- ** Guangzhou ZHIYUAN electronics Co.,LTD.
- **--------------File Info---------------------------------------------------------------------------------
- ** File Name: main.c
- ** Last modified Date: 2008/02/14
- ** Last Version: V1.00
- ** Description: MicroMouse615上的無記憶功能的走迷宮實驗
- **
- **--------------------------------------------------------------------------------------------------------
- ** Created By: 廖茂剛
- ** Created date:
- ** Version:
- ** Descriptions:
- **
- **--------------------------------------------------------------------------------------------------------
- ** Modified by:
- ** Modified date:
- ** Version:
- ** Description:
- **
- *********************************************************************************************************/
- /*********************************************************************************************************
- 包含頭文件
- *********************************************************************************************************/
- #include "hw_memmap.h"
- #include "hw_ints.h"
- #include "hw_types.h"
- #include "interrupt.h"
- #include "gpio.h"
- #include "sysctl.h"
- #include "Systick.h"
- #include "Timer.h"
- #include "adc.h"
- #include "Pwm.h"
- #include "Type.h"
- #include "Zlg7289.h"
- /*********************************************************************************************************
- PB端口定義
- *********************************************************************************************************/
- #define IRSEND_BEVEL GPIO_PIN_0 /* 驅動斜角紅外的調制信號 */
- #define LEFTSIDE GPIO_PIN_1 /* 左方傳感器輸出的信號 */
- #define FRONTSIDE_L GPIO_PIN_2 /* 左前方傳感器輸出的信號 */
- #define FRONTSIDE GPIO_PIN_3 /* 前方傳感器輸出的信號 */
- #define FRONTSIDE_R GPIO_PIN_4 /* 右前方傳感器輸出的信號 */
- #define RIGHTSIDE GPIO_PIN_5 /* 右方傳感器輸出的信號 */
- /*********************************************************************************************************
- PC端口定義
- *********************************************************************************************************/
- #define KEY GPIO_PIN_4 /* 按鍵連接的端口 */
- /*********************************************************************************************************
- PD端口定義
- *********************************************************************************************************/
- #define PHRA1 GPIO_PIN_0 /* 右側步進電機的A1相 */
- #define PHRA2 GPIO_PIN_1 /* 右側步進電機的A2相 */
- #define PHRB1 GPIO_PIN_2 /* 右側步進電機的B1相 */
- #define PHRB2 GPIO_PIN_3 /* 右側步進電機的B2相 */
- #define PHLA1 GPIO_PIN_4 /* 左側步進電機的A1相 */
- #define PHLA2 GPIO_PIN_5 /* 左側步進電機的A2相 */
- #define PHLB1 GPIO_PIN_6 /* 左側步進電機的B1相 */
- #define PHLB2 GPIO_PIN_7 /* 左側步進電機的B2相 */
- /*********************************************************************************************************
- PE端口定義
- *********************************************************************************************************/
- #define IRSEND_SIDE GPIO_PIN_0 /* 驅動左前右正向紅外發射 */
- /*********************************************************************************************************
- 常量宏定義 -- 迷宮類型
- *********************************************************************************************************/
- #define MAZETYPE 8 /* 8: 四分之一迷宮;16: 全迷宮 */
- /*********************************************************************************************************
- 常量宏定義--前進一個迷宮格步進電機需要走的步數
- *********************************************************************************************************/
- #define ONEBLOCK 125
- /*********************************************************************************************************
- 常量宏定義--電腦鼠狀態
- *********************************************************************************************************/
- #define STOP 0 /* 電腦鼠停止 */
- #define GOAHEAD 1 /* 電腦鼠前進 */
- #define TURNLEFT 3 /* 電腦鼠向左轉 */
- #define TURNRIGHT 4 /* 電腦鼠向右轉 */
- #define TURNBACK 5 /* 電腦鼠向后轉 */
- /*********************************************************************************************************
- 常量宏定義--傳感器
- *********************************************************************************************************/
- #define LEFT 0 /* 左方傳感器 */
- #define FRONTL 1 /* 左前方傳感器 */
- #define FRONT 2 /* 前方傳感器 */
- #define FRONTR 3 /* 右前方傳感器 */
- #define RIGHT 4 /* 右方傳感器 */
- /*********************************************************************************************************
- 常量宏定義--電機狀態
- *********************************************************************************************************/
- #define MOTORSTOP 0 /* 電機停止 */
- #define WAITONESTEP 1 /* 電機暫停一步 */
- #define MOTORRUN 2 /* 電機運行 */
- /*********************************************************************************************************
- 常量宏定義--電機運行方向
- *********************************************************************************************************/
- #define MOTORGOAHEAD 0 /* 電機前進 */
- #define MOTORGOBACK 1 /* 電機后退 */
- /*********************************************************************************************************
- 結構體定義
- *********************************************************************************************************/
- struct motor {
- int8 cState; /* 電機運行狀態 */
- int8 cDir; /* 電機運行方向 */
- uint32 uiPulse; /* 電機需要轉動的步數 */
- uint32 uiPulseCtr; /* 電機已轉動的步數 */
- int32 iSpeed; /* 電機轉動速度 */
- };
- typedef struct motor MOTOR;
- /*********************************************************************************************************
- 定義全局變量
- *********************************************************************************************************/
- static MOTOR GmRight = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0}; /* 定義并初始化右電機狀態 */
- static MOTOR GmLeft = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0}; /* 定義并初始化左電機狀態 */
-
- static uint8 GucMouseState = STOP; /* 保存電腦鼠當前運行狀態 */
- static uint32 GuiAccelTable[300] = {0}; /* 電機加減速各階段定時器值 */
- static int32 GiMaxSpeed = 70; /* 保存允許運行的最大速度 */
- static uint8 GucDistance[5] = {0}; /* 記錄傳感器狀態 */
- /*********************************************************************************************************
- ** Function name: delay
- ** Descriptions: 延時函數
- ** input parameters: uiD :延時參數,值越大,延時越久
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void delay (uint32 uiD)
- {
- for (; uiD; uiD--);
- }
- /*********************************************************************************************************
- ** Function name: rightMotorContr
- ** Descriptions: 右步進電機驅動時序
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void rightMotorContr (void)
- {
- static int8 cStep = 0; /* 保存電機當前位置 */
-
- switch (GmRight.cDir) {
- case MOTORGOAHEAD: /* 向前步進 */
- cStep = (cStep + 1) % 8;
- break;
- case MOTORGOBACK: /* 向后步進 */
- cStep = (cStep + 7) % 8;
- break;
- default:
- break;
- }
-
- switch (cStep) {
- case 0: /* A2B2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA1 | PHRA2 | PHRB1 | PHRB2);
- break;
- case 1: /* A2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA1 | PHRA2);
- break;
- case 2: /* A2B1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA1 | PHRA2 | PHRB2);
- break;
- case 3: /* B1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRB2);
- break;
- case 4: /* A1B1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA2 | PHRB2);
- break;
- case 5: /* A1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA2);
- break;
- case 6: /* A1B2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA2 | PHRB1 | PHRB2);
- break;
- case 7: /* B2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRB1 | PHRB2);
- break;
- default:
- break;
- }
- }
- /*********************************************************************************************************
- ** Function name: leftMotorContr
- ** Descriptions: 左步進電機驅動時序
- ** input parameters: GmLeft.cDir :電機運行方向
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void leftMotorContr (void)
- {
- static int8 cStep = 0; /* 保存電機當前位置 */
-
- switch (GmLeft.cDir) {
-
- case MOTORGOAHEAD: /* 向前步進 */
- cStep = (cStep + 1) % 8;
- break;
-
- case MOTORGOBACK: /* 向后步進 */
- cStep = (cStep + 7) % 8;
- break;
-
- default:
- break;
- }
-
- switch (cStep) {
- case 0: /* A2B2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA1 | PHLA2 | PHLB1 | PHLB2);
- break;
- case 1: /* B2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLB1 | PHLB2);
- break;
- case 2: /* A1B2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA2 | PHLB1 | PHLB2);
- break;
- case 3: /* A1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA2);
- break;
- case 4: /* A1B1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA2 | PHLB2);
- break;
- case 5: /* B1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLB2);
- break;
- case 6: /* A2B1 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA1 | PHLA2 | PHLB2);
- break;
- case 7: /* A2 */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA1 | PHLA2);
- break;
- default:
- break;
- }
- }
- /*********************************************************************************************************
- ** Function name: speedContrR
- ** Descriptions: 右電機速度調節
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void speedContrR (void)
- {
- int32 iDPusle;
-
- iDPusle = GmRight.uiPulse - GmRight.uiPulseCtr; /* 統計電機還剩余的步數 */
- if (iDPusle <= GmRight.iSpeed) {
- GmRight.iSpeed--;
- } else { /* 非減速區間,則加速到最大值 */
- if (GmRight.iSpeed < GiMaxSpeed) {
- GmRight.iSpeed++;
- } else {
- GmRight.iSpeed--;
- }
- }
- if (GmRight.iSpeed < 0) { /* 設置速度下限 */
- GmRight.iSpeed = 0;
- }
- TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[GmRight.iSpeed]); /* 設置定時時間 */
- }
- /*********************************************************************************************************
- ** Function name: speedContrL
- ** Descriptions: 左電機速度調節
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void speedContrL (void)
- {
- int32 iDPusle;
-
- iDPusle = GmLeft.uiPulse - GmLeft.uiPulseCtr; /* 統計電機還剩余的步數 */
- if (iDPusle <= GmLeft.iSpeed) {
- GmLeft.iSpeed--;
- } else { /* 非減速區間,則加速到最大值 */
- if (GmLeft.iSpeed < GiMaxSpeed) {
- GmLeft.iSpeed++;
- }
- }
- if (GmLeft.iSpeed < 0) { /* 設置速度下限 */
- GmLeft.iSpeed = 0;
- }
- TimerLoadSet(TIMER1_BASE,TIMER_A,GuiAccelTable[GmLeft.iSpeed]); /* 設置定時時間 */
- }
- /*********************************************************************************************************
- ** Function name: Timer0A_ISR
- ** Descriptions: Timer0中斷服務函數
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void Timer0A_ISR(void)
- {
- static int8 n = 0,m = 0;
-
- TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 清除定時器0中斷。 */
- switch (GmRight.cState) {
-
- case MOTORSTOP: /* 停止,同時清零速度和脈沖值 */
- GmRight.iSpeed = 0;
- GmRight.uiPulse = 0;
- GmRight.uiPulseCtr = 0;
- break;
- case WAITONESTEP: /* 暫停一步 */
- GmRight.cState = MOTORRUN;
- break;
- case MOTORRUN: /* 電機運行 */
- if (GucMouseState == GOAHEAD) { /* 根據傳感器狀態微調電機位置 */
- if (GucDistance[FRONTL] && (GucDistance[FRONTR] == 0)) { /* 左前方有障礙,且前方無擋板 */
- if (n == 1) {
- GmRight.cState = WAITONESTEP; /* 下一次電機暫停 */
- }
- n++;
- n %= 2;
- } else {
- n = 0;
- }
- if ((GucDistance[RIGHT] == 1) && (GucDistance[LEFT] == 0)) {/* 離右擋板太遠,且左方無擋板 */
- if(m == 3) {
- GmRight.cState = WAITONESTEP; /* 下一次電機暫停 */
- }
- m++;
- m %= 6;
- } else {
- m = 0;
- }
- }
- rightMotorContr(); /* 推動電機轉動一步 */
- break;
- default:
- break;
- }
- /*
- * 是否完成任務判斷
- */
- if (GmRight.cState != MOTORSTOP) {
- GmRight.uiPulseCtr++; /* 運行脈沖計數 */
- speedContrR(); /* 速度調節 */
- if (GmRight.uiPulseCtr >= GmRight.uiPulse) {
- GmRight.cState = MOTORSTOP;
- GmRight.uiPulseCtr = 0;
- GmRight.uiPulse = 0;
- GmRight.iSpeed = 0;
- }
- }
- }
- /*********************************************************************************************************
- ** Function name: Timer1A_ISR
- ** Descriptions: Timer1中斷服務函數
- ** input parameters: GmLeft.cState :驅動步進電機的時序狀態
- ** GmLeft.cDir :步進電機運動的方向
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void Timer1A_ISR(void)
- {
- static int8 n = 0, m = 0;
-
- TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); /* 清除定時器1中斷。 */
- switch (GmLeft.cState) {
-
- case MOTORSTOP: /* 停止,同時清零速度和脈沖值 */
- GmLeft.iSpeed = 0;
- GmLeft.uiPulse = 0;
- GmLeft.uiPulseCtr = 0;
- break;
-
- case WAITONESTEP: /* 暫停一步 */
- GmLeft.cState = MOTORRUN;
- break;
- case MOTORRUN: /* 電機運行 */
- if (GucMouseState == GOAHEAD) { /* 根據傳感器狀態微調電機位置 */
- if (GucDistance[FRONTR] &&(GucDistance[FRONTL]==0)) {
- if (n == 1) {
- GmLeft.cState = WAITONESTEP;
- }
- n++;
- n %= 2;
- } else {
- n = 0;
- }
- if ((GucDistance[LEFT] == 1) && (GucDistance[RIGHT] == 0)) {
- if(m == 3) {
- GmLeft.cState = WAITONESTEP;
- }
- m++;
- m %= 6;
- } else {
- m = 0;
- }
- }
- leftMotorContr(); /* 電機驅動程序 */
- break;
- default:
- break;
- }
- /*
- * 是否完成任務判斷
- */
- if (GmLeft.cState != MOTORSTOP) {
- GmLeft.uiPulseCtr++; /* 運行脈沖計數 */
- speedContrL(); /* 速度調節 */
- if (GmLeft.uiPulseCtr >= GmLeft.uiPulse) {
- GmLeft.cState = MOTORSTOP;
- GmLeft.uiPulseCtr = 0;
- GmLeft.uiPulse = 0;
- GmLeft.iSpeed = 0;
- }
- }
- }
- /*********************************************************************************************************
- ** Function name: irSendFreq
- ** Descriptions: 發送紅外線。
- ** input parameters: uiFreq: 紅外線調制頻率
- ** cNumber: 選擇需要設置的PWM模塊
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void irSendFreq (uint32 uiFreq, int8 cNumber)
- {
- uiFreq = SysCtlClockGet() / uiFreq;
- switch (cNumber) {
- case 1:
- PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, uiFreq); /* 設置PWM發生器1的周期 */
- PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, uiFreq / 2); /* 設置PWM2輸出的脈沖寬度 */
- PWMGenEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM發生器1 */
- break;
- case 2:
- PWMGenPeriodSet(PWM_BASE, PWM_GEN_2, uiFreq); /* 設置PWM發生器2的周期 */
- PWMPulseWidthSet(PWM_BASE, PWM_OUT_4, uiFreq / 2); /* 設置PWM4輸出的脈沖寬度 */
- PWMGenEnable(PWM_BASE, PWM_GEN_2); /* 使能PWM發生器2 */
- break;
- default:
- break;
- }
- }
- /*********************************************************************************************************
- ** Function name: irCheck
- ** Descriptions: 紅外線傳感器檢測。
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void irCheck (void)
- {
- static uint8 ucState = 0;
- static uint8 ucIRCheck;
-
- switch (ucState) {
- case 0:
- irSendFreq(32200, 2); /* 探測左右兩側近距 */
- irSendFreq(35000, 1); /* 驅動斜角上的傳感器檢測 */
- break;
-
- case 1:
- ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x3e); /* 讀取傳感器狀態 */
- PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
- PWMGenDisable(PWM_BASE, PWM_GEN_1); /* 禁止PWM發生器1 */
- if (ucIRCheck & RIGHTSIDE) {
- GucDistance[RIGHT] &= 0xfd;
- } else {
- GucDistance[RIGHT] |= 0x02;
- }
- if (ucIRCheck & LEFTSIDE) {
- GucDistance[LEFT] &= 0xfd;
- } else {
- GucDistance[LEFT] |= 0x02;
- }
- if (ucIRCheck & FRONTSIDE_R) {
- GucDistance[FRONTR] = 0x00;
- } else {
- GucDistance[FRONTR] = 0x01;
- }
- if (ucIRCheck & FRONTSIDE_L) {
- GucDistance[FRONTL] = 0x00;
- } else {
- GucDistance[FRONTL] = 0x01;
- }
- break;
- case 2:
- irSendFreq(36000, 2); /* 驅動檢測左前右三個方向遠距 */
- break;
-
- case 3:
- ucIRCheck = GPIOPinRead(GPIO_PORTB_BASE, 0x2a); /* 讀取傳感器狀態 */
- PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
- break;
- case 4:
- irSendFreq(36000, 2); /* 重復檢測左前右三個方向遠距 */
- break;
-
- case 5:
- ucIRCheck &= GPIOPinRead(GPIO_PORTB_BASE, 0x2a); /* 讀取傳感器狀態 */
- PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
- if (ucIRCheck & RIGHTSIDE) {
- GucDistance[RIGHT] &= 0xfe;
- } else {
- GucDistance[RIGHT] |= 0x01;
- }
- if (ucIRCheck & LEFTSIDE) {
- GucDistance[LEFT] &= 0xfe;
- } else {
- GucDistance[LEFT] |= 0x01;
- }
- if (ucIRCheck & FRONTSIDE) {
- GucDistance[FRONT] &= 0xfe;
- } else {
- GucDistance[FRONT] |= 0x01;
- }
- break;
- default:
- break;
- }
- ucState = (ucState + 1) % 6; /* 循環檢測 */
- }
- /*********************************************************************************************************
- ** Function name: mazeSearch
- ** Descriptions: 迷宮搜索,若發現分支路或者前方有擋板則退出
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void mazeSearch(void)
- {
- int8 cL = 0, cR = 0;
- /*
- * 設定運行任務
- */
- GucMouseState = GOAHEAD;
- GmRight.cDir = MOTORGOAHEAD;
- GmLeft.cDir = MOTORGOAHEAD;
- GmRight.uiPulse = MAZETYPE * ONEBLOCK;
- GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
- GmRight.cState = MOTORRUN;
- GmLeft.cState = MOTORRUN;
-
- while (GmLeft.cState != MOTORSTOP) {
- if (GucDistance[FRONT]) { /* 前方有墻 */
- /*
- * 設置繼續前進的步數,以實現能停止在單元格中心的目的
- */
- GmRight.uiPulse = GmRight.uiPulseCtr + 70;
- GmLeft.uiPulse = GmLeft.uiPulseCtr + 70;
- /*
- * 反復檢測前方傳感器的狀態,以消除誤判
- */
- while (GucDistance[FRONT]) {
- if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
- goto End; /* 跳出循環,跳到程序結束處 */
- }
- }
- /*
- * 程序執行到此步表明出現誤判,則重新設定電機運行任務
- */
- GmRight.uiPulse = MAZETYPE * ONEBLOCK;
- GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
- }
- if (cL) { /* 是否允許檢測左邊 */
- if ((GucDistance[LEFT] & 0x01) == 0) { /* 左邊有支路 */
- /*
- * 設置繼續前進的步數,以實現能停止在單元格中心的目的
- */
- GmRight.uiPulse = GmRight.uiPulseCtr + 74;
- GmLeft.uiPulse = GmLeft.uiPulseCtr + 74;
- /*
- * 反復檢測前方傳感器的狀態,以消除誤判
- */
- while ((GucDistance[LEFT] & 0x01) == 0) {
- if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
- goto End; /* 跳出循環,跳到程序結束處 */
- }
- }
- /*
- * 程序執行到此步表明出現誤判,則重新設定電機運行任務
- */
- GmRight.uiPulse = MAZETYPE * ONEBLOCK;
- GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
- }
- } else { /* 左邊有墻時開始允許檢測左邊 */
- if ( GucDistance[LEFT] & 0x01) {
- cL = 1;
- }
- }
- if (cR) { /* 是否允許檢測右邊 */
- if ((GucDistance[RIGHT] & 0x01) == 0) { /* 右邊有支路 */
- /*
- * 設置繼續前進的步數,以實現能停止在單元格中心的目的
- */
- GmRight.uiPulse = GmRight.uiPulseCtr + 74;
- GmLeft.uiPulse = GmLeft.uiPulseCtr + 74;
- /*
- * 反復檢測前方傳感器的狀態,以消除誤判
- */
- while ((GucDistance[ RIGHT] & 0x01) == 0) {
- if ((GmLeft.uiPulseCtr + 50) > GmLeft.uiPulse) {
- goto End; /* 跳出循環,跳到程序結束處 */
- }
- }
- /*
- * 程序執行到此步表明出現誤判,則重新設定電機運行任務
- */
- GmRight.uiPulse = MAZETYPE * ONEBLOCK;
- GmLeft.uiPulse = MAZETYPE * ONEBLOCK;
- }
- } else {
- if ( GucDistance[RIGHT] & 0x01) { /* 右邊有墻時開始允許檢測右邊 */
- cR = 1;
- }
- }
- }
- End:;
- }
- /*********************************************************************************************************
- ** Function name: mouseTurnright
- ** Descriptions: 右轉
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void mouseTurnright(void)
- {
- /*
- * 等待停止
- */
- while (GmLeft.cState != MOTORSTOP);
- while (GmRight.cState != MOTORSTOP);
-
- GucMouseState = TURNRIGHT; /* 標記電腦鼠的運行狀態 */
- /*
- * 開始右轉
- */
- GmRight.cDir = MOTORGOBACK; /* 控制右輪向后轉動 */
- GmRight.uiPulse = 41; /* 設定右輪轉動的步數 */
-
- GmLeft.cDir = MOTORGOAHEAD; /* 控制左輪向前轉動 */
- GmLeft.uiPulse = 41; /* 設定左輪轉動的步數 */
-
- GmRight.cState = MOTORRUN; /* 使能右輪轉動 */
- GmLeft.cState = MOTORRUN; /* 使能左輪轉動 */
- /*
- * 等待右轉完成
- */
- while (GmLeft.cState != MOTORSTOP);
- while (GmRight.cState != MOTORSTOP);
- }
- /*********************************************************************************************************
- ** Function name: mouseTurnleft
- ** Descriptions: 左轉
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void mouseTurnleft(void)
- {
- /*
- * 等待停止
- */
- while (GmLeft.cState != MOTORSTOP);
- while (GmRight.cState != MOTORSTOP);
-
- GucMouseState = TURNLEFT; /* 標記電腦鼠的運行狀態 */
- /*
- * 開始左轉
- */
- GmRight.cDir = MOTORGOAHEAD; /* 控制右輪向前轉動 */
- GmRight.uiPulse = 41; /* 設定右輪轉動的步數 */
-
- GmLeft.cDir = MOTORGOBACK; /* 控制左輪向后轉動 */
- GmLeft.uiPulse = 41; /* 設定左輪轉動的步數 */
-
- GmRight.cState = MOTORRUN; /* 使能右輪轉動 */
- GmLeft.cState = MOTORRUN; /* 使能左輪轉動 */
- /*
- * 等待左轉完成
- */
- while (GmLeft.cState != MOTORSTOP);
- while (GmRight.cState != MOTORSTOP);
- }
- /*********************************************************************************************************
- ** Function name: mouseTurnback
- ** Descriptions: 后轉
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void mouseTurnback(void)
- {
- /*
- * 等待停止
- */
- while (GmLeft.cState != MOTORSTOP);
- while (GmRight.cState != MOTORSTOP);
-
- GucMouseState = TURNBACK;
- /*
- * 開始后轉
- */
- GmRight.cDir = MOTORGOBACK;
- GmRight.uiPulse = 81;
-
- GmLeft.cDir = MOTORGOAHEAD;
- GmLeft.uiPulse = 81;
-
- GmLeft.cState = MOTORRUN;
- GmRight.cState = MOTORRUN;
- /*
- * 等待后轉完成
- */
- while (GmLeft.cState != MOTORSTOP);
- while (GmRight.cState != MOTORSTOP);
- }
- /*********************************************************************************************************
- ** Function name: keyCheck
- ** Descriptions: 讀取按鍵
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: true: 按鍵已按下
- ** false: 按鍵未按下
- *********************************************************************************************************/
- uint8 keyCheck (void)
- {
- if (GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0) {
- delay(50);
- while(GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0);
- return(true);
- }else {
- return(false);
- }
- }
- /*********************************************************************************************************
- ** Function name: SysTick_ISR
- ** Descriptions: 定時中斷掃描。
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void SysTick_ISR(void)
- {
- static int32 iL = 0, iR = 0;
-
- /*
- * 如果左電機長時間停止,則斷電
- */
- if (GmLeft.cState == MOTORSTOP) {
- iL++;
- } else {
- iL = 0;
- }
- if (iL >= 500) {
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- 0x00);
- }
- /*
- * 如果右電機長時間停止,則斷電
- */
- if (GmRight.cState == MOTORSTOP) {
- iR++;
- } else {
- iR = 0;
- }
- if (iR >= 500) {
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- 0x00);
- }
- /*
- * 紅外線檢測
- */
- irCheck();
- }
- /*********************************************************************************************************
- ** Function name: wallCheck
- ** Descriptions: 根據傳感器檢測結果判斷是否存在墻壁
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: ucWall: 低三位從左到右一次代表左前右。1為有墻,0為沒墻。
- *********************************************************************************************************/
- uint8 wallCheck (void)
- {
- uint8 ucWall = 0;
-
- if (GucDistance[LEFT] & 0x01) {
- ucWall |= 0x04;
- }else {
- ucWall &= ~0x04;
- }
- if (GucDistance[FRONT] & 0x01) {
- ucWall |= 0x02;
- }else {
- ucWall &= ~0x02;
- }
- if (GucDistance[RIGHT] & 0x01) {
- ucWall |= 0x01;
- }else {
- ucWall &= ~0x01;
- }
- return(ucWall);
- }
- /*********************************************************************************************************
- ** Function name: voltageDetect
- ** Descriptions: 電壓檢測,檢測結果在7289 EX BOARD 上顯示出來
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void voltageDetect (void)
- {
- unsigned long ulVoltage;
-
- ADCProcessorTrigger(ADC_BASE, 0); /* 處理器觸發一次A/D轉換 */
- while (!ADCIntStatus(ADC_BASE, 0, false)); /* 等待轉換結束 */
- ADCIntClear(ADC_BASE, 0); /* 清除中斷標準位 */
- ADCSequenceDataGet(ADC_BASE, 0, &ulVoltage); /* 讀取轉換結果 */
-
- ulVoltage = ulVoltage * 3000 / 1023; /* 計算實際檢測到的電壓值(mV) */
- ulVoltage = ulVoltage * 3 + 350; /* 計算電池電壓值(mV) */
-
- zlg7289Download(0,6,1,(ulVoltage % 10000) / 1000); /* 顯示電壓值整數部分,單位V */
- zlg7289Download(0,7,0,(ulVoltage % 1000 ) / 100 ); /* 顯示電壓值小數部分,單位V */
- }
- /*********************************************************************************************************
- ** Function name: sensorInit
- ** Descriptions: 傳感器控制初始化
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void sensorInit (void)
- {
- /*
- * 設置連接到傳感器信號輸出腳的I/O口為輸入模式
- */
- GPIODirModeSet(GPIO_PORTB_BASE,
- LEFTSIDE |
- FRONTSIDE_L |
- FRONTSIDE |
- FRONTSIDE_R |
- RIGHTSIDE,
- GPIO_DIR_MODE_IN);
- /*
- * 用PWM驅動紅外線發射頭產生調制的紅外線信號
- */
- SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /* 使能PWM模塊 */
- SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM時鐘配置:不分頻 */
- /*
- * 初始化PWM2,該PWM驅動斜角紅外發射頭
- */
- GPIOPinTypePWM(GPIO_PORTB_BASE, IRSEND_BEVEL); /* PB0配置為PWM功能 */
- PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM發生器1 */
- PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); /* 加計數,立即更新 */
- PWMOutputState(PWM_BASE, PWM_OUT_2_BIT, true); /* 使能PWM2輸出 */
- PWMGenDisable(PWM_BASE, PWM_GEN_1); /* 禁止PWM發生器1 */
- /*
- * 初始化PWM4,該PWM驅動左前右正方向紅外發射頭
- */
- GPIOPinTypePWM(GPIO_PORTE_BASE, IRSEND_SIDE); /* PE0配置為PWM功能 */
- PWMGenConfigure(PWM_BASE, PWM_GEN_2, /* 配置PWM發生器2 */
- PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); /* 加計數,立即更新 */
- PWMOutputState(PWM_BASE, PWM_OUT_4_BIT, true); /* 使能PWM4輸出 */
- PWMGenDisable(PWM_BASE, PWM_GEN_2); /* 禁止PWM發生器2 */
- }
- /*********************************************************************************************************
- ** Function name: stepMotorIint
- ** Descriptions: 步進電機控制初始化
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void stepMotorIint (void)
- {
- uint16 n = 0;
- /*
- * 設置驅動步進電機的八個I/O口為輸出模式
- */
- GPIODirModeSet(GPIO_PORTD_BASE,
- PHRA1 |
- PHRA2 |
- PHRB1 |
- PHRB2 |
- PHLA1 |
- PHLA2 |
- PHLB1 |
- PHLB2,
- GPIO_DIR_MODE_OUT);
- /*
- * 對左右電機轉動的位置初始化
- */
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHRA1 | PHRA2 | PHRB1 | PHRB2,
- PHRA1 | PHRA2 | PHRB1 | PHRB2);
-
- GPIOPinWrite(GPIO_PORTD_BASE,
- PHLA1 | PHLA2 | PHLB1 | PHLB2,
- PHLA1 | PHLA2 | PHLB1 | PHLB2);
- /*
- * 初始化加速/減速時定時器加載值的數據表
- */
- GuiAccelTable[0] = 2236068;
- GuiAccelTable[1] = 926179;
- for(n = 2; n < 300; n++) {
- GuiAccelTable[n] = GuiAccelTable[n - 1] - (2 * GuiAccelTable[n - 1] / (4 * n + 1));
- }
- /*
- * 初始化定時器0,用來控制右電機的轉速
- */
- SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); /* 使能定時器0模塊 */
- TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); /* 配置為32位周期計數模式 */
- TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[0]); /* 設置定時時間 */
- TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 設置為溢出中斷 */
- IntEnable(INT_TIMER0A); /* 使能定時器0中斷 */
- TimerEnable(TIMER0_BASE, TIMER_A); /* 使能定時器0 */
-
- /*
- * 初始化定時器1,用來控制電機的轉速
- */
- SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); /* 使能定時器1模塊 */
- TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); /* 配置為32位周期計數模式 */
- TimerLoadSet(TIMER1_BASE, TIMER_A, GuiAccelTable[0]); /* 設置定時時間 */
- TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); /* 設置為溢出中斷 */
- IntEnable(INT_TIMER1A); /* 使能定時器1中斷 */
- TimerEnable(TIMER1_BASE, TIMER_A); /* 使能定時器1 */
- }
- /*********************************************************************************************************
- ** Function name: keyInit
- ** Descriptions: 對連接按鍵的GPIO口初始化
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void keyInit (void)
- {
- GPIODirModeSet(GPIO_PORTC_BASE, KEY, GPIO_DIR_MODE_IN); /* 設置按鍵口為輸入 */
- }
- /*********************************************************************************************************
- ** Function name: sysTickInit
- ** Descriptions: 系統節拍定時器初始化。
- ** input parameters: 無
- ** output parameters: 無
- ** Returned value: 無
- *********************************************************************************************************/
- void sysTickInit (void)
- {
- SysTickPeriodSet(SysCtlClockGet() / 1600); /* 設置定時時鐘為625us */
- SysTickEnable(); /* 使能系統時鐘 */
- SysTickIntEnable(); /* 使能系統時鐘中斷 */
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電腦鼠程序.rar
(74.78 KB, 下載次數: 35)
2018-4-2 21:36 上傳
點擊文件名下載附件
電腦鼠程序 下載積分: 黑幣 -5
|