這個(gè)文件是這個(gè)項(xiàng)目的主文件,它包含了setup()鹃骂、loop()這兩個(gè)arduino的核心函數(shù)台盯。下面逐行分析:
頭文件引用:
首先是頭文件的引用,通過(guò)這里能看到這個(gè)程序中各個(gè)文件在項(xiàng)目中起到的作用畏线。
#include <EEPROM.h> //用來(lái)處理Arduino的EEPROM的寫入和讀取静盅,這是Arduino的官方庫(kù)
#include <Wire.h>//用來(lái)處理I2C通信,這是Arduino的官方庫(kù)
#include#<arv/pgmspace.h>//用來(lái)處理往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"//不用說(shuō)了施绎,肯定是用來(lái)操作陀螺儀和加速度計(jì)MPU6050數(shù)據(jù)的溯革,第三方庫(kù)。
#include "SerialCommand.h"http://這個(gè)是用來(lái)處理Arduino IDE的串口通訊實(shí)時(shí)發(fā)送的命令的谷醉,應(yīng)該可以用來(lái)通過(guò)電腦的串口來(lái)對(duì)BruGI進(jìn)行調(diào)試和設(shè)置致稀,第三方庫(kù)
#include "EEPROMAnything.h"//同樣是用來(lái)處理EEPROM的讀寫的,里面定義了兩個(gè)函數(shù)俱尼,里面調(diào)用了之前引用的EEPROM.H中的定義的函數(shù)抖单,EEPROM.write()和EEPROM.read(),這兩個(gè)函數(shù)只能讀取一個(gè)地址遇八,而這個(gè)頭文件中重新定義兩個(gè)新函數(shù)矛绘,可以讀寫任意長(zhǎng)度的EEPROM內(nèi)容。
#include "PinChangeInt.h"http://用來(lái)快速響應(yīng)處理外部中斷的第三方庫(kù)文件押蚤,這是庫(kù)文件的介紹:點(diǎn)這里
#include "Timer1.h"//跟計(jì)時(shí)和延時(shí)功能相關(guān)函數(shù)
#include "Trace.h"http://用來(lái)通過(guò)串口實(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)通過(guò)輸入伺服信號(hào)來(lái)移動(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ù)分析,原注釋是用來(lái)debug的供汛。
initControlPanelPins();//用來(lái)初始化控制面板針腳枪汪,初始化了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();//這是用來(lái)設(shè)置串口命令,一共設(shè)置了sd卤唉、we涩惑、re、par桑驱、gc境氢、ac、sbv碰纬、ver萍聊、he等這個(gè)命令,具體的使用方法還要參考SerialCommand庫(kù)文件的說(shuō)明
// Init BL Controller
initBlController();//設(shè)置用來(lái)控制電機(jī)的3悦析、5寿桨、6、9强戴、10亭螟、11引腳為OUTPUT模式,根據(jù)配置文件中配置pwm的頻率來(lái)對(duì)計(jì)時(shí)器進(jìn)行配置骑歹,分別是8KHz预烙、32KHz、4KHz三種道媚。開啟timer1的中斷扁掸,關(guān)閉arduino標(biāo)準(zhǔn)的計(jì)時(shí)器中斷,并開啟timer1的中斷用來(lái)電機(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)配置來(lái)進(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ò)誤一同完善沙兰。