px4Flow--替换超声波模块

几个必看的官方资料:

px4开发者指南:http://pixhawk.org/dev/px4flow

px4flow介绍:http://pixhawk.org/start?id=modules/px4flow


淘宝上的px4flow模块加上官方的超声波一般都要600左右,单买光流300多一点就可以搞定了,还有些300不到的不知道怎么样。然后就是将官方光流换成HC-SR04,这需要一个转换版,我买的光流模块,店家还不错:


直接下官方固件的话,距离为零,光流正常,接下来就是修改官方固件。

首先要清楚硬件接口的不同。这是我整理的一个官方超声波的中文版:https://download.csdn.net/download/hxudhdjuf/10305251。HC-SR04的Trig引脚与官方超声波接口的4号引脚相连,用于触发超声波模块发送超声波信号;echo引脚与2号引脚相连,接收反射回来的超声波信号,这里使用外部中断,并在产生中断时开始计时。官方4号引脚是PE8,2号引脚是PD13.

源代码在Flow/src/modules/flow/sonar.c里面,头文件在Flow/src/include/sonar.h中。

1、对C文件的修改。首先加入头文件:

#include "stm32f4xx_exti.h" 

#include "stm32f4xx_syscfg.h"

替换函数:

void sonar_trigger(){

GPIO_SetBits(GPIOE, GPIO_Pin_8);

for(int i=0;i<10;i++)
            for(int j=0;j<60;j++);
GPIO_ResetBits(GPIOE, GPIO_Pin_8);

}

#define Echo_Read() GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13)

void EXTI15_10_IRQHandler (void)
{
    if(EXTI_GetITStatus(EXTI_Line13) != RESET) //asure generate EXTI Line
    {
        
        volatile uint32_t ultra_time=0;
EXTI_ClearITPendingBit(EXTI_Line13);
        
        if(Echo_Read() == 1)
            TIM_Cmd(TIM4, ENABLE);
        else if(Echo_Read() == 0)
        {
            TIM_Cmd(TIM4, DISABLE);
            ultra_time = TIM_GetCounter(TIM4);//us
            TIM_SetCounter(TIM4,0);

            //0.001 m,the speed is 340m/s when temperature is 15 degree.function:speed=331+0.6*t
            int temp =ultra_time* 17/100; 

    if ((temp > SONAR_MIN*SONAR_SCALE) && (temp < SONAR_MAX*SONAR_SCALE))
    {
       
        last_measure_time = measure_time;
measure_time = get_boot_time_us();
sonar_measure_time_interrupt = measure_time;
dt = ((float)(measure_time - last_measure_time)) / 1000000.0f;
valid_data = temp;
// the mode filter turned out to be more problematic
// than using the raw value of the sonar
//insert_sonar_value_and_get_mode_value(valid_data / SONAR_SCALE);
sonar_mode = valid_data / SONAR_SCALE;
new_value = 1;
sonar_valid = true;
   
    else  sonar_valid = false;  
        }
    
    }

}

void sonar_config(void)
{
valid_data = 0;
GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIO clocks
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
//trig
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//echo
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;       
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOD, &GPIO_InitStructure);


EXTI_InitTypeDef EXTI_InitStructure;
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, GPIO_PinSource13); 
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure); 


NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 
TIM_TimeBaseStructure.TIM_Period = 41000-1; //not used
TIM_TimeBaseStructure.TIM_Prescaler =83; //1us pass,time count+1
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_SetCounter(TIM4,0);
        TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);
TIM_Cmd(TIM4, DISABLE);

}

其他函数不用动,可以把多余的变量删掉,最小距离改小一点。

2、h文件中只要把  void UART4_IRQHandler(void);  换成   void EXTI15_10_IRQHandler (void);  就可以了。

3、改modules.mk文件和和CMakeLists.txt文件.mudules.mk和sonar.c在同一个目录中,CMakeLists.txt在Flow目录下。

在modules.mk文件中添加两个文件,就是外部中断需要需要用到的文件


CMakeLists.txt中也要加上。


这样基本就完成了。然后保存文件并编译下载就可以了。


这里的PD13引脚连的是TIM4ch2通道,所以也可以直接用定时器的输入捕获功能。

mini四轴飞行器除了在室外各种超炫动作,但在室内若想不碰壁,就要求mini四轴飞行器具有悬停功能,四轴要有定高功能?小四轴不像大四轴有完善的GPS模块,而且小四轴的重量也很难加装GPS。这个时候选择智能光学流动传感器PX4Flow就是比较好的方案了。 PX4Flow是一款智能光学流动传感器传感器拥有原生 752×480 像素分辨率,计算光学流的过程中采用了4倍分级和剪裁算法,计算速度达到250Hz(白天,室外),具备非常高的感光度。与其他滑鼠传感器不同,它可以以120Hz(黑暗,室内)的计算速度在室内或者室外暗光环境下工作,而无需照明LED。你也可以对它重新编程,用于执行其他基础的,高效率的低等级机器视觉任务。 PX4Flow主要特征: MT9V034机器视觉CMOS传感器,全局快门 4×4分级图像算法,光流运算速度从120Hz(室内)至250Hz(室外) 高感光度,24×24 μm高像素 板载16位精度陀螺,最大感应角速率2000°/s,最大数据更新速度780 Hz,默认使用高精度模式时最大角速率500°/s 板载输入输出一体化超声波传感器 USB bootloader USB数据波特率最高921600(包含地面站软件QGroundControl所使用的摄像机实时视角) USB供电模式 电路板开孔适合MatrixVision Bluefox MV(摄像机中心作为基准) 电路城语:此资料为卖家免费分享,不提供技术支持,请大家使用前验证资料的正确性!如涉及版权问题,请联系管理员删除! 附件包含以下资料:
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值