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

这个文件是这个项目的主文件,它包含了setup()、loop()这两个arduino的核心函数。下面逐行分析:

头文件引用:


首先是头文件的引用,通过这里能看到这个程序中各个文件在项目中起到的作用。

#include <EEPROM.h> //用来处理Arduino的EEPROM的写入和读取,这是Arduino的官方库

#include <Wire.h>//用来处理I2C通信,这是Arduino的官方库

#include#<arv/pgmspace.h>//用来处理往FLASH(应该也是指的EEPROM吧?)中写入数据的

#include "definitions.h"//该文件里定义了对这个项目一些可设置参数。例如:驱动电机的PWM频率,PID的相关参数,远程??氐氖莞袷?,I2C的通讯频率,PWM生成端口选用等等。

#include "MPU6050.h"//不用说了,肯定是用来操作陀螺仪和加速度计MPU6050数据的,第三方库。

#include "SerialCommand.h"http://这个是用来处理Arduino IDE的串口通讯实时发送的命令的,应该可以用来通过电脑的串口来对BruGI进行调试和设置,第三方库

#include "EEPROMAnything.h"//同样是用来处理EEPROM的读写的,里面定义了两个函数,里面调用了之前引用的EEPROM.H中的定义的函数,EEPROM.write()和EEPROM.read(),这两个函数只能读取一个地址,而这个头文件中重新定义两个新函数,可以读写任意长度的EEPROM内容。

#include "PinChangeInt.h"http://用来快速响应处理外部中断的第三方库文件,这是库文件的介绍:点这里

#include "Timer1.h"//跟计时和延时功能相关函数

#include "Trace.h"http://用来通过串口实时显示各种跟踪数据的各个函数

#include "variables.h"//定义配置参数的结构体,定义了默认参数设置,还有用于电机驱动和MPU6050数据处理、远程控制等各种变量

#include "fastMathRoutines.h"? ? // orientationRoutines.h中用到的一些快速计算函数

#include "orientationRoutines.h"? // 从加速度计中计算姿态

#include "RCdecode.h"? ? ? ? ? ? // 遥控器信号解码,实现通过输入伺服信号来移动摄像机

#include "BLcontroller.h"? ? ? ? // 电机的驱动功能和计时器的设置

#include "SerialCom.h"? ? ? ? ? ? // 利用串口进行配置和通讯的通讯协议


MPU6050 mpu;? ? ? ? ? ? // 创建一个MPU6050对象

SerialCommand sCmd;? ? // 创建一个SerialCommand对象

初始化函数


void setup()

{

// just for debugging

#ifdef STACKHEAPCHECK_ENABLE

stackCheck();

heapCheck();

#endif//堆栈检查?具体的功能不太清楚,应该是检查堆栈的大小和首尾地址。但是哪里用到堆栈?还不清楚,uint32_t stackTop = 0xffffffff;uint32_t stackBottom = 0;uint32_t heapTop = 0;uint32_t heapBottom = 0xffffffff;用到的时候继续分析,原注释是用来debug的。

initControlPanelPins();//用来初始化控制面板针脚,初始化了ST_LED0(4引脚),ST_LED1(7引脚)的引脚模式为输出模式,PB_PIN(12引脚)的引脚模式为上拉输入

LEDPIN_PINMODE//把8号引脚设置为输出模式

CH2_PINMODE//把4号引脚设置为输出模式,条件是未使用控制面板,否则什么都执行

CH3_PINMODE//把7号引脚设置为输出模式,条件是为使用控制面板,否则是什么都执行

// Start Serial Port

Serial.begin(115200);//设定串口通讯速率为115200

// send Version Number and welcome message

printMessage(MSG_INFO, F("BruGi ready"));//这个函数是一个消息打印函数,第一个参数代表消息类型(除了通知类型之外还有警告、错误、版本等类型),后面代表要继续打印的字符串

printMessage(MSG_VERSION, F(""));//打印当前版本号

// Set Serial Protocol Commands

setSerialProtocol();//这是用来设置串口命令,一共设置了sd、we、re、par、gc、ac、sbv、ver、he等这个命令,具体的使用方法还要参考SerialCommand库文件的说明

// Init BL Controller

initBlController();//设置用来控制电机的3、5、6、9、10、11引脚为OUTPUT模式,根据配置文件中配置pwm的频率来对计时器进行配置,分别是8KHz、32KHz、4KHz三种。开启timer1的中断,关闭arduino标准的计时器中断,并开启timer1的中断用来电机控制

// Init Sinus Arrays

initMotorStuff();//关闭中断,计算正弦曲线数组,开启中断

// switch off PWM Power

motorPowerOff();//关闭0号电机和1号电机的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版本号,如果不对则按照程序中定义的默认配置来进行参数设置,并将默认配置写回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通讯,设置I2C的通讯时钟频率

// Initialize MPU

initResolutionDevider();//设定MPU的单位量程

// init I2C and MPU6050

if (initI2C()) {

// Init IMU variables

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

// Gyro Offset calibration

if (config.gyroCal) {

gyroCalibrateCmd();//陀螺仪校准

}

} else {

gimState = GIM_ERROR;

}

// set sensor orientation

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

// Init PIDs parameters

initPIDs();//初始化PID参数

// init RC variables

initRC();//初始化??夭问?/b>

// Init RC-Input

initRCPins();//初始化??厥淙?/b>

LEDPIN_OFF//熄灭8号引脚的LED

CH2_OFF//4号引脚输出设置为low

CH3_OFF//7号引脚输出设置为low

}


水平有限,欢迎大家找出错误一同完善。

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • Arduino Due有14个数字I/O,6个模拟I/O,一个复位开关,一个ICSP下载口,7-12v电源供电。 ...
    麦牛2013阅读 3,333评论 0 8
  • 来看一下每个模块都是干什么的: 官方固件下载: (机翻简单校对, 有些??槲乙膊惶? 中文说明 https://...
    Zszen阅读 22,636评论 2 54
  • 串口操作 串口操作需要的头文件 #include /*标准输入输出定义*/ #include /*标准函数库定...
    旅行家John阅读 1,305评论 0 3
  • "大众创新 万众创业",学校对于创客教育日渐重视,热情高涨,纷纷开始创客教育课程,有条件的打造学校创客实验室,不吝...
    少儿创客阅读 15,173评论 11 52
  • 泪滴落窗檐,杜宇声声催心肝 ,柳丝芊芊轻挥臂,向行人挽。 无言独凭栏,锦服难御心底寒。夜色如墨染离恨,灯火阑珊。
    水木宁阅读 269评论 17 14