来源:杏彩体育官网 发布时间: 2024-12-23 10:05:14 点击量:1
好吧,转眼一看,距离上一篇文章已经过去了两个月了。只能说工作和家庭的各种事情确实太多了,人到中年属于自己的时间确实越来越少了,再不过来调一下这个小车估计都要生锈了。所以今天过来接着做下一步工作。之前是完成了BSP的移植和导入,接下来就要尝试移植FOC下移植FOC,更倾向于使用RTThread的框架,所以各种传感器和驱动器的适配计划加到RTThread的驱动这边来做。FOC那边只移植SimpleFOC的核心算法即可。所以在正式移植FOC算法之前,还需要先搭建用到的底层驱动。今天就先整理一下读取磁编码器PWM的输入捕获驱动的移植记录。其实某些适配更好的BSP内的RTThread驱动库里面已经有了输入捕获驱动,但只是捕获了输入脉宽的时间,而我这里需要的是捕获PWM信号的占空比,也就对应了磁编码器探测到的
然后代码内容改动不大,主要改的是返回的数据除了脉宽时间还有一个周期时间,这样就可以计算输入PWM信号的占空比了。另外,原有的驱动上使用的是ringbuffer做了一个数据缓存,这样数据处理可以异步话,什么时候需要什么时候把缓存内的数据全部读走即可。但各人考虑,我应用的场合是用这个信号来驱动无刷电机,这个PWM信号的输入频率也才1Khz,市面上大多数的无刷电机驱动,底层控制频率基本都达到了10Khz以上。所以我这里肯定不需要异步处理的,会直接用这个信号触发底层控制。而且控制效果还需要测试,如果转速上不去或者抖动厉害的话,可能还需要想办法插值细化或者改用SPI读取编码器数据(这也是为什么硬件上做了两种接口的原因,就是想去测试探索一些好玩的东西)。所以我这里是直接去掉了ringbuffer,加入了信号量。到时候上层开一个线程去等待这个信号量去跑FOC算法。头文件修改如下:
C文件主要修改的是回调函数,把之前的数据加入ringbuffer的操作改成了释放信号量,地方的修改都是一些简单的适配,由于C代码较多,我这里就不都贴出来了,相信大家肯定会自己完成适配,甚至比我的还要适配的好。而我的代码,等我第一期的功能开发完了,会整体开源出来。C代码主要修改的回调函数如下:
BSP驱动的适配稍微麻烦一点,如果大家能找到类似BSP内的相似驱动可以进行移植,那我这里简单找了一下并没有找到,所以仿照RTT的驱动适配方式,自己适配了一下。主要实现要点就是开启每个Timer的CH0和CH1双通道对CI0或者CI1输入的PWM信号进行采样,一个捕获脉宽,一个捕获周期,从而得到占空比。剩下的就是一些向下调用GD32的驱动库API,向上适配RTT的驱动接口。同样,下面只给出主要的初始化代码和中断处理代码,的可自行实现或者关注我后续开源的代码。
管理BSP驱动代码的Kconfig文件不再librares目录下,而是在board目录下。于是在“board/Kconfig”文件内的适当位置,仿照驱动加入如下代码:
意思也比较简单,我这里适配了6个PWM的输入捕获驱动,并且利用“select”语句,在BSP的驱动管理里面自动开启了RTT驱动里面的“RT_USING_PWM_INPUT_CAPTURE”选项。修改完上述代码后,就可以用menuconfig命令或者RTThreadIDE的RT-Thread Settings图形配置界面内进行配置了:
可以看到,慢慢向一个方向推动小车,两个编码器的变化规律是相反的,和实际的两个电机对向安装相匹配,实际使用的时候按照其中一个为基准,把另外一个编码器数据反向即可。
只看其中一个轮子,输出频率改为原有的1Khz,输出值转换为浮点的角度值,可得到如下的测试曲线: