pixhawk: px4代码初学分析:追溯电机控制--pwm输出

正常工作状态下pwm输出过程简述:

  1. 姿态解算部分得出姿态控制量
  2. 通过px4io.cpp把姿态控制量发送给IO
  3. IO串口读取姿态控制量
  4. 调用systemlib部分进行mix,将姿态控制量转化为电机控制量
  5. 在mixer_tick()中将电机控制量转化为pwm控制量并调用up_pwm_servo_set()设置pwm寄存器
  6. pwm输出

如图:
在这里插入图片描述
大致就是这样,或许会有些许遗漏,不排除有错误,因为这是通过代码分析得出的,没有经过实验验证。

其他状态下pwm输出:

其他状态比如disarmed 和failsafe等,我还没有梳理,应该会比较简单就能梳理出来,这些都属于特殊状态,不会有这么复杂的控制流。如果有必要再说。

PX4飞控中,PWM控制代码主要负责控制电调输出PWM信号,以控制电机转速。以下是一个简单的PWM控制代码示例: ```c++ #include <px4_platform_common/px4_config.h> #include <px4_platform_common/tasks.h> #include <drivers/drv_pwm_output.h> int main(int argc, char *argv[]) { // 初始化PWM输出 px4_arch_configgpio(GPIO_PWM_OUT1); px4_arch_configgpio(GPIO_PWM_OUT2); px4_arch_configgpio(GPIO_PWM_OUT3); px4_arch_configgpio(GPIO_PWM_OUT4); // 配置PWM输出通道参数 struct pwm_output_values pwm_values; pwm_values.channel_count = 4; pwm_values.default_value = 1000; pwm_values.values[0] = 1000; pwm_values.values[1] = 1000; pwm_values.values[2] = 1000; pwm_values.values[3] = 1000; ioctl(PWM_OUTPUT_GET_CHANNEL_COUNT, 0, (unsigned long)&pwm_values); // 控制PWM输出 while (true) { pwm_values.values[0] = 1200; pwm_values.values[1] = 1300; pwm_values.values[2] = 1400; pwm_values.values[3] = 1500; ioctl(PWM_OUTPUT_SET_SAFETY_LOCK, 0); ioctl(PWM_OUTPUT_SET_ARM_OK, 0); ioctl(PWM_OUTPUT_SET_DISARMED_PWM, 0, pwm_values.default_value); ioctl(PWM_OUTPUT_SET_MODE, PWM_OUTPUT_MODE_ONESHOT); ioctl(PWM_OUTPUT_SET_CONFIG, 0, (unsigned long)&pwm_values); ioctl(PWM_OUTPUT_UPDATE_CHANNELS, 0, (unsigned long)&pwm_values); usleep(20000); } return 0; } ``` 在上述示例代码中,首先通过调用`px4_arch_configgpio`函数初始化PWM输出引脚,然后配置PWM输出通道参数。在控制PWM输出时,通过调用`ioctl`函数设置PWM输出的安全锁、启动状态、解锁时的PWM值、输出模式和输出参数,最后通过调用`ioctl`函数更新PWM输出值。 需要注意的是,上述示例代码中的PWM输出值仅作为示例,实际应用中需要根据具体需求进行调整。同时,为了保证PWM输出的稳定性和安全性,通常需要在飞控系统中实现一些保护机制,如输出PWM频率限制、输出值范围限制等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值