瑞萨单片机解调好盈电调控制无刷电机

2019-04-13 12:29发布

class="markdown_views prism-github-gist"> 最近刚接触四旋翼,主控用的是瑞萨的RX23T系列,表示以前从来没有接触过瑞萨的单片机,所以拿到手一脸的懵逼。在我好不容易搞懂了开发环境的使用,把在某宝上寻得的资料烧写到单片机上,期待电机嗡嗡转起来,可是只听到了循环的滴滴叫声。
网上一查,电调要先解调之后,才能控制无刷电机。 针对我自己的情况,我们用的是好盈20A的电调,2212无刷电机,瑞萨R5F523T5ADF。(以下所提方法和参数可能会因为电调型号和电机不同而不同) ps:此篇博客主要是我用来记录我们小组成员解调电调的过程,对于博文中提到的一些关于瑞萨单片机的使用上或是理解上有错误的地方(实在是小白一只)欢迎大家热心提出并指正。

可略过此版块直接看第二板块

我首先根据资料配置好MTU来实现四路PWM的输出从而控制四路无刷电机,文件r_cg_main.c中的主函数中调整占空比即可,初始状态:200Hz,四路占空比50%。
R_MTU3_C0_Start(); //PWM OUT The initial value is 200Hz
R_MTU3_C2_Start(); //PWM OUT The initial value is 200Hz
MTU0.TGRB = 5000; //change duty PB2
MTU0.TGRC = 5000; //change duty PB1
MTU0.TGRD = 5000; //change duty PB0
MTU2.TGRA = 5000; //change duty PA3
简单说下我对以上代码理解,首先是配置MTU,MTU0和MTU2配置为PWM模式2,然后分别配置MTU0和MTU2模块,重点在PWM的输出设置上。
这里写图片描述
此处配置PWM输出周期为5ms(即PWM的频率为200Hz),相应的初始化寄存器值在0~9999之间,所以设置为5000即为占空比50% (注意,给比较寄存器配置的初始值是低电平占整个周期的值,从波形图上也能够看出)。 但是就是把这段代码烧写到单片机中并不能让电机转动。

重点在这里

好了,重点来了,知道了电调是需要先解调之后才能控制电机,所以在网上各种贴吧挖坟找了一下解调的方法。这里就直接说我最后采用的可行的方法吧。
  • 首先了解基本原理 单片机发送一定频率和脉宽范围的PWM给电调,电调进入编程设置模式,通过给出的脉宽的不同完成不同的设置。此时就要参考不同电调的使用说明书了。
  • 然后在此处我参考了另一个博主以前发的一篇博文 http://blog.csdn.net/CalShell/article/details/44424347
  • 查到了好盈电机的使用说明书
这里写图片描述 这里写图片描述 这里写图片描述 参照了博主给出的设置电调的方法,起初我们采用将PWM频率设置为50Hz,即pwm输出周期为20ms,采用5%~10%的油门行程。
同上设置,在PWM的输出周期设置为20ms的情况下,寄存器的最大配置值为39999,所以最高油门设置时,寄存器应配置为40000-40000*0.1 = 36000,同理最低油门设置为38000。知道配置参数设置,我们就开始了实际调试的过程。
1、首先,我们将油门先设置到最高,然后给个延时(20ms左右)。
2、紧接着给寄存器赋值相应的值,将油门打到最低。但是电机仍然不会转动,电调仍然只是响启动音。
3、然后我们尝试延长延时的时间,新的现象就是电调在发出了哔哔两声之后,循环滴滴,嘀嘀嘀,嘀嘀嘀嘀(询问客服说是进入了电调调试模式了)。
4、然后我们陷入了卡死的状态,在这期间我们找到了其他人写的用arduino控制好盈电机的示例代码,烧进arduino板子上接上我们的电调确实可以驱动电机。
5、我们发现我们实现原理几乎一致,用示波器测试波形也几乎一致,唯一的区别就是频率有些不同,arduino中的PWM频率是用代码模拟的,只有40多赫兹不足50赫兹。
6、在这里我们就很魔性的把我们的频率设置为了40Hz,然后油门行程还是设置在5%~10%。并且加大了延时时间,这次将代码烧写进去也是先是听到了哔哔两声,然后就进入了哔哔哔哔的急促断音。
7、查看了好盈电机说明书,故障快速处理表格。出现我们的这种现象可能是油门未归零或者是油门行程设置过小,所以我们就尝试将油门行程增大到3%~10%。并且魔性的在代码里不断设置重复油门最高,延时(增大/减小),油门最低,延时(增大/减小)。
8、最后经过数次调试,终于找到了一个可行的延时时间。

最后可运行代码

void R_MAIN_UserInit(void) { /* Start user code. Do not edit comment generated here */ R_MTU3_C0_Start(); //PWM OUT The initial value is 200HZ R_MTU3_C2_Start(); //PWM OUT The initial value is 200HZ MTU0.TGRB = 45000; //change duty PB2 MTU0.TGRC = 45000; //change duty PB1 MTU0.TGRD = 45000; //change duty PB0 MTU2.TGRA = 45000; //change duty PA3 delay_ms(2500); MTU0.TGRB = 48500; //change duty PB2 MTU0.TGRC = 48500; //change duty PB1 MTU0.TGRD = 48500; //change duty PB0 MTU2.TGRA = 48500; //change duty PA3 delay_ms(7000); /* End user code. Do not edit comment generated here */ } void main(void) { R_MAIN_UserInit(); /* Start user code. Do not edit comment generated here */ while (1U) { MTU0.TGRB = 48000; //change duty PB2 MTU0.TGRC = 48000; //change duty PB1 MTU0.TGRD = 48000; //change duty PB0 MTU2.TGRA = 48000; //change duty PA3 } /* End user code. Do not edit comment generated here */ } pwm周期设置 这里写图片描述

附上示波器波形图

  • 采用40Hz的频率,占空比为10%,也就是设置油门最高操作
采用40Hz的频率,占空比为10%,也就是设置油门拉高操作
  • 频率40Hz,占空比为3%,也就是设置油门最低操作
频率40Hz,占空比为3%,也就是设置油门最低操作
  • 解调成功后通过PWM控制电机,范围在油门行程范围之类(即PWM占空比在3%~10%之间)
这里写图片描述 ps:我们尝试过将频率重新设置为50Hz,油门行程设置为3%~10%,然后电调并没有解调成功(其中我们也尝试过设置不同的延时时间或者是再将最低油门设置低一点,可是电调还是处于哔哔哔长叫中),小组成员也都很无语,。但是因为还要弄其他的模块,所以其中原因我们也不想深究了。写篇博文记录,以后有时间再深究吧!如果各位有知道原因的请不吝告知。