在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>MSP430線路跟隨器開源分享

MSP430線路跟隨器開源分享

2022-11-15 | zip | 0.37 MB | 次下載 | 免費

資料介紹

描述

介紹

對于熟悉 Arduino IDE 的digitalRead()digitalWrite()的人來說,德州儀器的 Code Composer Studio 的端口方向和按位操作可能看起來有點陌生。但是請相信我,一旦您習慣了它,您將立即使用 PIC 和 MSP430 等廉價 MCU 制作史詩般的項目!

我們將使用MSP430 G2553 超值系列 MCU 隨附的MSP430G2 LaunchPad 開發(fā)套件( http://www.ti.com/tool/MSP-EXP430G2)制作帶有 PD 控制器的線路跟隨機器人。如果您有不同的德州儀器 MCU,代碼應該可以工作,但您必須檢查其數(shù)據(jù)表以確保引腳支持分配給它們的某些特殊功能。(如定時器和中斷)

?
pYYBAGNxieWABWFEAACofqb-xiw830.png
圖 1:MSP430G2 Launchpad 套件
?

代碼編寫器工作室

我們將在本教程中使用 CCS。你可以在這里下載。

安裝時,請確保您正在安裝 MSP430 設備的所有組件。安裝完成后,打開應用程序并使用 File > New創(chuàng)建一個新的CCS 項目。

?
poYBAGNxieeAIzaGAADxDFmxxso534.png
圖 2:CCS 項目創(chuàng)建
?

確保選擇正確的目標設備。您可以在插入電路板后使用識別按鈕讓 CCS 找出電路板。為您的項目命名并點擊完成。

?
pYYBAGNxiemAYttcAABpBeY9cHc331.png
圖 3:main.c
?

您將看到一個包含如上所示小代碼片段的 main.c 文件。主循環(huán)內(nèi)的亂碼用于停止看門狗計時器(呃!它旁邊的評論中這么說)提示:嘗試突出顯示該行的一個單詞并按 F3。它將在單獨的文件中打開 msp430g2553.h 文件,并為您提供有關該寄存器的更多信息

設置和清除位

我們將使用 DIR 寄存器作為如何設置和清除位的示例。

MSP430 使用 DIR(方向)寄存器將引腳設置為輸入或輸出。此外,G2553 有兩個端口,分別是 PORT1 和 2??纯茨愕?Launchpad。您會看到標記為 P1.0、P1.1、P2.0、P2.1 的引腳。他們的意思是什么?簡單!P1.0 - 端口 1,引腳 0P2.3 - 端口 2,引腳 3

這些端口通常為 8 位長,這就是為什么每個端口只能看到 8 個引腳的原因。兩個端口有兩個 DIR 寄存器,它們遵循與引腳相同的命名約定。P1DIR - 端口 1 方向寄存器 P2DIR - 端口 2 方向寄存器

這些寄存器也是 8 位長,每個位對應于相關端口中的一個引腳。P1DIR的BIT1對應P1.1(Port 1 Pin 1)

正確的。那么我們?nèi)绾螌⒁粋€引腳設置為輸入或輸出呢?如果將 DIR 寄存器中某個引腳的相應位設置為 1,則該引腳為輸出。同樣,如果您將該位設置為 0,則該引腳將成為輸入。與 Arduino 的 pinMode() 函數(shù)相同。例如 - 為了將 P2.1 設置為輸出,我們必須將 P2DIR 的 BIT1 設為 1。CCS 允許我們通過使用 BIT0、BIT1、BIT2 輕松訪問寄存器中的位。 ..BIT6 關鍵字。

嘗試在 CCS 中輸入“ BIT4 ”,突出顯示它并按 F3 鍵。您將能夠看到它們是如何在 msp430g2553.h 標頭中定義的。

?
pYYBAGNxieyAXqBtAACVMFUxX3s607.png
圖 4:標準鉆頭
?

您可以使用這些關鍵字和二進制 OR 運算符 ('|') 將寄存器中的各個位設置為 1。

P1DIR |= BIT2; //Set BIT2 of P1DIR to 1 (Sets pin 1.2 as an output)

我們正在使用 or 運算符,以便我們只對所需的位進行更改。

重置一個位是棘手的。這涉及使用二進制 AND 運算符 (' & ') 和二進制補碼運算符 (' ~ ')

P1DIR &= ~BIT2; //Set BIT2 of P1DIR to 0 (Sets pin 1.2 as an input)

接線組件

