PX4通过程序输出PWM波控制舵机或者电机

1.先在机架启动脚本中设置PWM引脚(这步不做的话无法输出PWM波)
以450机架为例
其原来的设置如下
set MIXER quad_x
set PWM_OUT 1234

只设置了四个通道

改成如下
set MIXER quad_x
set PWM_OUT 12345678
set PWM_AUX_OUT 123456
set MIXER_AUX dodeca_bottom_cox
设置PWM通道,同时设置一个辅助混控
这样的话就将其他的通道设置用来输出PWM波

调用驱动接口
在自己的线程中添加如下
#include <drivers/drv_pwm_output.h>
#define PX4FMU_DEVICE_PATH “/dev/px4fmu”

int fd = open(PX4FMU_DEVICE_PATH, O_RDWR);//fd打开的是FMU通道
if (fd < 0) {
errx(1, “open fail”);
}
if (ioctl(fd, PWM_SERVO_GET_COUNT, (unsigned long)&servo_count) != 0) {
err(1, “Unable to get servo count\n”);
}
nt i=6;//i代表第几个PWM通道
ret=ioctl(fd, PWM_SERVO_SET(i), 1000);//PWM值为1000-2000都可以
if (ret != OK) {
PX4_ERR(“PWM_SERVO_SET(%d)”, i);


 

  • 0
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
下面是一个通过C语言编写的51单片机,通过PWM控制舵机的代码示例: ``` #include<reg51.h> sbit pwm=P1^0; // 定义PWM控制pin P1.0 sbit servo=P1^1; // 定义舵机控制pin P1.1 void delay_us(unsigned int n) { while(n--); } void main() { TMOD = 0x01; // 定时器1工作在模式1,16位计数器,使用时钟频率 TH1 = 0x3c; // 重载值,50ms TL1 = 0xb0; ET1 = 1; // 打开定时器1中断允许位 EA = 1; // 打开总中断允许位 TR1 = 1; // 启动定时器1 while(1) { servo = 1; delay_us(800); servo = 0; delay_us(19200); } } void Timer1() interrupt 3 using 1 { static unsigned int cnt=0; cnt++; //计数器增加 if(cnt>200) { cnt = 0; pwm = ~pwm; // PWM每50ms翻转一次 } } ``` 这段代码中,我们定义了两个引脚P1.0和P1.1,P1.0作为PWM输出引脚,用来控制舵机旋转的方向和速度;P1.1作为舵机控制引脚,用来控制舵机的角度。我们通过定时器1中断实现PWM输出控制舵机的转动。具体实现过程如下: 在主程序中,我们使用while(1)循环来控制舵机的转动。每次循环,我们将舵机控制pin P1.1置为1,延时880us,然后将其置为0,再延时19200us,保证舵机能够回到初始位置。 在定时器1中断处理程序中,我们使用一个计数器cnt来记录定时器1中断发生的次数。在cnt累计到200时(50ms),我们翻转PWM输出引脚P1.0的状态,并将计数器清零,等待下一次PWM输出。其中,使用到了一个delay_us()函数来延时,其实现过程与延时函数delay()类似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南京超维空间智能科技有限公司

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值