[Beagle Bone] 【Beagle Bone开源设计】PWM驱动四旋翼电调

[复制链接]
 楼主| hudi008 发表于 2015-1-12 21:22 | 显示全部楼层 |阅读模式
本帖最后由 hudi008 于 2015-1-12 23:18 编辑

无刷电机的电调驱动很简单,就是一个PWM信号,50HZ,电机转速大小跟脉冲宽度有关。

0.5-2.5ms,一般都是1.1-1.9ms。如下图。

Beagle Bone 有好多个PWM引脚。

先来做一个试试看效果,用C语言实现。。
先来看看效果。


测试了一个50Hz的信号。

看代码:

用的宏定义,大家一看就能明白,
而且有注释,
欢迎大家讨论。

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #define SLOT_DIR "/sys/devices/bone_capemgr.9/slots"
  6. #define PWM1_DIR "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15"
  7. #define PWM1_duty "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15/duty"
  8. #define PWM1_period "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15/period"
  9. #define PWM1_run "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15/run"
  10. #define MAX_BUF 80

  11. void main()
  12. {
  13. int fd, len;
  14. char buf[MAX_BUF];
  15. char ch;
  16. int i;
  17. FILE *stream=NULL;
  18. //Cofig P8.13 PWM
  19. fd = open(SLOT_DIR, O_WRONLY);
  20. len = snprintf(buf,sizeof(buf),"bone_pwm_P8_13");
  21. write(fd,buf,len);
  22. len = snprintf(buf,sizeof(buf),"am33xx_pwm");
  23. write(fd,buf,len);
  24. close(fd);
  25. //Disable P8.13 PWM
  26. fd = open(PWM1_run, O_WRONLY);
  27. len = snprintf(buf,sizeof(buf),"0");        
  28. write(fd,buf,len);
  29. close(fd);
  30. //set period 20000000
  31. fd = open(PWM1_period, O_WRONLY);
  32. len = snprintf(buf,sizeof(buf),"20000000");
  33. write(fd,buf,len);
  34. close(fd);
  35. //set duty 20000000
  36. fd = open(PWM1_duty, O_WRONLY);
  37. len = sprintf(buf,"%d",10000000);;
  38. write(fd,buf,len);
  39. close(fd);
  40. //Enable P8.13 PWM
  41. fd = open(PWM1_run, O_WRONLY);
  42. len = snprintf(buf,sizeof(buf),"1");        
  43. write(fd,buf,len);
  44. close(fd);


  45. while(1)
  46. {
  47. for(i=0;i<10;i++)
  48. {
  49. //Disable P8.13 PWM
  50. fd = open(PWM1_run, O_WRONLY);
  51. len = snprintf(buf,sizeof(buf),"0");        
  52. write(fd,buf,len);
  53. close(fd);
  54. //set duty
  55. fd = open(PWM1_duty, O_WRONLY);
  56. len = sprintf(buf,"%d",1000000*i);;
  57. write(fd,buf,len);
  58. close(fd);
  59. //Enable P8.13 PWM
  60. fd = open(PWM1_run, O_WRONLY);
  61. len = snprintf(buf,sizeof(buf),"1");        
  62. write(fd,buf,len);
  63. close(fd);
  64. usleep(1000000);
  65. }
  66. }
  67. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +6 收起 理由
zhangmangui + 6 赞一个!

查看全部评分

zhangmangui 发表于 2015-1-12 22:19 | 显示全部楼层
强烈建议楼主基于PWM做后续的工作    例如活动中给的三个方向
运动控制类
 楼主| hudi008 发表于 2015-1-12 23:18 | 显示全部楼层
zhangmangui 发表于 2015-1-12 22:19
强烈建议楼主基于PWM做后续的工作    例如活动中给的三个方向
运动控制类

这个就是做四轴的一部分,驱动无刷电机。
zhangmangui 发表于 2015-1-12 23:25 | 显示全部楼层
hudi008 发表于 2015-1-12 23:18
这个就是做四轴的一部分,驱动无刷电机。

多少路输出的PWM啊    有没有闭环控制啊   
还望你能多多   详细分享   :lol
 楼主| hudi008 发表于 2015-1-12 23:29 | 显示全部楼层
zhangmangui 发表于 2015-1-12 23:25
多少路输出的PWM啊    有没有闭环控制啊   
还望你能多多   详细分享

只要需要四路PWM控制无刷电机,控制是根据姿态来调整,下一步在做姿态结算。
rogerliu1104 发表于 2015-1-13 09:43 | 显示全部楼层
请教一下楼主,你这样写完duty再写run,能保证每次都写成功吗?我在做小车控制的时候,写数据同时写这两组数据很容易失败。
 楼主| hudi008 发表于 2015-1-13 10:26 | 显示全部楼层
rogerliu1104 发表于 2015-1-13 09:43
请教一下楼主,你这样写完duty再写run,能保证每次都写成功吗?我在做小车控制的时候,写数据同时写这两组 ...

写duty必须先关闭run
rogerliu1104 发表于 2015-1-13 10:38 | 显示全部楼层
hudi008 发表于 2015-1-13 10:26
写duty必须先关闭run

这样操作容易写失败,我用的萎缩办法是改变duty值,改变PWM占空比从而使电机能够加速减速停止。
傲视苍穹的鹰 发表于 2015-1-13 15:54 | 显示全部楼层
这是高手。。。学习了
heiheihaha1992 发表于 2016-3-18 21:14 | 显示全部楼层
您好,我有个问题想请问一下,我的pwm只能有一个工作,不能同时有两个pwm工作,请问您知道该怎么解决么 ?
cnb12345 发表于 2016-4-26 15:29 | 显示全部楼层
cnb12345 发表于 2016-4-26 15:30 | 显示全部楼层
cishengbuyu 发表于 2017-4-7 21:01 | 显示全部楼层
很有用,谢谢楼主!
BG4GKL 发表于 2019-6-6 20:24 | 显示全部楼层
这程序用什么芯片?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

251

主题

9862

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部