現(xiàn)在我們知道了基礎知識,讓我們開始做生意。首先,使用下面的圖片作為組裝組件的指南。(我還附上了fritzing項目,你可以在本頁底部下載)

?
pYYBAGNxie-ACd7-AAJqyAwR2ms542.png
圖 5:接線
?

注意:我使用了 TCRT5000 和比較器附帶的 IR 線跟隨傳感器。這些東西相當便宜。你可以花 2 美元買到其中的 5 個。epid=911730611&hash=item488ae89f86:g:TDUAAOSwlzZbIiiiI:rk:3: pf:0

聲明和全局變量

我們將首先聲明我們將使用的函數(shù)和全局變量的名稱。

#include  
void MotorSetup();
void SetLeftMotorSpeed();
void SetRightMotorSpeed();
void SetSpeeds(int lspeed,int rspeed);
void IRSensorSetup();
void SonarSetup();
void ReadSonar();
int readLine();
void lineFollow();
void SetBrakes();
/**
* main.c
*/
unsigned int up_counter;
unsigned int distance_cm;
int val = 0;
int sensorpanelVal = 0;
int lastval = 0;
//PID Values
int error = 0;
int lasterror = 0;
#define BaseSpeed 160
#define Kp 18
#define Kd 30

引腳設置

讓我們首先設置引腳以使用我們的聲納。我正在使用單獨的函數(shù),我將在主函數(shù)中調(diào)用一次。

void SonarSetup(){
   /* set P1.2 (TRIG)to output direction */
   P1DIR |= BIT2;
   P1OUT &= ~BIT2;                 // keep trigger at low
   /* Set P1.1 to input direction (echo)
   P1.1 is an input for Timer A0 - Compare/Capture input */
   P1DIR &= ~BIT1;
   // Select P1.1 as timer trigger input select (echo from sensor)
   P1SEL = BIT1;
   /* Timer A0 configure to read echo signal:
   Timer A Capture/Compare Control 0 =>
   capture mode: 1 - both edges +
   capture sychronize +
   capture input select 0 => P1.1 (CCI1A) +
   capture mode +
   capture compare interrupt enable */
   CCTL0 |= CM_3 + SCS + CCIS_0 + CAP + CCIE;
   /* Timer A Control configuration =>
   Timer A clock source select: 1 - SMClock +
   Timer A mode control: 2 - Continous up +
   Timer A clock input divider 0 - No divider */
   TA0CTL |= TASSEL_2 + MC_2 + ID_0;
   // Global Interrupt Enable
   _BIS_SR(GIE);
}

如果您想了解有關所用寄存器的更多信息,可以在此處查看 MSP430 G2553 數(shù)據(jù)表。

現(xiàn)在讓我們設置控制 L298N 電機驅(qū)動器所需的引腳。

void MotorSetup(){
   P2DIR |= BIT1+BIT5;//Pin 2.1 -> left motor speed Pin 2.5 -> Right Motor Speed
   P2SEL |= BIT1+BIT5;
   P1DIR |= BIT3+BIT4; // Set Pins 1.3 and 1.4 as outputs to control left motor direction
   P1DIR |= BIT5+BIT0; // Set Pins 1.5 and 1.6 as outputs to control right motor direction
   P1OUT &= ~(BIT1+BIT4+BIT5+BIT0); //set all pins to low
   /*** Timer1_A Set-Up ***/
   TA1CCR0 |= 200 - 1;
   TA1CCTL1 |= OUTMOD_7;
   TA1CCTL2 |= OUTMOD_7;
   TA1CCR1 |= 0;
   TA1CCR2 |= 0;
   TA1CTL |= TASSEL_2 + MC_1;
}

最后,讀取 5 個紅外傳感器的引腳。

void IRSensorSetup(){
   //Set IR sensor pins as inputs
   P2DIR &= ~(BIT0+BIT2+BIT3+BIT4); //Set pins 2.0,2.2,2.3,2.4 as inputs
   P1DIR &= ~(BIT6); //1.7 as inputs
}

輔助函數(shù)

讓我們創(chuàng)建一些幫助函數(shù),使我們能夠輕松地控制我們的組件。這比把所有東西都塞進 main 函數(shù)要容易得多。

讀取聲納的輔助功能 -

void ReadSonar(){
   P1OUT ^= BIT2;              // assert
   __delay_cycles(10);         // 10us wide
   P1OUT ^= BIT2;              // deassert
   __delay_cycles(60000);      // 60ms measurement cycle
}

控制電機的功能 -

