big_uncle
big_uncle
这段时间我在帮学校Robocon战队做辅导,遇到了JGA25-371电机。 以前我还没遇到过这种电机,一直用的是大疆的三相无刷电机,而这个是带编码器和减速箱的直流电机,一共6根线,其中四根线是编码器的,两根线是电机的电源线。 电机的驱动很简单,这里使用了L298N驱动器,使用三根线控制,两根线控制电机的转向,一根线输出PWM波控制输出的电压,进而控制电机的力矩。 这个电机关键的地方在于获取它的转速和转向,也就是获取编码器的值。我之前使用的大疆电机采用的霍尔传感器,而这个电机采用的是光电编码器,它的具体介绍可以看这个网站 [编码器速度和方向检测,371电机方向与速度检测,stm32编码器接口模式](http://www.yfrobot.com/forum.php?mod=viewthread&tid=2411&highlight=%B1%E0%C2%EB%C6%F7)。 最关键的就是下面这张图,只要理解了这张图就能读取转向和转速了。  我采用了两种方法获取电机的转速。第一种是使用定时器的输入捕获功能,设置为上升沿触发,通过记录A相或B相两次上升沿的间隔来计算电机的转速,我测量的是A相,然后在中断中判断B相的电平高低来区分电机的转向。 另一种方法是使用GPIO的外部中断,配置为上升沿中断,给每个电机设置一个计数,在中断中对计数进行++操作,通过计数的大小来计算转速。 获取到转速就可以进行PID控制了,上面的原理很简单。 这里可以提一下,在使用定时器输入捕获的时候,如果在中断中判断是又哪个通道产生的: ```c void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)) { //... } else if((htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)) { //... } else...
我第一次看见小陀螺的时候是在去年比赛的佛山分区赛,当时我的比赛已经彻底结束了,在备场区看比赛直播,看见了有个战队的步兵可以**360度**旋转,还可以同时实现底盘的前后左右移动,当时死活想不通是怎么实现的。 昨天逛空间的时候再次看见了这种小陀螺,跑的确实欢快,心里非常羡慕,于是今天下午决心要实现小陀螺。 但没想到稍微一想就有些思路了,其实就是一个运动的分解与合成,在此记录一下。 首先看看之前的步兵车底盘的基本运动计算方程: ```c m3508_1.speed_pid.ref = infantry.chassis.FBSpeed + infantry.chassis.LRSpeed + infantry.chassis.RotateAngle; m3508_2.speed_pid.ref = -infantry.chassis.FBSpeed + infantry.chassis.LRSpeed + infantry.chassis.RotateAngle; m3508_3.speed_pid.ref = -infantry.chassis.FBSpeed - infantry.chassis.LRSpeed + infantry.chassis.RotateAngle; m3508_4.speed_pid.ref = infantry.chassis.FBSpeed -...
这段时间我一直在调英雄车的云台PID,之前我放弃了陀螺仪的角速度数据,选择用电机的编码盘反馈的位置计算角速度,结果效果很棒!详情可以点击[这里]?id=13)。 但是这个方法还有一个遗留问题,那就是计算出来的角速度有波动,曲线画出来呈锯齿状,我已经使用了`递推平均滤波算法`,而且队列长度已经设置到了24位,再往上提升效果也不是很显著,反而浪费了宝贵的RAM资源。 产生锯齿波的根本原因是编码器的精度很高,一圈又8192个刻度,稍微的影响都会使反馈值改变,这是硬件层面的现状,是无法避免的,我需要从这些锯齿波中得到角速度变化的真正趋势。 因为是锯齿波,所以我选择了低通滤波算法。这里我只使用了一阶低通滤波算法。 首先介绍一下啥是一阶低通滤波算法: 低通滤波原本是硬件层面RC滤波电路,后面有了软件模拟的低通滤波。 一阶低通滤波又叫一阶惯性滤波,算法公式为: =\alpha&space;X(n)+(1-\alpha)Y(n-1)$$) 式中:为滤波系数,取值范围为0~1;`X(n)`为本次采样值;`Y(n-1)`为上次滤波输出值;`Y(n)`为本次滤波输出值。 显然,一阶低通滤波算法就是将本次的采样值和上次的输出值进行加权得到有效的滤波值。 一阶滤波算法的不足就是平稳度和灵敏度不可兼得,这也是大多数滤波算法的通病。 对于一阶滤波算法,滤波系数越小,滤波结果越平稳,但是灵敏度越低;滤波系数越大,灵敏度越高,但是滤波结果越不稳定`。 我测试了为0.2,0.25和0.3的情况,结果如下:  = 0.3   = 0.25   = 0.2  从上面的对比可以确实是越小结果越平稳。但是从下图也可以看出灵敏度的下降(曲线已经有了相位差)  最后我选择了 = 0.2,平稳度和灵敏度都比较好。...
大佬方便说一下您demo里的轨迹跟踪和速度控制是怎么实现的吗?我看demo里有障碍物时会自动减速甚至停下等待,非常智能,想学习学习
### Other 请问DPU只能在RTOS中使用吗?想在Linux环境下调用DPU计算深度图,但是文档里只看到RTOS中的应用。大小核的架构中,Linux可用的外设中似乎也没有包含DPU