很長一段時間沒有接觸單片機了,剛才瀏覽工控平臺中的單片機論壇,讓我想起了學(xué)習單片機時中的樂趣。我就把我原來自己動手做的一個小項目(基于freescale尋跡賽車小車的設(shè)計)重新整理出來,希望大家喜歡。
在我們學(xué)習時,剛開始都是從接觸51單片機開始的,了解它的接口,了解它的定時,中斷等性能,然后開始用它來做我們想做的事情。呵呵。其實只要把一種單片機學(xué)好了,學(xué)習其他單片機都是非常容易的,F(xiàn)在freescale單片機在國內(nèi)還用的比較少,如果大家有興趣可以去學(xué)習,而且這種單片計算機還是比較穩(wěn)定,比較好用。而且現(xiàn)在好像有freescale杯賽,很長時間沒有去關(guān)注了。呵呵
項目的功能有:尋跡,調(diào)速測速,路程顯示,按鍵掃描,躲避障礙。尋跡中用了PID控制算法,調(diào)速是通過PWM來調(diào)節(jié)電機來實現(xiàn)的。PID算法和PWM脈寬調(diào)制這方面的資料很多,我不多說了。
整個系統(tǒng)方框圖如下:

軟件設(shè)計方框圖:

子程序:

掃描子程序:
void scaning()
{
unsigned char temp,i;
//int key;
int n=255;
for(i=0;i<4;i++)
{
temp=key_val[i]&0x0f;
if(temp!=0x0f)
{
Delay_ms(100);
//LED_delay();
switch(key_val[i])
{
//掃描第一列
case 0xE7: Disp_Flag=1; break;
case 0xD7: Disp_Flag=0; break;
case 0xB7: Disp_Flag=2; break;
case 0x77: key=n; break;
//掃描第二列
case 0xEb: Disp_Flag=1; break;
case 0xDb: Disp_Flag=0; break;
case 0xBb: Disp_Flag=2; break;
case 0x7b: key=n; break;
}
}
}
}
PWM調(diào)速子程序:
void PWMInit(unsigned int Period)
{
unsigned int Temp=Period;
//不允許溢出中斷,不啟動計數(shù),分頻因子=64,置位TSTOP,TRST
T1SC = 0b00110110;
//[設(shè)置PWM周期]
T1MODH = (Temp>>8);
T1MODL = Period;
//[初始化設(shè)置PWM脈寬為0]
T1CH0H = 0x00;
T1CH0L = 0x00;
//設(shè)為PWM模式,不允許輸出比較中斷,輸出低電平,帶緩沖
T1SC0 = 0b00111110;
//允許定時器1計數(shù)寄存器計數(shù)
T1SC &= 0b11011111;
}
整個系統(tǒng)運行起來的效果比較良好,哪為兄弟想得到更詳細的資料,可以回復(fù)本人。
QQ:287756221
|