记录电赛准备过程中那些踩过的坑和学到的知识
作者:BriMonzZY
gitee:https://gitee.com/brimon-zzy
github:https://github.com/BriMonzZY
电磁曲射炮的制作
完整代码:https://github.com/BriMonzZY/RAILGUN
一些踩过的坑
控制舵机时,等待输出的PWM稳定后,再接通舵机电源可以避免舵机疯转。
在中断中不要使用HAL_Delay()进行延时,因为HAL_Delay()本身就是使用systick中断实现的,所以如果systick中断优先级比所在中断的优先级低,systick就无法被调用,程序就会一直卡死在里面,一直卡在HAL_Delay()的while里。HAL_Delay()本身是一个被__weak修饰的虚函数,可以被用户在其他位置重新定义。
程序卡死在判断标志位的while中:(例如要判断标志位flag)在你进入循环的时候,实际上是将flag从内存加载到寄存器里面运行的,在整个循环中,flag这个变量都只是在读取寄存器里面的值。当进入中断的时候,中断里面会从内存加载flag到寄存器,修改完之后又存到内存里,然后退出中断,再回到循环里面。但这个时候循环里使用的flag并没有重新从内存加载flag这个变量,所以一直都在循环里面。
而你在watch里面看到的send_flag变量,是通过调试接口读取对应的内存空间的,所以watch里面看到的值已经被修改了。所以这种变量要加volatile进行修饰需要使用volatile的几种情况:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2 中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
IIC通信的线不能接的太长,否则会无法正常的进行通讯。中断可能会影响mpu6050的dmp的读取。
在调试摄像头寻找红色的代码的时候,程序进入HardFault_Handler()中断。stm32产生硬件错误。怀疑是内存溢出、访问越界(屏幕像素越界访问、数组越界访问都会造成这种情况)。
在ARM架构的处理器的寄存器中:R14寄存器又称为链接寄存器(LR),主要用来保存上一级函数调用者的返回地址。R13寄存器又称为堆栈指针寄存器(SP),用来维护和管理函数调用过程中的栈帧变化。
找出错误代码段:
在Debug模式下:
如果R14(LR) = 0xFFFFFFE9,则查找主堆栈指针MSP。
如果R14(LR) = 0xFFFFFFFD,则查找进程栈指针PSP。
MSP=0x2002B1C8
在Memory Windows中查找0x2002B1C8。
找到0x08开头的32位地址输入disassembly可以看到出问题的代码。
解决方式:将easytracer的函数放到帧中断中问题就解决了。
姿态传感器解算角度的时候,一定要注意计算数据的间隔时间来更改相应参数。
关于PID的新的理解
舵机、步进电机这种执行器属于积分部件,所以使用增量式PID进行控制即可,不需要进行i控制,而直流电机属于不带积分的部件,所以使用位置式PID进行控制。
麦克纳姆轮小车的制作
麦轮车的四个轮子的速度需要进行闭环控制。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!