void SetLeftMotorSpeed(int speed){
   if (speed >0){
       P1OUT &= ~BIT3; // Pin 1.3 Low
       P1OUT |= BIT4; //Pin 1.4 High
       if(speed >199){
           speed = 199;//prevent CCR2 from being negative
       }
       TA1CCR1 = speed;
   }else if(speed <0){
       P1OUT |= BIT3; //1.3 High
       P1OUT &= ~BIT4; // Pin 1.4 Low
       speed = -speed;
       if(speed >199){
           speed = 199;//prevent CCR1 from being negative
       }
       TA1CCR1 = speed;
   }
}
void SetRightMotorSpeed(int speed){
   if (speed >0){
       P1OUT &= ~BIT5;//Pin 1.5 Low
       P1OUT |= BIT0; // Pin 1.3 Low
       if(speed >199){
           speed = 199;//prevent CCR2 from being negative
       }
       TA1CCR2 = speed;
   }else if(speed <0){
       P1OUT |= BIT0; //1.5 High
       P1OUT &= ~BIT6;//Pin 1.6 Low
       speed = -speed;
       if(speed >199){
           speed = 199; //prevent CCR2 from being negative
       }
       TA1CCR2 = speed;
   }
}
void SetSpeeds(int lspeed,int rspeed){
   SetLeftMotorSpeed(lspeed);SetRightMotorSpeed(rspeed);
}
void SetBrakes(){
   P1OUT &= ~BIT5;//Pin 1.5 Low
   P1OUT &= ~BIT0; // Pin 1.3 Low
   P1OUT &= ~BIT3; // Pin 1.3 Low
   P1OUT &= ~BIT4; //Pin 1.4 Low
   TA1CCR1 = 199;
   TA1CCR2 = 199;
}

聲納中斷處理程序

在觸發(fā)聲納后,您將需要這個時間讓 Echo 引腳變低。

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
   if (CCTL0 & CCI)            // Raising edge
   {
       up_counter = CCR0;      // Copy counter to variable
   }
   else                        // Falling edge
   {
       // Formula: Distance in cm = (Time in uSec)/58
       distance_cm = (CCR0 - up_counter)/58;
   }
   TA0CTL &= ~TAIFG;           // Clear interrupt flag - handled
}

線路跟隨

首先,我們將創(chuàng)建一個函數(shù)來根據(jù)行的位置返回一個值。例如,如果黑線低于第一個傳感器,則函數(shù)將返回 1,如果黑線低于傳感器 2 和傳感器 3,則返回 2.5,依此類推。

int readLine()
{
   //from left to right. Sensor output is high when white space is detected. Since we're seeking a black line,inputs are inverted
   int sensor1 = !(P2IN&BIT0);
   int sensor2 = !(P2IN&BIT2);
   int sensor3 = !(P2IN&BIT3);
   int sensor4 =!(P1IN&BIT6);
   int sensor5 =!(P2IN&BIT4);
   int sum = 0;
   sensorpanelVal = (sensor1 * 1)+(sensor2* 2)+(sensor3 * 3)+(sensor4 *4)+(sensor5*5);
   sum = (sensor1+sensor2+sensor3+sensor4+sensor5);
   if (sum ==0){
       return lastval;
   }else{
   lastval = sensorpanelVal/sum;
   return lastval;
   }
}

現(xiàn)在我們有了一個函數(shù),可以根據(jù)黑線的位置給我們一個數(shù)值,我們可以開發(fā)一個比例和微分控制器來將位置保持在指定的設定點。

void lineFollow(){
   val = readLine();
   error = 3-val;
   int delta = error-lasterror;
   int change = Kp*error + Kd*delta;
   lasterror = error;
   int leftMotorPWM = BaseSpeed -change;
   //constrain PWM
   if(leftMotorPWM >199){
       leftMotorPWM = 199;
   }else if(leftMotorPWM <0){
       leftMotorPWM = 0;
   }
   //constrain PWM
   int rightMotorPWM = BaseSpeed + change;
   if(rightMotorPWM >199){
           rightMotorPWM = 199;
   }else if(leftMotorPWM <0){
           rightMotorPWM = 0;
   }
   SetSpeeds(leftMotorPWM,rightMotorPWM);
}

就是這樣!現(xiàn)在您所要做的就是設置您的主要功能以運行引腳設置,并連續(xù)運行 linefollow() 功能。

int main(void)
{
   WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
   MotorSetup();
   IRSensorSetup();
   SonarSetup();
   while(1){
       lineFollow();
       if(sensorpanelVal ==15){
           SetBrakes();
           while(1){
           }
       }
   }
}

