一直想做个飞行器,但是出了电小问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2913|回复: 7

[未解决] 一直想做个飞行器,但是出了电小问题

[复制链接]
回帖奖励 9 金币 回复本帖可获得 1 金币奖励! 每人限 1 次
发表于 2021-6-16 12:07 | 显示全部楼层 |阅读模式
本帖最后由 DreamLovely 于 2021-6-16 12:20 编辑

这是主函数的源码
extern uint8_t PWM_PIN[8];
void initOutput();//初始化函数
void mixTable();//PID计算
void writeMotors();//信号输出到电机
//输出程序
uint8_t PWM_PIN[8] = {9,10,11,3,6,5,16,12};   //定义输出接口
void initOutput() {
for(uint8_t i=0;i<4;i++) {
    pinMode(PWM_PIN,OUTPUT);
  }//初始化,使PWM引脚作为输出引脚
}

void mixTable(){
  int16_t maxMotor;//定义最大转速电机编号
  uint8_t i;
  #define PIDMIX(X,Y,Z) rcCommand[THROTTLE] + axisPID[ROLL]*X + axisPID[PITCH]*Y + YAW_DIRECTION * axisPID[YAW]*Z //PID算法
motor[0] = PIDMIX(-1,+1,-1);
motor[1] = PIDMIX(-1,-1,+1);
motor[2] = PIDMIX(+1,+1,+1);
motor[3] = PIDMIX(+1,-1,-1);//4个电机输出计算(PID)
maxMotor=motor[0];//以下代码限制最大输出油门,防止异常
for(i=1; i<4; i++)
if (motor>maxMotor) maxMotor=motor;
for(i=0; i<4; i++) {
if (maxMotor > MAXTHROTTLE) //保证当某一个油门达到最大时,陀螺仪仍有良好的信号连接
motor -= maxMotor - MAXTHROTTLE;
motor = constrain(motor, conf.minthrottle,
MAXTHROTTLE);
if ((rcData[THROTTLE] < MINCHECK) && !f.BARO_MODE)
motor = conf.minthrottle;
if (!f.ARMED)
motor = MINCOMMAND;
}
}

void writeMotors() {
OCR1A = motor[0]>>3; //  pin 9输出电机1号
OCR1B = motor[1]>>3; //  pin 10输出电机2号
OCR2A = motor[2]>>3; //  pin 11输出电机3号
OCR2B = motor[3]>>3; //  pin 3输出电机4号
}

void writeAllMotors(int16_t mc) { //所有电机输出设定为mc
  for (uint8_t i =0;i<4;i++) {
    motor=mc;
  }
writeMotors();
}
/*电调初始化函数,电调初始化完成后注释掉defined重新上传
#if defined(ESC_CALIB_CANNOT_FLY)
    writeAllMotors(ESC_CALIB_HIGH);
blinkLED(2,20, 2);
delay(4000);
    writeAllMotors(ESC_CALIB_LOW);
blinkLED(3,20, 2);
    while (1) {
delay(5000);SSSS
blinkLED(4,20, 2);
    #endif
    }
    exit;
#endif*/
这里老是会错误

求助各位大佬如何解决
 楼主| 发表于 2021-6-16 12:09 | 显示全部楼层
本帖最后由 DreamLovely 于 2021-6-16 12:17 编辑

我定义了一个全局变量int motor[4]
还是会报错
屏幕截图 2021-06-16 121727.png
 楼主| 发表于 2021-6-16 12:18 | 显示全部楼层
DreamLovely 发表于 2021-6-16 12:09
我定义了一个全局变量int motor[4]
还是会报错

还是说这样写不对,求各位大佬指教
发表于 2021-6-16 13:38 | 显示全部楼层

回帖奖励 +1 金币

本帖最后由 frankhan747 于 2021-6-16 13:43 编辑

1. 这两个报错互不相干。它们之所以没有一起出现,是因为编译器遇到第一个报错就会停止工作。后面的代码,即使有其它错误,编译器也不会去检查。第一个错改好了,编译器才会去找下一个错。
2. 加全局变量是正确的。
3. 第二个报错和第一个类似,有些东西没声明。
4. 基础不牢先别急着搞飞行器,步子大了容易扯着 _
 楼主| 发表于 2021-6-16 15:08 | 显示全部楼层
frankhan747 发表于 2021-6-16 13:38
1. 这两个报错互不相干。它们之所以没有一起出现,是因为编译器遇到第一个报错就会停止工作。后面的代码, ...

谢谢,开源的只是想试一下
还有一个问题请教一下
就是arduino编译的时候是倒着来的吗
为什么错误信息是先后面再到前面啊
发表于 2021-6-16 22:11 | 显示全部楼层
DreamLovely 发表于 2021-6-16 15:08
谢谢,开源的只是想试一下
还有一个问题请教一下
就是arduino编译的时候是倒着来的吗

按理说,编译器是从前往后走的(从后往前编译是没有道理的)。
简单猜测一下这里报错颠倒的原因:
#define是预编译指令,其本质是让IDE去查找并替换关键字。编译器看到#define A B 指令后,会先把文件中所有的A替换成B,但不会立即对新的“含B代码”进行编译(当然也就不会发现其中的错误)——于是,#define指令就被认为是执行完毕且成功,往下走;
然后编译器碰到了“motor[]未声明”的错误,报了;
再然后,编译器扫描到第一条“含B代码”(位于含motor代码之后),这才发现B没声明,于是报错。为了显示出错位置,IDE会草率地标出关键字B在整个文件中第一次出现的位置(即#define指令这一行)
总结:标示的出错位置不一定是真正的出错位置。

点评

此外,不要把一切寄希望于开源。且不说开源代码贡献者能力水平参差不齐,即使是优质的开源代码也需要你去读懂、会用、会改  发表于 2021-6-17 09:07
 楼主| 发表于 2021-6-16 23:18 | 显示全部楼层
frankhan747 发表于 2021-6-16 22:11
按理说,编译器是从前往后走的(从后往前编译是没有道理的)。
简单猜测一下这里报错颠倒的原因:
#defin ...

受益匪浅,谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 03:50 , Processed in 0.117133 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表