下面分析Main()主函数过程,分析按照执行顺序依次进行。
{
cli(); 关闭总中断
检测飞控板版本
设置LED相应管脚
关闭看门狗
四通道杆量置零
TIMER0初始化,用于产生控制气压高度计偏置电压的pwm信号,控制蜂鸣器鸣叫以 及电机更新频率。
TIMER2初始化,用于向4017芯片输出pwm信号,从而将1路pwm转换成多路舵机控 制信号。
UART0初始化MK主串口,负责与上位机的信息交互。
RC_INIT();设置ppm信号输入引脚,设置TIMER1的输入捕获功能以解码ppm信号。
ADC_INIT();初始化AD采样,采样信息包括三轴加速度,三轴角速度,气压高度,电 池电量。
I2C_INIT();I2C总线初始化,配置I2C以控制电机。
sei()使能全局中断。
PARAMSET_INIT();设置参数,将参数读入内存中的ParamSet。
检查加速度计是否校准。
检查是否开启高度控制,若开启则校准高度计偏置。
SetNeutral(); //Neutral Reading
While(1)
{
UpdateMotor标志是否更新电机状态
{ MotorControl();
SendMotorData(); }
PcAccess标志是否有上位机请求信息
I2cTimeout标志I2C是否超时需报错
SIO_DEBUG标志是否在串口调试
{ TransmitTxData();
ProcessRxData(); }
检测电池电量。
}
}
主函数中的关键过程:
void MotorControl(void) 通过控制率确定电机控制量
void SendMotorData(void) 发送控制量给电机
void TransmitTxData(void) 负责根据串口接收的指令要求发送相应数据
void ProcessRxData(void) 处理串口接收到的数据,给各种事件标志置位。