打印
[Beagle Bone]

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

[复制链接]
4045|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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的信号。

看代码:

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

#include <stdlib.h> 
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#define SLOT_DIR "/sys/devices/bone_capemgr.9/slots"
#define PWM1_DIR "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15"
#define PWM1_duty "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15/duty"
#define PWM1_period "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15/period"
#define PWM1_run "/sys/bus/platform/drivers/pwm_test/pwm_test_P8_13.15/run"
#define MAX_BUF 80

void main()
{
int fd, len;
char buf[MAX_BUF];
char ch;
int i;
FILE *stream=NULL;
//Cofig P8.13 PWM
fd = open(SLOT_DIR, O_WRONLY);
len = snprintf(buf,sizeof(buf),"bone_pwm_P8_13");
write(fd,buf,len);
len = snprintf(buf,sizeof(buf),"am33xx_pwm");
write(fd,buf,len);
close(fd);
//Disable P8.13 PWM
fd = open(PWM1_run, O_WRONLY);
len = snprintf(buf,sizeof(buf),"0");        
write(fd,buf,len);
close(fd);
//set period 20000000
fd = open(PWM1_period, O_WRONLY);
len = snprintf(buf,sizeof(buf),"20000000");
write(fd,buf,len);
close(fd);
//set duty 20000000
fd = open(PWM1_duty, O_WRONLY);
len = sprintf(buf,"%d",10000000);;
write(fd,buf,len);
close(fd);
//Enable P8.13 PWM
fd = open(PWM1_run, O_WRONLY);
len = snprintf(buf,sizeof(buf),"1");        
write(fd,buf,len);
close(fd);


while(1)
{
for(i=0;i<10;i++)
{
//Disable P8.13 PWM
fd = open(PWM1_run, O_WRONLY);
len = snprintf(buf,sizeof(buf),"0");        
write(fd,buf,len);
close(fd);
//set duty
fd = open(PWM1_duty, O_WRONLY);
len = sprintf(buf,"%d",1000000*i);;
write(fd,buf,len);
close(fd);
//Enable P8.13 PWM
fd = open(PWM1_run, O_WRONLY);
len = snprintf(buf,sizeof(buf),"1");        
write(fd,buf,len);
close(fd);
usleep(1000000);
}
}
}



评分
参与人数 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

使用特权

评论回复
5
hudi008|  楼主 | 2015-1-12 23:29 | 只看该作者
zhangmangui 发表于 2015-1-12 23:25
多少路输出的PWM啊    有没有闭环控制啊   
还望你能多多   详细分享

只要需要四路PWM控制无刷电机,控制是根据姿态来调整,下一步在做姿态结算。

使用特权

评论回复
6
rogerliu1104| | 2015-1-13 09:43 | 只看该作者
请教一下楼主,你这样写完duty再写run,能保证每次都写成功吗?我在做小车控制的时候,写数据同时写这两组数据很容易失败。

使用特权

评论回复
7
hudi008|  楼主 | 2015-1-13 10:26 | 只看该作者
rogerliu1104 发表于 2015-1-13 09:43
请教一下楼主,你这样写完duty再写run,能保证每次都写成功吗?我在做小车控制的时候,写数据同时写这两组 ...

写duty必须先关闭run

使用特权

评论回复
8
rogerliu1104| | 2015-1-13 10:38 | 只看该作者
hudi008 发表于 2015-1-13 10:26
写duty必须先关闭run

这样操作容易写失败,我用的萎缩办法是改变duty值,改变PWM占空比从而使电机能够加速减速停止。

使用特权

评论回复
9
傲视苍穹的鹰| | 2015-1-13 15:54 | 只看该作者
这是高手。。。学习了

使用特权

评论回复
10
heiheihaha1992| | 2016-3-18 21:14 | 只看该作者
您好,我有个问题想请问一下,我的pwm只能有一个工作,不能同时有两个pwm工作,请问您知道该怎么解决么 ?

使用特权

评论回复
11
cnb12345| | 2016-4-26 15:29 | 只看该作者

使用特权

评论回复
12
cnb12345| | 2016-4-26 15:30 | 只看该作者

使用特权

评论回复
13
cishengbuyu| | 2017-4-7 21:01 | 只看该作者
很有用,谢谢楼主!

使用特权

评论回复
14
BG4GKL| | 2019-6-6 20:24 | 只看该作者
这程序用什么芯片?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

251

主题

9632

帖子

11

粉丝