文件名:_BruGi 第一部分(頭文件引用、初始化)

這個(gè)文件是這個(gè)項(xiàng)目的主文件,它包含了setup()、loop()這兩個(gè)arduino的核心函數(shù)。下面逐行分析:

頭文件引用:


首先是頭文件的引用,通過這里能看到這個(gè)程序中各個(gè)文件在項(xiàng)目中起到的作用。

#include <EEPROM.h> //用來處理Arduino的EEPROM的寫入和讀取,這是Arduino的官方庫

#include <Wire.h>//用來處理I2C通信,這是Arduino的官方庫

#include#<arv/pgmspace.h>//用來處理往FLASH(應(yīng)該也是指的EEPROM吧?)中寫入數(shù)據(jù)的

#include "definitions.h"//該文件里定義了對(duì)這個(gè)項(xiàng)目一些可設(shè)置參數(shù)。例如:驅(qū)動(dòng)電機(jī)的PWM頻率,PID的相關(guān)參數(shù),遠(yuǎn)程遙控的數(shù)據(jù)格式,I2C的通訊頻率,PWM生成端口選用等等。

#include "MPU6050.h"//不用說了,肯定是用來操作陀螺儀和加速度計(jì)MPU6050數(shù)據(jù)的,第三方庫。

#include "SerialCommand.h"http://這個(gè)是用來處理Arduino IDE的串口通訊實(shí)時(shí)發(fā)送的命令的,應(yīng)該可以用來通過電腦的串口來對(duì)BruGI進(jìn)行調(diào)試和設(shè)置,第三方庫

#include "EEPROMAnything.h"//同樣是用來處理EEPROM的讀寫的,里面定義了兩個(gè)函數(shù),里面調(diào)用了之前引用的EEPROM.H中的定義的函數(shù),EEPROM.write()和EEPROM.read(),這兩個(gè)函數(shù)只能讀取一個(gè)地址,而這個(gè)頭文件中重新定義兩個(gè)新函數(shù),可以讀寫任意長度的EEPROM內(nèi)容。

#include "PinChangeInt.h"http://用來快速響應(yīng)處理外部中斷的第三方庫文件,這是庫文件的介紹:點(diǎn)這里

#include "Timer1.h"//跟計(jì)時(shí)和延時(shí)功能相關(guān)函數(shù)

#include "Trace.h"http://用來通過串口實(shí)時(shí)顯示各種跟蹤數(shù)據(jù)的各個(gè)函數(shù)

#include "variables.h"//定義配置參數(shù)的結(jié)構(gòu)體,定義了默認(rèn)參數(shù)設(shè)置,還有用于電機(jī)驅(qū)動(dòng)和MPU6050數(shù)據(jù)處理、遠(yuǎn)程控制等各種變量

#include "fastMathRoutines.h"? ? // orientationRoutines.h中用到的一些快速計(jì)算函數(shù)

#include "orientationRoutines.h"? // 從加速度計(jì)中計(jì)算姿態(tài)

#include "RCdecode.h"? ? ? ? ? ? // 遙控器信號(hào)解碼,實(shí)現(xiàn)通過輸入伺服信號(hào)來移動(dòng)攝像機(jī)

#include "BLcontroller.h"? ? ? ? // 電機(jī)的驅(qū)動(dòng)功能和計(jì)時(shí)器的設(shè)置

#include "SerialCom.h"? ? ? ? ? ? // 利用串口進(jìn)行配置和通訊的通訊協(xié)議


MPU6050 mpu;? ? ? ? ? ? // 創(chuàng)建一個(gè)MPU6050對(duì)象

SerialCommand sCmd;? ? // 創(chuàng)建一個(gè)SerialCommand對(duì)象

初始化函數(shù)


void setup()

