久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STC12C5410AD單片機智能小車代碼與原理圖資料
[打印本頁]
作者:
zbjllq
時間:
2021-9-23 09:15
標題:
STC12C5410AD單片機智能小車代碼與原理圖資料
單片機源程序如下:
// 注:以下文檔的 TAB 為 2 個字符!
/*------------------------------------------------------------------------
此項目為“尋跡小車”的升級,在結構上作了改進,碼盤從10(20)個/圈提高到 50(100)個圈;
同時,改進了電機的驅動防護邏輯,既能實現電機的四個狀態,保證不短路,還可以使PWM控制的
軟件耗費大大減少,而且一個電機只需使用3個I/O口(原來為 4個)。
其余沒做大的改動,所以程序只要要修改的是電機驅動部分。
為了能使用PCA硬件實現PWM,以便于使用RTOS,暫時取消PWM的頻率修改功能,日后有更好的方案再考慮。
因為程序要支持尋跡的所有功能,所以將程序分成模塊化,便于閱讀和調試。
程序分為:
1) 主控程序 —— 調度所有消息,初始化系統
2) 電機驅動模塊 —— 包含所有與電機驅動有關的函數,接受不同的控制命令,并付諸實施;
3) 軌跡采樣模塊 —— 包含所有與軌跡采樣有關的處理,結果為與處理后的軌跡狀態;
4) 走軌跡控制模塊 —— 讀取軌跡采樣所獲取的信息,根據需求和策略輸出相應的電機控制命令;將調試的相關功能也納入此模塊。
資源分配:
Timer 0 —— 系統時基, 1ms
Timer 1 —— 串口波特率
------------------------------------------------------------------------*/
#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 <CM_Const.H>
#include <CM_Var.H>
void init_hardware(void); // 硬件初始化函數
void init_var(void); // 初始化變量
void feed_watchdog(void); // 清看門狗計數器
extern void init_LineCtrl_Hardware(void); // 初始化軌跡控制模塊用硬件
extern void init_LineCtrl_Var(void); // 初始化軌跡控制模塊用變量
extern void lineCtrl_proc(unsigned char ucMessage); // 軌跡控制部分處理入口函數
extern void init_MotorDrv_Hardware(void); // 初始化電機驅動模塊用硬件
extern void init_MotorDrv_Var(void); // 初始化電機驅動模塊用變量
extern void calOutValue(unsigned char No); // 計算電機控制輸出值
extern void calSpeed(void); // 計算轉速
extern void proc_Stop(unsigned char No); // 處理行走脈沖計數
extern void proc_PID_Ctrl(unsigned char No); // 處理PID控制
extern void init_LineSamp_Hardware(void); // 初始化軌跡采樣模塊用硬件
extern void init_LineSamp_Var(void); // 初始化軌跡采樣模塊用變量
extern void lineSamp_proc(void); // 軌跡采樣處理
/******** 主程序 *************/
void main(void)
{
init_hardware();
init_var();
EA = TRUE; // 啟動中斷,開始正常工作
while(1)
{
if(gb_CheckM1StopCnt)
{
gb_CheckM1StopCnt = FALSE;
proc_Stop(MOTOR1); // 處理行走脈沖計數
}
if(gb_M1CalOutValue == TRUE)
{
gb_M1CalOutValue = FALSE;
calOutValue(MOTOR1); // 根據變化后的參數計算電機輸出控制數據
}
if(gb_CheckM2StopCnt)
{
gb_CheckM2StopCnt = FALSE;
proc_Stop(MOTOR2); // 處理行走脈沖計數
}
if(gb_M2CalOutValue == TRUE)
{
gb_M2CalOutValue = FALSE;
calOutValue(MOTOR2); // 根據變化后的參數計算電機輸出控制數據
}
if(gb_calSpeed)
{
gb_calSpeed = FALSE;
calSpeed(); // 計算速度
}
if(gb_SpeedOk)
{
gb_SpeedOk = FALSE;
if(gb_EnablePID)
{
proc_PID_Ctrl(MOTOR1); // 根據速度值計算PID控制值
proc_PID_Ctrl(MOTOR2); // 根據速度值計算PID控制值
}
}
if(gb_NewData)
{
gb_NewData = FALSE;
lineCtrl_proc(NEW_RCV_DATA); // 處理數據接收
}
if(gb_SampleStart)
{
union
{
unsigned int all;
unsigned char b[2];
}uiTemp;
uiTemp.b[0] = TH0;
uiTemp.b[1] = TL0;
if(uiTemp.all > (TIME1ms_C + SAMP_LED_ONTIME))
{
gb_SampleStart = FALSE;
lineSamp_proc(); // 處理軌跡采樣
}
}
if(gb_NewSampData)
{
gb_NewSampData = FALSE;
lineCtrl_proc(NEW_SAMP_DATA); // 處理軌跡采樣數據
}
if (gb_1msFlag==TRUE)
{
gb_1msFlag=FALSE;
gc_LED_Time_Cnt--;
if(gc_LED_Time_Cnt ==0)
{
gc_LED_Time_Cnt = LED_ON_OFF_TIME;
gb_WorkDisp = ~gb_WorkDisp;
}
gc_ui1msCnt--;
if(gc_ui1msCnt==0)
{
gc_ui1msCnt=WDTTIME_C;
feed_watchdog();
}
gc_ucMeaSpeedTimeCnt--;
if(gc_ucMeaSpeedTimeCnt ==0)
{
gc_ucMeaSpeedTimeCnt = MEA_SPEED_PERIOD;
gb_calSpeed = TRUE;
}
}
}
}
/********** 模塊自用函數 **************/
// 以下函數只由模塊自身使用,別的模塊不用聲明。
/********************************************/
/*名稱: init_hardware */
/*用途: 硬件初始化函數 */
/*說明: 初始化所有相關的硬件狀態 */
/********************************************/
void init_hardware(void)
{
/* 初始化系統時鐘 */
CLK_DIV = CLKDIV1_C;
/* 初始化I/O口*/
P1M0 = P1M0_C;
P1M1 = P1M1_C;
P2M0 = P2M0_C;
P2M1 = P2M1_C;
P3M0 = P3M0_C;
P3M1 = P3M1_C;
/* 初始化定時器 */
TMOD = T0MODE1|T1MODE2; // Timer0工作在模式1 ,16位定時,Timer1 工作在模式 2 ,8位重加載,作為波特率發生器;
AUXR = AUXR&CLR_T0X12_C; // Timer0 工作在12分頻
TCON = 0; /* 未使用外部中斷,所以不用定義中斷的觸發方式 */
TH0 = TIME1msH_C;
TL0 = TIME1msH_C;
TR0 = TRUE;
/* 初始化中斷 */
IE = EnT0_C; // 此處只允許 Timer0 中斷,其它由各模塊自身決定
IPH = NOIP_C; // 此處不設優先級,有各功能模塊自身設定
IP = NOIP_C;
/* 初始化軌跡采樣模塊所需硬件 */
init_LineSamp_Hardware();
/* 初始化軌跡控制所需硬件 */
init_LineCtrl_Hardware();
/* 初始化電機驅動所需硬件 */
init_MotorDrv_Hardware();
/* 看門狗初始化程序 */
WDT_CONTR = Watchdog_C; // 設置 WDT 分頻
}
/********************************************/
/*名稱: init_var */
/*用途: 變量初始化 */
/*說明: 初始化全局變量 */
/********************************************/
void init_var(void)
{
// WDT參數初始化
gb_1msFlag=FALSE;
gc_ui1msCnt=WDTTIME_C;
gc_LED_Time_Cnt = LED_ON_OFF_TIME;
/* 初始化軌跡采樣模塊用變量 */
init_LineSamp_Var();
/* 初始化軌跡控制所用變量 */
init_LineCtrl_Var();
/* 初始化電機驅動所用變量 */
init_MotorDrv_Var();
}
/********************************************/
/*名稱: feed_watchdog */
/*用途: 喂狗程序 */
/*說明: 請參照STC12C5410的喂狗方法說明 */
/********************************************/
void feed_watchdog(void)
{
WDT_CONTR = CLRWDT_C;
}
// ------------- 中斷處理程序 ---------------------
/********************************************/
/* 定時器 0 中斷服務 */
/* 說明: 1ms 中斷一次, */
/********************************************/
void Timer0_Int(void) interrupt 1 using 1
{
TH0 = TIME1msH_C;
TL0 = TIME1msL_C;
gb_1msFlag = TRUE;
gb_EnSample = ~gb_EnSample;
if(gb_EnSample)
{
gb_Sample = EN_Sample; // 打開采樣LED
gb_SampleStart = TRUE;
}
}
\032
復制代碼
51hei.png
(12.68 KB, 下載次數: 91)
下載附件
2021-9-23 21:58 上傳
代碼和原理圖資料51hei附件下載:
智能小車詳細資料.rar
(238.93 KB, 下載次數: 68)
2021-9-23 09:15 上傳
點擊文件名下載附件
智能小車詳細資料
下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
中文字幕一区二区三区视频
|
一区二区在线看
|
日韩黄色在线
|
中文字幕在线视频观看
|
在线看片你懂的
|
成人午夜在线观看
|
欧美一区二区在线
|
中文字幕亚洲欧美
|
青草视频网站
|
av大全在线观看
|
日韩天堂在线
|
国产91久久婷婷一区二区
|
a在线播放
|
91精品国产一区二区三区
|
蜜桃精品视频
|
黄色片视频免费
|
99在线精品视频
|
www.youjizz.com日本
|
国产成人网
|
国产福利在线播放
|
天海翼在线视频
|
成人午夜网站
|
亚洲福利网
|
国产精品久久久久久久久借妻
|
97精品超碰一区二区三区
|
天堂在线中文资源
|
99精品色
|
香蕉视频免费看
|
免费毛片网
|
欧美日韩a
|
日日夜夜天天干
|
久久精品国产77777蜜臀
|
中国美女乱淫免费看视频
|
www五月天
|
久热中文字幕
|
国产日本在线观看
|
国产精品2
|
91午夜精品亚洲一区二区三区
|
黄色在线观看免费
|
手机成人在线视频
|
a级片在线播放
|