这个文件是这个项目的主文件,它包含了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"//这个是用来处理Arduino IDE的串口通讯实时发送的命令的,应该可以用来通过电脑的串口来对BruGI进行调试和设置,第三方库
#include "EEPROMAnything.h"//同样是用来处理EEPROM的读写的,里面定义了两个函数,里面调用了之前引用的EEPROM.H中的定义的函数,EEPROM.write()和EEPROM.read(),这两个函数只能读取一个地址,而这个头文件中重新定义两个新函数,可以读写任意长度的EEPROM内容。
#include "PinChangeInt.h"//用来快速响应处理外部中断的第三方库文件,这是库文件的介绍:点这里
#include "Timer1.h"//跟计时和延时功能相关函数
#include "Trace.h"//用来通过串口实时显示各种跟踪数据的各个函数
#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();//初始化遥控参数
// Init RC-Input
initRCPins();//初始化遥控输入
LEDPIN_OFF//熄灭8号引脚的LED
CH2_OFF//4号引脚输出设置为low
CH3_OFF//7号引脚输出设置为low
}
水平有限,欢迎大家找出错误一同完善。
网友评论