benewake 发表于 2017-11-23 17:48:20

TF模块在pixhawk上定高方案

使用TF01模块在四轴飞行器下垂直向下安装,用来检测四轴飞行器的对地高度。测试的飞控平台是pixhawk,我们设计了一个数据转接板,将TF01的数据接收解析后再转发给pixhawk飞控。1   Pixhawk定高原理简述pixhawk为APM、PX4的升级版,其中APM使用的是普通的8位单片机,运算能力有限,PX4是一个开始使用STM32F4的过渡性产品,而pixhawk是PX4基础上发展的更加完善和可靠的飞控。对于此系列开源飞控的介绍,可详细参考:http://ardupilot.org/,这个网站介绍的非常详细和可靠的介绍了pixhawk,完全可以按照这个网站来学习了解飞控。Pixhawk定高的原理:
Lidar’s are used in flight modeswhich have height control, such as Altitude Hold, Loiter and PosHold Mode.The data from the sensor will be used until you exceed RNGFND_MAX_CM, afterthat it switches to the barometer. Currently Lidar is not supported in AutoMode.如上面所述,雷达在定高模式,悬停模式和定点模式中起作用。只有当雷达数据超过RNGFND_MAX_CM后才会转换为使用气压计定高。
Pixhawk上常用的距离传感器有数据的输入方式有模拟输入、I2C输入、串口方式输入和PWM输入方式。具体可详细参考http://ardupilot.org/copter/docs/common-rangefinder-landingpage.html。 2   串口输入模式建议使用串口输入方式给pixhawk提供高度信息。同时需要注意的是,使用串口输入方式的情况下,TF01模块输出协议,固件版本最低为V3.3.3。2.1.1接线图 图 1 (a) 串口输入方式连接示意图 图1 (b) 串口输入方式连接示意图 2.1Mission Planner配置说明    将飞控连至MP,在下面的CONFIG/TUNING栏里面选择左侧的Full Parameter List,找到并修改下面几个参数:·      SERIAL4_PROTOCOL = 9 (Lidar)·      SERIAL4_BAUD = 115·      RNGFND_TYPE = 8 (LightWareSerial)·      RNGFND_SCALING = 1·      RNGFND_MIN_CM = 5·      RNGFND_MAX_CM = 1200 ·      RNGFND_GNDCLEAR = 5 单位是cm,或者使用更精确的值,取决于模块安装高度。设置好这几个参数后,点击软件右侧的Write Params即可。具体配置要点请参考图 2和图3: 图 2 串口参数配置 图 3 串口输入模式RNG参数配置如果出现Bad Lidar Health错误,请首先检查TF01雷达发射窗口是否有红色LED光线发出,如果没有红色LED光线,请检查供电是否正常(SERIAL 4/5口供电pixhawk有时会供电不足)。如果发出了LED光线错误任然存在,请检查串口接线是否正确。如以上排查后仍无法显示正常距离值,请使用串口2连接(TELEM2)。接线方式无异如图1(b)所示,参数表中的串口配置项更改为·      SERIAL2_PROTOCOL = 9 (Lidar)·      SERIAL2_BAUD = 115 3   AD输入模式       使用AD输入方式依赖一块额外的转发板。我们将TF01模块的数据先发送给一个STM32板,然后使用STM32板将数据转换为pixhawk能检测的AD数据。同样需要注意的是TF01模块、转接板和pixhawk需要共地处理。如图4: 图 4 模拟输入方式连接示意图3.1连线说明       将距离数据使用模拟信号输入至pixhawk的连接方式如图5:接线说明:红色:3.3V供电橙色:AD模拟信号黑色:GND 图 5 模拟信号输入的接线说明3.2Mission Planner配置说明    将飞控连至MP,在下面的CONFIG/TUNING栏里面选择左侧的Full Parameter List,找到并下面几个参数: ·      RNGFND_PIN = “14” for Pixhawk’s ADC 3.3v pin #2 OR “0”for APM2.x·      RNGFND_MAX_CM = “1200” (i.e. 12m max range) ·      RNGFND_SCALING = “4” (i.e. 4m / 1v)·      RNGFND_TYPE = “1” (Analog)其中,STM32的DA模块只能输出0-3.3V的电压。实验中,我们设置为当测量距离为12m时,输入给pixhawk的电压为3V。RNGFND_SCALING设置为4。(用户也可以自行设置,但是转发板里的也需要相应的改动。)设置好这几个参数后,点击软件右侧的Write Params即可。具体配置要点请参考图6: 图 6 模拟输入模式RNG配置要点3.3STM32转发板参考程序接收并解析TF01模块的距离信息:
// 全局变量u16 distance = 0;// 串口使用的变量static u8Usart1buf;static u8 pointer = 0; // 串口1初始化函数void USART1_Init(void){               USART_InitTypeDef USART1_InitStructure;         GPIO_InitTypeDef GPIO_InitStructure;         NVIC_InitTypeDef NVIC_InitStructure;                  // A口时钟         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);         // A9 -> TX   ,A10 -> RX         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;          GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         GPIO_Init(GPIOA,&GPIO_InitStructure);                  // 复用功能配置         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);         // USART1时钟         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);         // USART1中断优先级         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         NVIC_Init(&NVIC_InitStructure);         // USART1初始化         USART_DeInit(USART1);         USART1_InitStructure.USART_BaudRate = 115200;         USART1_InitStructure.USART_WordLength =USART_WordLength_8b;         USART1_InitStructure.USART_StopBits = USART_StopBits_1;         USART1_InitStructure.USART_Parity = USART_Parity_No;         USART1_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;         USART1_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;         USART_Init(USART1,&USART1_InitStructure);         USART_Cmd(USART1,ENABLE);         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);} // 串口中断函数voidUSART1_IRQHandler(void){                  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET            ||(USART_GetITStatus(USART1, USART_IT_ORE_RX) != RESET))         {                   USART_ClearITPendingBit(USART1, USART_IT_RXNE);                   Usart1buf = USART_ReceiveData(USART1);                                      // 在此写代码接收程序                   if((pointer%USART1_BUF_SIZE >= 9))                   {                            // 包头包尾确认                            // 最好加上校验和的验证,此处为了简单,省略了校验和                            if(    (Usart1buf==0x59)                                     &&(Usart1buf==0x59))                            {                                     //距离                                     distance=((u16)((Usart1buf)<<8)                                                   |(u16)(Usart1buf));                            }                   }          }}
DAC的配置:
void DAC_Config(void){         GPIO_InitTypeDef GPIO_InitStructure;          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);                                  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;         GPIO_Init(GPIOA, &GPIO_InitStructure);                        DAC_InitTypeDef   DAC_InitStructure;         DAC_DeInit();          DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;         DAC_InitStructure.DAC_WaveGeneration =DAC_WaveGeneration_None;         DAC_InitStructure.DAC_OutputBuffer =DAC_OutputBuffer_Enable;         DAC_Init(DAC_Channel_1, &DAC_InitStructure);         DAC_Cmd(DAC_Channel_1,ENABLE);                  DAC_SetChannel1Data(DAC_Align_12b_R,0x1fff);                  DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);}
主函数:
// TF01模块测试的高度,单位mmfloat test_height;// 高度偏置,单位mmfloat bias = 180;// 应该输出的模拟值s16 analog=0; // 主函数void main(void){         // 中断分组的配置         NVIC_Config();         // 串口初始化         USART1_Init();         // DAC配置         DAC_Config();                  // 主循环         while(1)         {                   // 去除偏置                   test_height = distance - bias;                   // 数据转换,3V对应高度为12m,则:                   // test_height * 3.3 * 4096/(3 *1200)= test_height * 4096 / 1320                   analog = (s16)(test_height*4096/1320);                   // 范围限制                   analog = analog < 4095 ? analog : 4095;                   analog = analog > 0 ? analog : 0;                   // 电压输出                   DAC_SetChannel1Data(DAC_Align_12b_R,analog);                   DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);         }}

4   数据测试说明    在Mission Planner的飞行数据栏里,点击左下方的Status栏,找到里面的sonarrange和sonarvoltage。其中sonarrange表示实际距离,sonarvoltage表示模拟输入电压。参考图 7: 图 7 传感器距离测试参考图(测试传感器能否正确读取距离)5   PID参数调试pixhawk的PID飞行参数调试全部可以在Mission Planner上完成,请参考此网站调试pixhawk的参数http://ardupilot.org/copter/docs/common-tuning.html。
页: [1]
查看完整版本: TF模块在pixhawk上定高方案