資料介紹
描述
介紹
對于熟悉 Arduino IDE 的digitalRead()和digitalWrite()的人來說,德州儀器的 Code Composer Studio 的端口方向和按位操作可能看起來有點陌生。但是請相信我,一旦您習慣了它,您將立即使用 PIC 和 MSP430 等廉價 MCU 制作史詩般的項目!
我們將使用MSP430 G2553 超值系列 MCU 隨附的MSP430G2 LaunchPad 開發套件( http://www.ti.com/tool/MSP-EXP430G2)制作帶有 PD 控制器的線路跟隨機器人。如果您有不同的德州儀器 MCU,代碼應該可以工作,但您必須檢查其數據表以確保引腳支持分配給它們的某些特殊功能。(如定時器和中斷)
代碼編寫器工作室
安裝時,請確保您正在安裝 MSP430 設備的所有組件。安裝完成后,打開應用程序并使用 File > New創建一個新的CCS 項目。
確保選擇正確的目標設備。您可以在插入電路板后使用識別按鈕讓 CCS 找出電路板。為您的項目命名并點擊完成。
您將看到一個包含如上所示小代碼片段的 main.c 文件。主循環內的亂碼用于停止看門狗計時器(呃!它旁邊的評論中這么說)提示:嘗試突出顯示該行的一個單詞并按 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)
正確的。那么我們如何將一個引腳設置為輸入或輸出呢?如果將 DIR 寄存器中某個引腳的相應位設置為 1,則該引腳為輸出。同樣,如果您將該位設置為 0,則該引腳將成為輸入。與 Arduino 的 pinMode() 函數相同。例如 - 為了將 P2.1 設置為輸出,我們必須將 P2DIR 的 BIT1 設為 1。CCS 允許我們通過使用 BIT0、BIT1、BIT2 輕松訪問寄存器中的位。 ..BIT6 關鍵字。
嘗試在 CCS 中輸入“ BIT4 ”,突出顯示它并按 F3 鍵。您將能夠看到它們是如何在 msp430g2553.h 標頭中定義的。
您可以使用這些關鍵字和二進制 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)
接線組件
現在我們知道了基礎知識,讓我們開始做生意。首先,使用下面的圖片作為組裝組件的指南。(我還附上了fritzing項目,你可以在本頁底部下載)
注意:我使用了 TCRT5000 和比較器附帶的 IR 線跟隨傳感器。這些東西相當便宜。你可以花 2 美元買到其中的 5 個。epid=911730611&hash=item488ae89f86:g:TDUAAOSwlzZbIiiiI:rk:3: pf:0
聲明和全局變量
我們將首先聲明我們將使用的函數和全局變量的名稱。
#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
引腳設置
讓我們首先設置引腳以使用我們的聲納。我正在使用單獨的函數,我將在主函數中調用一次。
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 數據表。
現在讓我們設置控制 L298N 電機驅動器所需的引腳。
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
}
輔助函數
讓我們創建一些幫助函數,使我們能夠輕松地控制我們的組件。這比把所有東西都塞進 main 函數要容易得多。
讀取聲納的輔助功能 -
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;
}
聲納中斷處理程序
在觸發聲納后,您將需要這個時間讓 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
}
線路跟隨
首先,我們將創建一個函數來根據行的位置返回一個值。例如,如果黑線低于第一個傳感器,則函數將返回 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;
}
}
現在我們有了一個函數,可以根據黑線的位置給我們一個數值,我們可以開發一個比例和微分控制器來將位置保持在指定的設定點。
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);
}
就是這樣!現在您所要做的就是設置您的主要功能以運行引腳設置,并連續運行 linefollow() 功能。
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
MotorSetup();
IRSensorSetup();
SonarSetup();
while(1){
lineFollow();
if(sensorpanelVal ==15){
SetBrakes();
while(1){
}
}
}
}
在這里,如果機器人的所有 5 個傳感器都在黑色表面上,我將無限期地停止機器人,但您可以使用聲納讀數或任何其他 IR 傳感器值組合來觸發不同的功能。(可以使用全局變量 sensorpanelVal 訪問)
結論
您可以修改 linefollow() 和 readline() 函數以適合您的機器人和您的表面。如果您需要在黑色表面上跟隨白線,請將 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);
您還必須調整 Kp 和 Kd 值,以使您的機器人沿著線走而不會丟失它。
- MSP430和IrDA通信開源分享
- MSP430管理電源排序和控制
- 基于MSP430的PWM操作 46次下載
- MSP430寄存器中文注釋并且分析 9次下載
- MSP430單片機硬件知識學習1 30次下載
- MSP430單片機ADC模數轉換操作 45次下載
- MSP430微處理器Value Line介紹 9次下載
- MSP430單片機實踐篇之MSP430單片機ADC模數轉換操作 43次下載
- 2013 MSP430 技術日 8次下載
- MSP430 實驗板原理圖 25次下載
- 基于 MSP430定時器的使用 9次下載
- MSP430教程14:MSP430單片機ADC12模塊 55次下載
- msp430延時程序設計 0次下載
- 自制MSP430仿真工具的應用
- msp430封裝庫
- 如何為MSP430設計固件以收集和處理IC的數據 1881次閱讀
- MSP430的中斷分為哪3種?MSP430的中斷優先級順序是什么樣的? 1.9w次閱讀
- MSP430有哪些可屏蔽中斷_MSP430中斷的優先級 2833次閱讀
- MSP430單片機定時器A結構及其應用范例 3928次閱讀
- msp430無刷電機控制設計電路 9148次閱讀
- 基于MSP430的SPI驅動編寫之用MSP430驅動AFE4400 5192次閱讀
- MSP430開發入門基礎 C語言編程起步 6499次閱讀
- MSP430單片機的選型及系列介紹 1.6w次閱讀
- MSP430低功耗運行模式原理分析及應用 8864次閱讀
- msp430介紹_msp430上拉電阻的使用 6698次閱讀
- MSP430單片機的端口介紹 5296次閱讀
- msp430學習的深度解析和總結 7063次閱讀
- 基于MSP430的函數信號發生器設計方案 4402次閱讀
- MSP430低功耗原理及其在海溫測量中的應用 2258次閱讀
- MSP430電路圖集錦:創新設計思維 1.4w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多