查看: 1030|回复: 0

APM飞控固件编程-GPIO输入

[复制链接]

50

主题

811

帖子

1636

积分

金牌飞友

Rank: 6Rank: 6

积分
1636
飞币
816
注册时间
2017-9-5
发表于 2023-4-15 13:41:51 | 显示全部楼层 |阅读模式
有时候,我们的飞控需要引入一些外部IO信号,比如:

01

相机拍照反馈

单反相机热靴接口的反馈信号,用于将照片拍摄的位置和时间保存到飞控的日志中;

02

液位仪IO信号

植保无人机检测剩余药量是否低于警戒值;

03

弹射检测信号

通过一个金属触点弹片来检测无人机是否从发射架上弹射出去,对于一些需要延迟开启推进电机的应用比较有用。

硬件基础

    对于大部分运行APM固件的飞控来讲,其第9通道以后(含)的PWM输出通道同时也支持作为GPIO输入,当然,部分飞控硬件的前8个通道也支持作为GPIO输入,这与飞控的硬件架构相关。

    如下图所示,此飞控的PWM1~PWM8使用了SN74LVC8T245这款芯片作为接口保护芯片,并且将此芯片的方向控制引脚固定拉低,从而这8个通道只支持作为PWM输出或者GPIO输出。

    如下图所示,其PWM9~PWM16通道使用了TXS0108ERGYR这款芯片作为接口保护芯片,这款芯片支持自动切换各个通道的方向的功能,因此这8个通道既可以作为PWM输出,也可以作为GPIO输入。

APM飞控固件编程-GPIO输入w2.jpg

软件编程

    APM固件的GPIO输入功能的使用是非常简单的,如下面的例子所示:

// 第一步,将GPIO50设置为输入模式hal.gpio->pinMode(50, HAL_GPIO_INPUT);
// 第二步,将GPIO50设置为内部上拉(可选,可以不上拉;如果要下拉,则第二个参数设置为0)hal.gpio->write(50, 1);
// 第三步,读取GPIO50的状态,返回值为0表示低电平,为1表示高电平uint8_t gpio_state = hal.gpio->read(50);
    注意,例程中的“50”是“软件层面”的GPIO号,不是STM32单片机“硬件层面”的GPIO号,并且各个飞控的定义不同。此值的定义在APM源代码“Libraries/AP_HAL_ChibiOS/hwdef/飞控硬件名/hwdef.dat”中,下图为原版Pixhawk对于GPIO号的定义:

APM飞控固件编程-GPIO输入w3.jpg

参数设置

    对于最新的APM固件,“BRD_PWM_COUNT”这个参数已经被删掉了,因此不需要设置这个参数。



      SERVOx_FUNCTION:设置为-1。注意,AUX OUT引脚的标号在参数表中是从9开始依次递增的,如AUX OUT 1引脚对应SERVO9,AUX OUT 2引脚对应SERVO10,依次类推。



你看的没错,只需要设置这一个参数即可,非常简单。

结语

    以上就是APM固件GPIO输入功能的使用方法,希望对对大家有所帮助,更多飞控固件开发视频教程,链接地址:https://study.163.com/course/introduction/1209568864.htm?share=1&shareId=1448054983
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表