{

// just for debugging

#ifdef STACKHEAPCHECK_ENABLE

stackCheck();

heapCheck();

#endif//堆棧檢查?具體的功能不太清楚,應(yīng)該是檢查堆棧的大小和首尾地址。但是哪里用到堆棧?還不清楚,uint32_t stackTop = 0xffffffff;uint32_t stackBottom = 0;uint32_t heapTop = 0;uint32_t heapBottom = 0xffffffff;用到的時(shí)候繼續(xù)分析,原注釋是用來debug的。

initControlPanelPins();//用來初始化控制面板針腳,初始化了ST_LED0(4引腳),ST_LED1(7引腳)的引腳模式為輸出模式,PB_PIN(12引腳)的引腳模式為上拉輸入

LEDPIN_PINMODE//把8號(hào)引腳設(shè)置為輸出模式

CH2_PINMODE//把4號(hào)引腳設(shè)置為輸出模式,條件是未使用控制面板,否則什么都執(zhí)行

CH3_PINMODE//把7號(hào)引腳設(shè)置為輸出模式,條件是為使用控制面板,否則是什么都執(zhí)行

// Start Serial Port

Serial.begin(115200);//設(shè)定串口通訊速率為115200

// send Version Number and welcome message

printMessage(MSG_INFO, F("BruGi ready"));//這個(gè)函數(shù)是一個(gè)消息打印函數(shù),第一個(gè)參數(shù)代表消息類型(除了通知類型之外還有警告、錯(cuò)誤、版本等類型),后面代表要繼續(xù)打印的字符串

printMessage(MSG_VERSION, F(""));//打印當(dāng)前版本號(hào)

// Set Serial Protocol Commands

setSerialProtocol();//這是用來設(shè)置串口命令,一共設(shè)置了sd、we、re、par、gc、ac、sbv、ver、he等這個(gè)命令,具體的使用方法還要參考SerialCommand庫文件的說明

// Init BL Controller

initBlController();//設(shè)置用來控制電機(jī)的3、5、6、9、10、11引腳為OUTPUT模式,根據(jù)配置文件中配置pwm的頻率來對(duì)計(jì)時(shí)器進(jìn)行配置,分別是8KHz、32KHz、4KHz三種。開啟timer1的中斷,關(guān)閉arduino標(biāo)準(zhǔn)的計(jì)時(shí)器中斷,并開啟timer1的中斷用來電機(jī)控制

// Init Sinus Arrays

initMotorStuff();//關(guān)閉中斷,計(jì)算正弦曲線數(shù)組,開啟中斷

// switch off PWM Power

motorPowerOff();//關(guān)閉0號(hào)電機(jī)和1號(hào)電機(jī)的PWM輸出的波形

// Read Config, initialize if version does not match or CRC fails

config.configSet = readConfigSetNumberFromEEPROM(); // get set number from EEPROM

readEEPROM();

if (config.versEEPROM != VERSION_EEPROM)

{

printMessage(MSG_WARNING, F("EEPROM version mismatch, initialized to default"));

setDefaultParameters();

writeEEPROM();

}//這幾行是從EEPROM中讀取EEPROM版本號(hào),如果不對(duì)則按照程序中定義的默認(rèn)配置來進(jìn)行參數(shù)設(shè)置,并將默認(rèn)配置寫回EEPROM中

// Start I2C and Configure Frequency

Wire.begin();

TWSR = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // no prescaler => prescaler = 1

TWBR = ((16000000L / I2C_SPEED) - 16) / 2; // change the I2C clock rate

TWCR = 1<<TWEN;//這幾行是開啟I2C通訊,設(shè)置I2C的通訊時(shí)鐘頻率

// Initialize MPU

initResolutionDevider();//設(shè)定MPU的單位量程

// init I2C and MPU6050

if (initI2C()) {

// Init IMU variables

initIMU();//如果I2C初始化成功,初始化IMU

// Gyro Offset calibration

if (config.gyroCal) {

gyroCalibrateCmd();//陀螺儀校準(zhǔn)

}

} else {

gimState = GIM_ERROR;

}

// set sensor orientation

initSensorOrientation();//初始化傳感器方位

// Init PIDs parameters

initPIDs();//初始化PID參數(shù)

// init RC variables

initRC();//初始化遙控參數(shù)

// Init RC-Input

initRCPins();//初始化遙控輸入

LEDPIN_OFF//熄滅8號(hào)引腳的LED

CH2_OFF//4號(hào)引腳輸出設(shè)置為low

CH3_OFF//7號(hào)引腳輸出設(shè)置為low

}


水平有限,歡迎大家找出錯(cuò)誤一同完善。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Arduino Due有14個(gè)數(shù)字I/O,6個(gè)模擬I/O,一個(gè)復(fù)位開關(guān),一個(gè)ICSP下載口,7-12v電源供電。 ...
    麥牛2013閱讀 3,372評(píng)論 0 8
  • 來看一下每個(gè)模塊都是干什么的: 官方固件下載: (機(jī)翻簡單校對(duì), 有些模塊我也不太懂) 中文說明 https://...
    Zszen閱讀 22,857評(píng)論 2 54
  • 串口操作 串口操作需要的頭文件 #include /*標(biāo)準(zhǔn)輸入輸出定義*/ #include /*標(biāo)準(zhǔn)函數(shù)庫定...
    旅行家John閱讀 1,377評(píng)論 0 3
  • "大眾創(chuàng)新 萬眾創(chuàng)業(yè)",學(xué)校對(duì)于創(chuàng)客教育日漸重視,熱情高漲,紛紛開始創(chuàng)客教育課程,有條件的打造學(xué)校創(chuàng)客實(shí)驗(yàn)室,不吝...
    少兒創(chuàng)客閱讀 15,350評(píng)論 11 52
  • 淚滴落窗檐,杜宇聲聲催心肝 ,柳絲芊芊輕揮臂,向行人挽。 無言獨(dú)憑欄,錦服難御心底寒。夜色如墨染離恨,燈火闌珊。
    水木寧閱讀 279評(píng)論 17 14