在這里,如果機器人的所有 5 個傳感器都在黑色表面上,我將無限期地停止機器人,但您可以使用聲納讀數(shù)或任何其他 IR 傳感器值組合來觸發(fā)不同的功能。(可以使用全局變量 sensorpanelVal 訪問)

結論

您可以修改 linefollow() 和 readline() 函數(shù)以適合您的機器人和您的表面。如果您需要在黑色表面上跟隨白線,請將 readline() 中的線替換為這些線,

int sensor1 = (P2IN&BIT0); //For white line on black surface
   int sensor2 = (P2IN&BIT2);
   int sensor3 = (P2IN&BIT3);
   int sensor4 = (P1IN&BIT6);
   int sensor5 = (P2IN&BIT4);

您還必須調(diào)整 Kp 和 Kd 值,以使您的機器人沿著線走而不會丟失它。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1涂鴉各WiFi模塊原理圖加PCB封裝
  2. 11.75 MB   |  76次下載  |  1 積分
  3. 2錦銳科技CA51F2 SDK開發(fā)包
  4. 24.06 MB   |  29次下載  |  1 積分
  5. 3錦銳CA51F005 SDK開發(fā)包
  6. 19.47 MB   |  3次下載  |  1 積分
  7. 4蘋果iphone 11電路原理圖
  8. 4.98 MB   |  3次下載  |  2 積分
  9. 5基礎模擬電子電路
  10. 3.80 MB   |  3次下載  |  1 積分
  11. 6RA-Eco-RA6M4-100PIN-V1.0開發(fā)板資料
  12. 34.89 MB  |  1次下載  |  免費
  13. 7STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊
  14. 3.32 MB   |  1次下載  |  免費
  15. 8聯(lián)想A820t手機維修圖紙包括主板原理圖 尾板原理圖 點位圖
  16. 0.62 MB   |  次下載  |  5 積分

本月

  1. 1AI智能眼鏡產(chǎn)業(yè)鏈分析
  2. 4.43 MB   |  383次下載  |  免費
  3. 2蘇泊爾電磁爐線路的電路原理圖資料合集
  4. 2.02 MB   |  296次下載  |  5 積分
  5. 3貼片三極管上的印字與真實名稱的對照表詳細說明
  6. 0.50 MB   |  94次下載  |  1 積分
  7. 4長虹液晶電視R-HS310B-5HF01的電源板電路原理圖
  8. 0.46 MB   |  91次下載  |  5 積分
  9. 5涂鴉各WiFi模塊原理圖加PCB封裝
  10. 11.75 MB   |  76次下載  |  1 積分
  11. 6錦銳科技CA51F2 SDK開發(fā)包
  12. 24.06 MB   |  29次下載  |  1 積分
  13. 7AO4803A雙P通道增強型場效應晶體管的數(shù)據(jù)手冊
  14. 0.11 MB   |  28次下載  |  2 積分
  15. 8長虹液晶彩電LS29機芯的技術資料說明
  16. 3.42 MB   |  16次下載  |  2 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935127次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191388次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183342次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81588次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73815次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65988次下載  |  10 積分
主站蜘蛛池模板: 天天干天天日天天射天天操毛片 | 亚洲最大毛片 | 香蕉视频在线观看国产 | 色偷偷91久久综合噜噜噜噜 | 午夜神马福利影院 | 久久男人的天堂色偷偷 | 欧美色图888 | 日本超黄视频 | 李老汉的性生生活2 | se97se成人亚洲网站在线观看 | 免费黄色在线观看 | 狠狠干亚洲色图 | 日日噜噜噜夜夜爽爽狠狠视频 | 在线免费观看一级片 | 一区二区三区免费视频网站 | 成人爽a毛片在线视频网站 成人窝窝午夜看片 | 奇米影视大全 | 婷婷综合久久中文字幕蜜桃三 | xxx69欧美| 免费国产一区二区三区 | 中文字幕一二三四区 | 国产成人av在线 | 国产午夜亚洲精品 | 天天躁夜夜躁狠狠躁2024 | 夜夜操狠狠操 | 日日添天天做天天爱 | 91精品福利视频 | 欧美xxxx色视频在线观看 | 天天躁狠狠躁夜夜躁 | 国产精品资源手机在线播放 | 黄色三级在线观看 | 最近最新视频中文字幕4 | 国产成人亚洲日本精品 | 狠狠操欧美 | www.色涩| 白嫩美女在线啪视频观看 | 欧美性白人极品1819hd | 丁香六月婷婷精品免费观看 | 女18poren69| 米奇影院777 | 97干干|