wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区
標題:
單片機循跡小車完整資料 包括注釋詳細的程序和硬件設計
[打印本頁]
作者:
睡神456
時間:
2020-4-19 18:17
標題:
單片機循跡小車完整資料 包括注釋詳細的程序和硬件設計
資料大家看吧!截圖截得不全。
~])L8P]P[EPFS_ZAMS(51heiHI.png
(45.08 KB, 下載次數: 93)
下載附件
2020-4-19 18:16 上傳
單片機源程序如下:
/***************************************************/
/* 尋跡小車 FollowMe 項目 */
/* —— 主控程序軌跡控制模塊 */
/* 之程序部分 */
/* 20060905 */
/* By DingQi */
/***************************************************/
// 注:以下文檔的 TAB 為 2 個字符!
/*------------------------------------------------------------------------
此程序為"尋跡小車FollowMe"項目中單板控制模式的走軌跡控制部分,附帶相關調試功能。
要實現:
1)接收各種調試命令,并解析;
2)通過串口反饋所需的調試信息;
3)獲取軌跡采樣部分處理后的信息,產生對策,發給電機驅動部分實施。
根據上述要實現的功能,通訊部分歸此模塊管理。
第一步先將原來的電機驅動功能整合到一個MCU中,將原來的通訊功能從電機驅動模塊中分解出來。
目前的電機控制由串口實現,通訊協議定義如下:
1、幀格式:
幀頭(2字節) 幀長(1字節) 命令字(1字節) 數據區(N字節)校驗和(1字節)
其中:
幀頭 —— 0x55 0xAA
幀長 —— 命令字 + 數據區的長度
命令字 —— 0x01 :電機轉動控制參數,開環模式,電機的PWM值、轉動持續脈沖數;
0x02 :電機轉動控制參數,閉環模式,電機的轉速、轉動持續脈沖數;
0x03 :電機工作參數,PWM頻率、PID參數
數據區 —— 命令01:電機1數據(2字節PWM值,2字節轉動持續脈沖數)電機2數據(2字節PWM值,2字節轉動持續脈沖數),共 8字節;
命令02:電機1數據(2字節轉速值,2字節轉動持續脈沖數)電機2數據(2字節轉速值,2字節轉動持續脈沖數),共 8字節;
命令03:2字節PWM頻率,2字節比例系數,2字節積分系數,2字節微分系數,2字節PID系數的分母, 共10字節,兩個電機驅動器相同;
校驗和 —— 從命令字開始到數據區結束所有字節的算術和的反碼,取低字節。
上述數據中,PWM值,速度值、PWM頻率、PID系數等定義如下:
PWM值 —— 2字節有符號數,正對應正轉,負對應反轉,數值為占空比的百分數,
取值范圍:- 1000 —— +1000, 對應 0.1% ~ 100%;1001為電機“惰行”,1002為“剎車”;
轉動持續脈沖數 —— 2字節無符號數,0 表示連續轉動;
轉速值 —— 2字節有符號數,正對應正轉,負對應反轉,單位為:0.1轉/每分鐘;
取值范圍:- 10000~ +10000,10001為電機“惰行”,10002為“剎車”;
PWM頻率 —— 2字節整數,單位Hz,取值范圍:200 – 2000;
PID系數 —— 均為 2字節無符號數;
PID系數分母 —— 2字節無符號數,為避免使用浮點數而增加了此參數,實際作用的PID系數為上述值除此值;
如:比例系數為190 ,PID分母為200,實際比例系數為0.95。
以上所有2字節的數據均為先低后高。
暫時不設計應答幀,因為一幀命令包含了兩個電機的驅動數據。
通訊數據格式為:19200 8 N 1。
此時,一幀數據約占 7ms。
為了調試,添加轉速讀取命令 0x04 ,原來的讀轉速命令是分開實現的:
0x55 0xAA 0x02(幀長) 0x04 (讀轉速命令) 電機序號(1字節)校驗和(1字節)
對應的返回幀為:
0xAA 0x55 0x04(幀長) 0x84 (轉速值返回) 電機序號(1字節)轉速(2字節)校驗和(1字節)
因為合并到一個MCU中了,所以對應將協議改為:
0x55 0xAA 0x01(幀長) 0x04 (讀轉速命令) 校驗和(1字節)
對應的返回幀為:
0xAA 0x55 0x05(幀長) 0x84 (轉速值返回) 電機1轉速(2字節)電機2轉速(2字節)校驗和(1字節)
因為集成了走軌跡控制功能,所以要添加一個控制命令,使小車啟動,進入到走軌跡狀態或結束走軌跡的狀態。
走軌跡控制命令: 0x05 . 命令參數 —— 1 啟動走軌跡, 2 —— 啟動走直線 ,0 停止,
命令幀為:
0x55 0xAA 0x02 0x05 0x01 CS —— 啟動走軌跡命令
0x55 0xAA 0x02 0x05 0x02 CS —— 啟動直線走命令
0x55 0xAA 0x02 0x05 0x00 CS —— 停止命令
為了調試方便,增加一個內存數據讀取命令:
內存數據讀取命令:0x06
命令幀為:
0x55 0xAA 0x04 0x06 讀數據低地址 讀數據高地址 讀數據長度 CS
返回幀為:
0x55 0xAA 幀長 0x86 讀數據低地址 讀數據高地址 讀數據長度 數據N字節 CS
------------------------------------------------------------------------
因為用雙輪驅動的小車由于電機等驅動元素的差異,導致走直線成為問題,故在此嘗試
用這兩個簡易的碼盤來實現直線行走。
因為碼盤的分辨率太低,所以直接用脈沖計數方式控制似乎有些不夠精確,所以考慮用
兩路脈沖的觸發時間差別來控制。
實質上這是一種周期測量的變換,因為不能保證每個脈沖周期是真實的(即由于干擾會
導致某個周期變大或變小),所以用累計的方式消除之。
具體的方式如下:
設立兩個 4 字節的計數器,2字節紀錄PCA的溢出值,2字節紀錄 PCA 的計時器值,這樣
構成了一個對PCA計數脈沖(Fosc/2)的長整形計數器,可紀錄約 388秒(2^32/11.0592M),
這個值一般可以應付大部分比賽項目中的需要。
將這個時間計數器作為兩個輪子采樣脈沖(只取下降沿)的時標,根據兩者的差值確定兩輪
的驅動差。也就是要保證兩個輪子對應脈沖到達的時間相同,這樣,如果沒有漏計或打滑,兩
個輪子行走的距離應當是一樣的,軌跡也應當是直線!
這個控制也可以考慮使用PID控制,其控制的量為兩個計數器的差值,定值為“0”。
------------------------------------------------------------------------*/
#pragma PR
#pragma OT(5,size)
#pragma Listinclude
#pragma code
#include <E:\dingqi\keilc51\inc\math.h>
#include <STC12C5410AD.h> /* STC12C5410AD 的頭文件*/
#include <Port_Def.H>
#include <ComConst.H>
#include <LC_Const.H>
#include <LC_Var.H>
void init_SIO(unsigned char baud); // 初始化串口
void rcvdata_proc(void); // 接收數據幀
void getCommandData(void); // 從數據幀中取出命令數據
unsigned int calStopCntValue(unsigned int uiRun_Num,unsigned char No); // 根據命令中的行走脈沖數計算出停止點
char setMotorStat(int iRunValue); // 根據命令中的PWM值或轉速設置電機狀態
void followLineControl(void); // 走軌跡控制
void straightRun(void); // 走直線控制
/******************************** 外部調用函數 *********************************/
// 以下函數為公共函數,需要在調用的模塊中聲明。
/********************************************/
/* 名稱:init_LineCtrl_Hardware */
/* 用途:初始化串口等, 以保證相應硬件工作 */
/********************************************/
void init_LineCtrl_Hardware(void)
{
//初始化串口
init_SIO(B_19200);
// 初始化相關中斷
IE = IE|EnUART_C; // 允許 UART 中斷
}
/********************************************/
/* 名稱:init_LineCtrl_Var */
/* 用途:初始化自身工作變量 */
/********************************************/
void init_LineCtrl_Var(void)
{
unsigned char j;
// 接收數據變量初始化
gi_ucSavePtr=0;
gi_ucGetPtr=0;
gb_NewData = FALSE;
gb_StartRcv = FALSE;
gb_DataOK = FALSE;
// 命令數據存放單元初始化
for(j=0;j<2;j++)
{
ga_iPWM_Value[j] = FLOAT_PWM;
ga_iRotateSpeed[j] = FLOAT_SPEED;
ga_uiRotateNum[j] = 0;
}
g_uiPWM_Freq = INIT_PWM_FREQ; // 初始化時,將PWM的頻率置為 200Hz
gb_M1CalOutValue = TRUE; // 上電計算一次輸出,以保證電機的正常工作狀態
gb_M2CalOutValue = TRUE; // 上電計算一次輸出,以保證電機的正常工作狀態
// PID 控制初始化
g_uiKp = DEFAULT_KP; // 加載默認系數
g_uiTi = DEFAULT_TI;
g_uiTd = DEFAULT_TD;
g_uiPID_Ratio = DEFAULT_PID_RATIO;
g_fKp = ((float)g_uiKp)/g_uiPID_Ratio; // 在此處計算好,減少每次 PID 的運算量
g_fTi = ((float)g_uiTi)/g_uiPID_Ratio;
g_fTd = ((float)g_uiTd)/g_uiPID_Ratio;
gb_EnablePID = FALSE; // 禁止調速 PID 功能
gb_StartLineFollow = FALSE;
gb_StartStraightRun = FALSE;
g_ucDownSampCnt = 0; // 初始化時將脈沖采樣計數清為“0”
}
/********************************************/
/* 名稱:lineCtrl_proc */
/* 用途:軌跡控制部分處理入口函數,根據帶入 */
/* 的消息作相應處理。 */
/*入口參數:要處理的消息 */
/********************************************/
void lineCtrl_proc(unsigned char ucMessage)
{
switch(ucMessage)
{
case NEW_RCV_DATA:
{
rcvdata_proc(); // 處理接收緩沖區數據
if(gb_DataOK)
{
gb_DataOK = FALSE;
getCommandData(); // 從數據幀中提取命令數據
}
break;
}
case NEW_SAMP_DATA:
{
followLineControl();
break;
}
case SAMPLE_DOWN_PULS:
{
straightRun();
break;
}
default: break;
}
}
/***************************** 模塊自用函數 *******************************/
// 以下函數只由模塊自身使用,別的模塊不用聲明。
/********************************************/
/* 名稱:init_SIO */
/* 用途:初始化串口, */
/* 參數: 波特率 , 模式固定為:1 */
/* 1 START 8 DATA 1 STOP */
/********************************************/
void init_SIO(unsigned char baud)
{
// 波特率表
unsigned char code TH_Baud[5]={B4800_C,B9600_C,B19200_C,B38400_C,B57600_C};
AUXR = AUXR|SET_T1X12_C;
TH1 = TH_Baud[baud];
TL1 = TH_Baud[baud];
TR1 = TRUE;
SCON = UART_MODE1_C|EN_RCV_C; // 8 位模式( MODE 1)
}
/********************************************/
/*名稱: rcvdata_proc */
/*用途: 檢測接收緩沖區數據, */
/*說明: 如果收到正確的數據幀則建立標志 */
/********************************************/
void rcvdata_proc(void)
{
unsigned char i,j,k;
if(gb_StartRcv == FALSE)
{
/* 檢測幀頭 0x55 0xAA LEN */
i=(gi_ucGetPtr-2)&(MaxRcvByte_C-1); // 指向0x55
j=(gi_ucGetPtr-1)&(MaxRcvByte_C-1); // 指向0xAA
if((ga_ucRcvBuf[i]==0x55)&&(ga_ucRcvBuf[j]==0xAA))
{
i=gi_ucGetPtr;
if(ga_ucRcvBuf[i]<= (MaxRcvByte_C-1));
{
//幀頭正確,啟動數據區接收
gb_StartRcv=TRUE;
gc_ucDataLen=ga_ucRcvBuf[i];
gi_ucStartPtr=(gi_ucGetPtr+1)&(MaxRcvByte_C-1);
gi_ucEndPtr= (gi_ucGetPtr + gc_ucDataLen+1)&(MaxRcvByte_C-1);
}
}
gi_ucGetPtr=(gi_ucGetPtr+1)&(MaxRcvByte_C-1);
}
else
{
//開始接收數據處理
if(gi_ucGetPtr==gi_ucEndPtr)
{
/* 數據幀接收完 */
gb_StartRcv=FALSE;
j=gi_ucStartPtr;
k= 0;
for(i=0;i<gc_ucDataLen;i++)
{
// 計算CS
k +=ga_ucRcvBuf[j];
j=(j+1)&(MaxRcvByte_C-1);
}
// 取校驗和
k +=ga_ucRcvBuf[j];
if( k == 0xFF)
{
// 數據校驗正確
gb_DataOK=TRUE;
}
}
gi_ucGetPtr=(gi_ucGetPtr+1)&(MaxRcvByte_C-1);
}
}
/********************************************/
/*名稱: getCommandData */
/*用途: 從接收緩沖區中取出數據, */
/*說明: 建立對應標志,通知相應的處理 */
/********************************************/
void getCommandData(void)
{
union
{
unsigned int all;
unsigned char b[2];
}uitemp;
union
{
int all;
unsigned char b[2];
}itemp;
unsigned char ucCommand,i,j,sum,n;
unsigned char idata *ucI_Ptr;
unsigned char xdata *ucX_Ptr;
ucCommand = ga_ucRcvBuf[gi_ucStartPtr]; // 取出數據幀中的命令字
switch (ucCommand)
{
case PWM_MODE:
{
// 處理PWM開環控制命令
i = (gi_ucStartPtr + 1)&(MaxRcvByte_C - 1); // 指向電機 1 數據區
for(j=0;j<2;j++) // 循環 2 次完成兩個電機的數據提取
{
itemp.b[1] = ga_ucRcvBuf[i]; // 注意,在C51中,整形等多字節數據在內存中是先高后低存放!
i =(i+1)&(MaxRcvByte_C-1);
itemp.b[0] = ga_ucRcvBuf[i];
if(itemp.all < (-1000)) // PWM值合法性處理
{
itemp.all = -1000;
}
if(itemp.all > 1002)
{
itemp.all = 1000;
}
ga_iPWM_Value[j] = itemp.all; // 得到 PWM 值
// 行走脈沖計數數據處理
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
ga_uiRotateNum[j] = uitemp.all; // 得到轉動脈沖計數值
ga_uiStopCnt[j] = calStopCntValue(ga_uiRotateNum[j],j); // 計算出停止計數值
ga_cMotorStat[j] = setMotorStat(ga_iPWM_Value[j]); // 根據命令設置電機運轉標志
i = (gi_ucStartPtr + 1+4)&(MaxRcvByte_C - 1); // 指向電機 2 數據區
}
gb_EnablePID = FALSE; // 收到PWM控制命令后,禁止 PID 控制
gb_M1CalOutValue =TRUE; // 建立計算電機控制輸出值標志,因為PWM數據變化
gb_M2CalOutValue =TRUE;
break;
}
case SPEED_MODE:
{
// 處理轉速閉環控制命令
i = (gi_ucStartPtr + 1 )&(MaxRcvByte_C-1); // 指向電機 1 數據區
for(j=0;j<2;j++) // 循環 2 次完成兩個電機的數據提取
{
itemp.b[1] = ga_ucRcvBuf[i]; // 注意,在C51中,整形等多字節數據在內存中是先高后低存放!
i =(i+1)&(MaxRcvByte_C-1);
itemp.b[0] = ga_ucRcvBuf[i];
if(itemp.all < (-10000)) // 轉速數據合法性處理
{
itemp.all = -10000;
}
if(itemp.all > 10002)
{
itemp.all = 10000;
}
ga_iRotateSpeed[j] = itemp.all; // 得到轉速
// 行走脈沖數據處理
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
ga_uiRotateNum[j] = uitemp.all; // 得到轉動脈沖計數值
ga_uiStopCnt[j] = calStopCntValue(ga_uiRotateNum[j],j); // 計算出停止計數值
ga_cMotorStat[j] = setMotorStat(ga_iRotateSpeed[j]); // 根據命令設置電機運轉標志
i = (gi_ucStartPtr + 1 + 4)&(MaxRcvByte_C-1); // 指向電機 2 數據區
}
if(gb_EnablePID)
{
// 已啟動PID控制
}
else
{
// 啟動 PID 控制
gb_EnablePID = TRUE;
gac_ucGetSpeedCnt[MOTOR1] = 3; // 電機 1 采集3次速度數據后才允許計算PID
gac_ucGetSpeedCnt[MOTOR2] = 3; // 電機 2 采集3次速度數據后才允許計算PID
ga_iPWM_Value[MOTOR1] = INI_PWM_VALUE; // 電機 1 輸出PWM初值,啟動電機
ga_iPWM_Value[MOTOR2] = INI_PWM_VALUE; // 電機 2 輸出PWM初值,啟動電機
gb_M1CalOutValue = TRUE; // 通知輸出計算
gb_M2CalOutValue = TRUE;
}
break;
}
case SET_PARA:
{
// 處理參數設置命令
i = (gi_ucStartPtr + 1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i]; // 注意,在C51中,整形等多字節數據在內存中是先高后低存放!
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
g_uiPWM_Freq = uitemp.all;
if(g_uiPWM_Freq <200) // 數據合法性處理
{
g_uiPWM_Freq = 200;
}
if(g_uiPWM_Freq >2000)
{
g_uiPWM_Freq = 2000;
}
gb_M1CalOutValue =TRUE; // 建立計算電機控制輸出值標志,因為PWM的頻率變了。
gb_M2CalOutValue =TRUE;
// 取 PID 參數
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
g_uiKp = uitemp.all;
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
g_uiTi = uitemp.all;
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
g_uiTd = uitemp.all;
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
if(uitemp.all >0)
{
g_uiPID_Ratio = uitemp.all;
}
g_fKp = ((float)g_uiKp)/g_uiPID_Ratio; // 在此處計算好,減少每次 PID 的運算量
g_fTi = ((float)g_uiTi)/g_uiPID_Ratio;
g_fTd = ((float)g_uiTd)/g_uiPID_Ratio;
break;
}
case READ_SPEED:
{
// 讀取轉速命令處理
ga_ucTxdBuf[0] = 0xAA;
ga_ucTxdBuf[1] = 0x55; // 幀頭
ga_ucTxdBuf[2] = 0x05; // 幀長
ga_ucTxdBuf[3] = 0x80+READ_SPEED; // 返回命令
sum = ga_ucTxdBuf[3];
i=4;
for(j=0;j<2;j++) // 循環 2 次,返回 2 個電機的轉速
{
itemp.all = ga_iCurSpeed[j];
ga_ucTxdBuf[i] = itemp.b[1]; // 返回轉速值,先低后高
sum += ga_ucTxdBuf[i];
i++;
ga_ucTxdBuf[i] = itemp.b[0];
sum += ga_ucTxdBuf[i];
i++;
}
ga_ucTxdBuf[i] = ~sum; // 校驗和
gc_ucTxdCnt = 9; // 發送字節計數
gi_ucTxdPtr = 0; // 發送指針
SBUF = ga_ucTxdBuf[0]; // 啟動發送
break;
}
case FOLLOW_LINE_CTRL:
{
i = (gi_ucStartPtr + 1)&(MaxRcvByte_C-1);
switch (ga_ucRcvBuf[i])
{
case FOLLOW_LINE:
{
break;
}
case STRAIGHT_RUN:
{
gb_StartStraightRun = TRUE;
gc_uiPCA_OverCnt = 0;
g_ucDownSampCnt = 0;
//gb_EnSpeed_Hi_Low = TRUE; // 啟動速度上下限控制
g_iInit_PWM = INI_PWM_VALUE; // 啟動電機
ga_iPWM_Value[MOTOR1] = g_iInit_PWM;
ga_cMotorStat[MOTOR1] = setMotorStat(ga_iPWM_Value[MOTOR1]); // 設置電機運轉標志
ga_iPWM_Value[MOTOR2] = g_iInit_PWM;
ga_cMotorStat[MOTOR2] = setMotorStat(ga_iPWM_Value[MOTOR2]); // 設置電機運轉標志
m_iDiffPWM = 0;
gb_M1CalOutValue =TRUE; // 建立計算電機控制輸出值標志,
gb_M2CalOutValue =TRUE;
m_iError_Int = 0; // 初始化PID計算數據
m_iErrorOld = 0;
break;
}
case STOP_RUN:
{
ga_iPWM_Value[MOTOR1] = BRAKE_PWM;
ga_cMotorStat[MOTOR1] = setMotorStat(ga_iPWM_Value[MOTOR1]); // 設置電機運轉標志
ga_iPWM_Value[MOTOR2] = BRAKE_PWM;
ga_cMotorStat[MOTOR2] = setMotorStat(ga_iPWM_Value[MOTOR2]); // 設置電機運轉標志
gb_EnSpeed_Hi_Low = FALSE;
gb_StartStraightRun = FALSE;
gb_StartLineFollow = FALSE;
gb_M1CalOutValue =TRUE; // 建立計算電機控制輸出值標志,
gb_M2CalOutValue =TRUE;
break;
}
default: break;
}
break;
}
case READ_MEMORY:
{
// 讀內存數據處理
i = (gi_ucStartPtr + 1)&(MaxRcvByte_C-1);
uitemp.b[1] = ga_ucRcvBuf[i]; // 取讀數據地址
i =(i+1)&(MaxRcvByte_C-1);
uitemp.b[0] = ga_ucRcvBuf[i];
i =(i+1)&(MaxRcvByte_C-1);
n = ga_ucRcvBuf[i]; // 取讀數據長度
if(n>(MaxTxdByte_C - 4))
{
n = (MaxTxdByte_C - 4); // 受發送緩沖區限制,減 4 個字節對應: 命令 地址 長度
}
ga_ucTxdBuf[0] = 0xAA;
ga_ucTxdBuf[1] = 0x55; // 幀頭
ga_ucTxdBuf[2] = n + 4; // 幀長
ga_ucTxdBuf[3] = 0x80+READ_MEMORY; // 返回命令
ga_ucTxdBuf[4] = uitemp.b[1]; // 將要讀數據的地址和長度返回
ga_ucTxdBuf[5] = uitemp.b[0];
ga_ucTxdBuf[6] = n;
sum = ga_ucTxdBuf[3]+ga_ucTxdBuf[4]+ga_ucTxdBuf[5]+ga_ucTxdBuf[6];
i = 7; // 數據區起始指針
if(uitemp.b[0] == 0)
{
ucI_Ptr = uitemp.b[1]; // 如果高地址為 0 ,則讀IDATA內容
for(j=0;j<n;j++)
{
ga_ucTxdBuf[i] = *ucI_Ptr;
i++;
ucI_Ptr++;
}
}
else
{
ucX_Ptr = uitemp.b[1]; // 如果高地址不為“0”,則讀XDATA內容,因為只有256字節的XDATA,所以只取低字節。
for(j=0;j<n;j++)
{
ga_ucTxdBuf[i] = *ucX_Ptr;
i++;
ucX_Ptr++;
}
}
ga_ucTxdBuf[i] = ~sum; // 校驗和
gc_ucTxdCnt = i+1; // 發送字節計數
gi_ucTxdPtr = 0; // 發送指針
SBUF = ga_ucTxdBuf[0]; // 啟動發送
break;
}
default:
{
break;
}
}
}
/********************************************/
/*名稱: calStopCntValue */
/*用途: 根據得到的行走脈沖數計算出停止點 */
/********************************************/
unsigned int calStopCntValue(unsigned int uiRun_Num,unsigned char No)
{
unsigned int cnt1;
if(uiRun_Num !=0)
{
cnt1 = gac_uiPulsCnt[No];
while(cnt1 != gac_uiPulsCnt[No])
{
cnt1 = gac_uiPulsCnt[No]; // 防護處理,避免正好在PCA中斷時取數
}
cnt1 = cnt1 + uiRun_Num; // 得到停止的判斷點
}
else
{
cnt1 = 65535; // g_uiRotateNum =0;設置為最大值,永不停止
}
return(cnt1);
}
/*********************************************/
/*名稱: setMotorStat */
/*用途: 根據命令中的PWM值或轉速值設置電機狀態*/
/*********************************************/
char setMotorStat(int iRunValue)
{
char stat;
switch (iRunValue)
{
case 0:
{
stat = IN_STOP;
break;
}
case FLOAT_PWM:
{
stat = IN_STOP;
break;
}
case BRAKE_PWM:
{
stat = IN_STOP;
break;
}
case FLOAT_SPEED:
{
stat = IN_STOP;
break;
}
case BRAKE_SPEED:
{
stat = IN_STOP;
break;
}
default:
{
if(iRunValue >0)
{
stat = IN_FORWARD;
}
else
{
stat = IN_BACKWARD;
}
break;
}
}
return(stat);
}
/*********************************************/
/*名稱: followLineControl */
/*用途: 根據采樣輸出值g_cSampleOut 控制尋跡 */
/*********************************************/
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
循跡小車詳細資料包括電路圖、軟件編程.rar
(238.93 KB, 下載次數: 150)
2020-4-19 18:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
LXKL
時間:
2020-4-28 00:14
好東西,值得學習
作者:
LXKL
時間:
2020-4-28 00:14
好東西,值得學習
作者:
1132492539
時間:
2021-9-7 20:35
最近學校也在組織循跡小車的比賽,頂
歡迎光臨 (http://www.izizhuan.cn/bbs/)
Powered by Discuz! X3.1
欧美日韩亚洲综合在线
|
51成人做爰www免费看网站
|
日韩美女视频一区二区
|
最新中文字幕av专区
|
99视频国产精品免费观看a
|
男裸体无遮挡网站
|
少妇人妻精品一区二区三区
|
青草影院在线观看
|
欧美熟妇另类久久久久久多毛
|
在线观看免费黄色小视频
|
精品中文字幕在线播放
|
可以在线看的av网站
|
狠狠色综合欧美激情
|
久久久久亚洲精品成人网小说
|
91麻豆精品国产91久久久久久久久
|
av女人的天堂
|
久热免费在线观看
|
欧美第一页在线
|
51精品国自产在线
|
亚洲无人区一区
|
26uuu久久综合
|
日韩1区2区3区
|
在线看片不卡
|
性欧美lx╳lx╳
|
亚洲成人毛片
|
第84页国产精品
|
免费av在线网址
|
在线碰免费视频在线观看
|
日本黄视频网站
|
亚洲视频网站在线
|
国产精品一级视频
|
精品成人久久久
|
在线免费看视频
|
亚洲国产精品无码久久久久高潮
|
老司机午夜av
|
青青青在线视频播放
|
色一情一乱一伦一区二区三区
|
91香蕉亚洲精品
|
国产精品久久久久久亚洲调教
|
久久综合电影一区
|
亚洲欧洲xxxx
|
欧美videos大乳护士334
|
日韩欧美中文第一页
|
国产精品极品美女在线观看
|
成人在线免费看黄
|
国产在线91
|
免费高清在线
|
天天影视色香欲综合
|
天天草天天爽
|
轻轻草在线视频
|
国产美女视频网站
|
国产美女视频网站
|
亚洲成人国产综合
|
先锋影音中文字幕
|
亚洲欧洲激情在线乱码蜜桃
|
蜜桃久久一区二区三区
|
五月激情六月婷婷
|
丰满少妇高潮在线观看
|
日本韩国免费观看
|
亚洲视频在线观看不卡
|
五月色婷婷综合
|
性猛交xxxx
|
亚洲伊人网在线观看
|
亚洲综合激情另类专区老铁性
|
天堂网2014av
|
中文字幕久热精品视频免费
|
性欧美video视频另类
|
韩国福利一区
|
日本黄色女人
|
四虎av网址
|
又黄又爽无遮挡
|
男人的天堂在线视频
|
аⅴ资源新版在线天堂
|
国产一区久久精品
|
极品在线视频
|
欧美三区四区
|
欧美视频三区
|
香蕉久久夜色精品国产更新时间
|
国产午夜一区
|
国产真实久久
|
日韩精品免费视频人成
|
国内精品免费在线观看
|
av在线不卡免费看
|
中文字幕不卡一区
|
一区二区理论电影在线观看
|
色伊人久久综合中文字幕
|
欧美亚洲精品一区
|
亚洲的天堂在线中文字幕
|
一区二区三区精品99久久
|
久久久亚洲网站
|
91久久久久久久一区二区
|
国产精品美女诱惑
|
一区二区在线不卡
|
av免费中文字幕
|
91精品啪在线观看国产
|
美国黄色片视频
|
欧美激情黑白配
|
亚洲精品视频91
|
91美女视频
|
在线视频99
|
h片在线免费
|
国产高清精品软件丝瓜软件
|
欧美最猛黑人xxxx黑人猛交黄
|
黄色资源在线观看
|
午夜视频在线免费
|
av中文资源在线资源免费观看
|
国产一区二区色噜噜
|
婷婷精品在线
|
国产视频一区在线观看一区免费
|
久久99精品国产91久久来源
|
国产无人区一区二区三区
|
亚洲18女电影在线观看
|
欧美成人精品高清在线播放
|
九九九久久国产免费
|
成人www视频在线观看
|
亚洲国产精品久久久久久女王
|
99蜜桃臀久久久欧美精品网站
|
亚洲欧美综合视频
|
久久久精品视频免费
|
亚洲a视频在线
|
免费白白视频
|
99se视频在线观看
|
精品自拍视频
|
97人人精品
|
寂寞少妇一区二区三区
|
不卡一区中文字幕
|
亚洲综合激情网
|
91精品国产色综合久久
|
最近2019中文字幕mv免费看
|
午夜精品久久久久久久白皮肤
|
午夜精品久久久久久
|
亚洲国产毛片完整版
|
欧美激情二区三区
|
国产精品亚洲一区
|
99久久国产综合精品五月天喷水
|
爱情岛论坛亚洲首页入口章节
|
亚洲av无码一区二区二三区
|
五月天综合激情
|
精品久久久久成人码免费动漫
|
国产大学生自拍视频
|
俄罗斯xxxx性全过程
|
日本中文字幕一区二区有码在线
|
国产丝袜在线播放
|
91精品短视频
|
蘑菇福利视频一区播放
|
国产成人综合网
|
亚洲午夜久久久
|
亚洲福利影片在线
|
国产成人精品久久
|
天天爽天天狠久久久
|
av在线无限看
|
中文字幕在线观看2018
|
国产手机精品视频
|
九色.com
|
午夜激情视频在线观看
|
日本一区精品视频
|
久久aⅴ国产紧身牛仔裤
|
99r国产精品
|
欧美色综合久久
|
久久久久久久久久久人体
|
日韩精品一区二区三区视频播放
|
樱花草涩涩www在线播放
|
99国产精品久久一区二区三区
|
在线精品视频在线观看高清
|
亚洲va久久久噜噜噜久久
|
在线亚洲观看
|
一区二区三区四区不卡在线
|
国产精品视频男人的天堂
|
国产精品日韩三级
|
波多野结衣av在线免费观看
|
国产又粗又长又黄
|
黑人性受xxxx黑人xyx性爽
|
乱人伦中文视频在线
|
校花撩起jk露出白色内裤国产精品
|
日韩电影在线一区二区
|
婷婷开心久久网
|
久久精品国产久精国产思思
|
久久亚洲综合网
|
在线观看亚洲免费视频
|
怡春院在线视频
|
福利片在线播放
|
第一中文字幕在线
|
国产麻豆一区
|
日韩国产在线一
|
亚洲高清免费在线
|
欧美激情奇米色
|
性刺激综合网
|
99国产精品免费
|
五月色婷婷综合
|
欧美美女色图
|
亚洲三级网页
|
国产精品污www在线观看
|
国产一区二区三区在线视频
|
精品国产黄a∨片高清在线
|
欧美中文日韩
|
亚洲国产一区二区三区
|
欧美日本啪啪无遮挡网站
|
中文字幕一区二区三区在线乱码
|
久久久国产成人精品
|
一区二区视频国产
|
亚洲成人生活片
|
九色视频入口
|
国产精品日本一区二区三区在线
|
国产一区二区三区蝌蚪
|
欧美变态口味重另类
|
国内精品视频在线播放
|
人妻视频一区二区
|
国产95在线|亚洲
|
av有声小说一区二区三区
|
久久69国产一区二区蜜臀
|
欧美成人aa大片
|
深夜福利成人
|
国产精品第九页
|
91精品久久久久久9s密挑
|
日本中文字幕在线一区
|
国产精品久久看
|
97激碰免费视频
|
中文字幕一区二区三区四
|
熟妇人妻一区二区三区四区
|
2024最新电影在线免费观看
|
久久久久久穴
|
亚洲精品一区二区三区影院
|
久久综合久久八八
|
各处沟厕大尺度偷拍女厕嘘嘘
|
一级黄色在线视频
|
日韩在线中文字幕视频
|
黄色网址免费在线
|
亚洲视频一起
|
成人免费小视频
|
国产精品久久久久久超碰
|
亚洲区 欧美区
|
国产免费一级片
|
97一区二区国产好的精华液
|
中文子幕无线码一区tr
|
国产91网红主播在线观看
|
久久人妻少妇嫩草av无码专区
|
精品一区二区三区五区六区七区
|
香蕉成人app
|
国产欧美久久久精品影院
|
日韩中文视频免费在线观看
|
亚洲熟妇国产熟妇肥婆
|
www黄色在线观看
|
美女隐私在线观看
|
99在线观看免费视频精品观看
|
欧美日本国产一区
|
天堂精品一区二区三区
|
夜夜狠狠擅视频
|
av毛片午夜不卡高**水
|
久久先锋影音av
|
国产精品久久久久999
|
在线观看日本黄色
|
最近最新mv在线观看免费高清
|
在线观看的日韩av
|
精品无人区乱码1区2区3区在线
|
青青青国产在线观看
|
人妻与黑人一区二区三区
|
澳门av一区二区三区
|
国产精品系列在线
|
3d动漫啪啪精品一区二区免费
|
九九热只有精品
|
日日夜夜精品一区
|
av动漫一区二区
|
成人国产在线视频
|
日韩精品在线不卡
|
av网站免费在线观看
|
成人美女在线观看
|
国产精品一二区
|
久久久一二三区
|
超碰免费在线播放
|
99久久精品国产一区
|
国产精品久久久av久久久
|
九九视频在线观看
|
av片哪里在线观看
|
国产欧美视频在线观看
|
成人91视频
|
在线观看不卡的av
|
成人免费黄色
|
欧美日韩精品在线观看
|
亚洲狠狠婷婷综合久久久
|
天天综合在线视频
|
日韩成人一级
|
日韩午夜三级在线
|
亚洲精品性视频
|
成人手机在线电影
|
日本欧美加勒比视频
|
欧美洲成人男女午夜视频
|
久久久久久久久久97
|
男人天堂久久久
|
久久久久久97三级
|
精品在线观看一区二区
|
国产综合视频在线
|
女一区二区三区
|
日韩精品中文字幕一区
|
亚洲色图 在线视频
|
a级毛片免费
|
石原莉奈在线亚洲二区
|
26uuu另类亚洲欧美日本一
|
久久久久香蕉视频
|
88xx成人免费观看视频库
|
黄色精品在线看
|
国产黄色一级网站
|
先锋影音资源999
|
国产一区二区在线看
|
国产日本欧美在线观看
|
在线免费观看日韩视频
|
国产剧情一区二区在线观看
|
欧美日本乱大交xxxxx
|
两性午夜免费视频
|
全部免费毛片在线播放网站
|
久久午夜电影网
|
在线观看一区欧美
|
天堂视频在线观看免费
|
久久综合导航
|
91久久久久久久一区二区
|
三级视频在线看
|
99精品视频在线观看免费播放
|
久久精品国产一区二区三区
|
国产67194
|
国产综合色区在线观看
|
欧美精品丝袜中出
|
亚洲国产综合av
|
青青青手机在线视频观看
|
欧美国产精品一区二区三区
|
一区二区三区四区免费视频
|
免费看a网站
|
激情国产一区二区
|
欧美日韩一区二区三
|
欧美白人猛性xxxxx交69
|
在线亚洲欧美
|
成人啪啪免费看
|
亚洲香蕉中文网
|
91麻豆免费在线视频
|
依依成人精品视频
|
黄色av免费在线播放
|
福利网址在线
|
91老司机福利 在线
|
五月天婷亚洲天综合网鲁鲁鲁
|
欧美精品se
|
久久久青草婷婷精品综合日韩
|
6080yy精品一区二区三区
|
99久久免费观看
|
精品国产xxx
|
成人免费在线播放
|
国内揄拍国内精品
|
精品久久久无码中文字幕
|
我不卡神马影院
|
国产精品第2页
|
色屁屁草草影院ccyycom
|
激情欧美一区
|
亚洲在线一区二区
|
国产欧美日本亚洲精品一4区
|
韩国午夜理伦三级不卡影院
|
最新欧美日韩亚洲
|
欧美福利网站
|
一区二区三区欧美视频
|
久久久久久久久久久久久久久国产
|
最近2019免费中文字幕视频三
|
国产大片在线免费观看
|
欧美日韩在线免费
|
亚洲综合自拍网
|
国产精品99久久免费
|
久久国产精品影视
|
精品人妻无码一区二区色欲产成人
|
国产精品www994
|
国产精品一区二区在线观看
|
成年女人毛片
|
国产精品久久夜
|
中文字幕人妻无码系列第三区
|
国产免费拔擦拔擦8x高清在线人
|
波多野结衣一区二区三区在线观看
|
国产污污视频在线观看
|
欧美日韩一区二区三区高清
|
国内一区在线
|
www.精选视频.com
|
国产精品国产三级国产
|
午夜免费一级片
|
中文字幕这里只有精品
|
亚洲人免费视频
|
中文字幕网址在线
|
九九色在线视频
|
国产亚洲一区二区在线
|
国产精品无码免费播放
|
水野朝阳av一区二区三区
|
中文字幕一区二区三区有限公司
|
四虎精品在永久在线观看
|
灌醉mj刚成年的大学平面模特
|
久久精品日韩一区二区三区
|
五月激情婷婷在线
|
欧美男体视频
|
久久视频精品在线
|
美女免费观看一区二区三区
|
国产.欧美.日韩
|
国产亚洲精品自在久久
|
jlzzjlzz欧美大全
|
黄色精品在线看
|
福利所第一导航
|
97精品国产
|
天堂精品一区二区三区
|
国产美女性感在线观看懂色av
|
91片在线免费观看
|