开发者成长激励计划-激光测距仪Demo

2022-09-02 17:42:07 浏览数 (2)

致歉: 由于疫情风控,解封后单位赶补项目进度等种种原因,项目完成度不够.在此再次向汪总及赛事举办团队表示歉意.

概述

原项目报名应当是BLDC相关项目(具体名字记不清).打板了磁编码器测试板(兼容MT6825/MT6701/MT6816)和电机驱动板(TMC6300/DRV8313/FD6288),算上几种型号电机,碰上快递无法配送啥的,到现在只测试MT6701.因此不得不改项目(凑数),翻到一个激光测距模块,驱动下.

为原项目测试打的几块板子为原项目测试打的几块板子

开发环境

原本搞了Mac环境,但今天在单位赶进度因此最终使用MounRiverIDE

MounRiver_Studio的博客 官方的博客

MounRiverIDE初次上手还是很容易的

  • 修改Debug->Run to main. 默认进入调试模式会自动停在startup_xxx.sla gp, __global_pointer$这个位置(handle_reset). 修改DebugConfigurations选项卡中Startup内,勾选set breakpoint at并填入main.
  • 显示外设寄存器 可能由于创建工程的时候选择了OS,调试的时候不能显示外设寄存器值,查看下发现是缺失SVDPath 修改DebugConfigurations选项卡中SVD PathFile path填入${eclipse_home}template/wizard/WCH/RISC-V/CH32V307/NoneOS/CH32V307xx.svd
  • 输出Bin,默认输出hex 修改项目->属性选项卡的C/C Build->Setting内的Tool Settings->GNU RISC-V Cross Create Flash Image中修改Output file format即可
  • 优化选项 修改项目->属性选项卡的C/C Build->Setting内的Tool Settings->Optimization中修改Opimization Level即可
  • Memory配置,默认工程与芯片内容不符 查询: 闪存->下载配置选项页中点击查询内存分配 修改: link.ld文件中MEMORY字段内容
  • 修改SystemClock 默认工程为72MHz 修改: system_ch32v30x.cSYSCLK_FREQ_xxMHz宏定义即可

Module

临时搭个环境,具体如下:

整体图片整体图片

如图所示,测距距离为1.4m

Button

需要使用按键控制激光测距模块进行测距,因此引入按键模块.

开发板上可用三颗用户Button.使用Multi_Button库(对原开源库进行了小幅改动)进行驱动,使用RTOS软件定时器进行驱动

  • 按键0: 切换激光指示开关
  • 按键1: 清空状态
  • 按键2: 测量
代码语言:javascript复制
 static eBtnLevel prvButtonReadpin( Button_t* btn )
 {
     if( btn == &xButton0 )
     {
         return ( eBtnLevel )BUTTON0_STATUS();
     }
     if( btn == &xButton1 )
     {
         return ( eBtnLevel )BUTTON1_STATUS();
     }
     if( btn == &xButton2 )
     {
         return ( eBtnLevel )BUTTON2_STATUS();
     }
     return eLevelHigh;
 }
 ​
 static void prvButtonEvent( Button_t* btn )
 {
     eBtnPressEvent event = btn->event;
     if( btn == &xButton0 )
     {
         LOG_RAW( "Button0 %u.rn", event );
         return;
     }
     if( btn == &xButton1 )
     {
         LOG_RAW( "Button1 %u.rn", event );
         return;
     }
     if( btn == &xButton2 )
     {
         LOG_RAW( "Button2 %u.rn", event );
         return;
     }
     LOG_RAW( "ButtonX %u.rn", event );
 }
 ​
 __API__ void vBspButtonConfig( void )
 {
     GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
     GPIO_ResetBits( GPIOA, BUTTON0_PIN | BUTTON1_PIN | BUTTON2_PIN );
     GPIO_StructInit( &GPIO_InitStructure );
     GPIO_InitStructure.GPIO_Pin =  BUTTON0_PIN | BUTTON1_PIN | BUTTON2_PIN;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
     GPIO_Init( GPIOA, &GPIO_InitStructure );
     //Software
     vBtnRegister( &xButton0, prvButtonReadpin, eLevelLow );
     vBtnAttch( &xButton0, SINGLE_CLICK, prvButtonEvent );
     // vBtnAttch( &xButton0, PRESS_DOWN, prvButtonEvent );
     // vBtnAttch( &xButton0, PRESS_UP, prvButtonEvent );
     xBtnStart( &xButton0 );
     vBtnRegister( &xButton1, prvButtonReadpin, eLevelLow );
     vBtnAttch( &xButton1, SINGLE_CLICK, prvButtonEvent );
     // vBtnAttch( &xButton1, PRESS_DOWN, prvButtonEvent );
     // vBtnAttch( &xButton1, PRESS_UP, prvButtonEvent );
     xBtnStart( &xButton1 );
     vBtnRegister( &xButton2, prvButtonReadpin, eLevelLow );
     vBtnAttch( &xButton2, SINGLE_CLICK, prvButtonEvent );
     // vBtnAttch( &xButton2, PRESS_DOWN, prvButtonEvent );
     // vBtnAttch( &xButton2, PRESS_UP, prvButtonEvent );
     xBtnStart( &xButton2 );
     //
     tos_timer_create( &xButtonTimer, 5, 5, vBtnTimerHook, K_NULL, TOS_OPT_TIMER_PERIODIC );
     tos_timer_start( &xButtonTimer );
 }

LCD

用于显示测距数据,使用官方Demo中驱动函数.本来想改SPI驱动的,但是发现使用的引脚居然不是SPI引脚.

创建独立的Task进行LCD显示刷新,测量数据通过全局变量进行传递

代码语言:javascript复制
 void task2_entry( void* arg )
 {
     LCD_Init();
     LCD_Fill( 0, 0, LCD_W, LCD_H, BLACK );
     LCD_ShowString( 30, 0, "TencentOS_Tiny", BLUE, BLACK, 24, 0 );
     LCD_ShowString( 20, 28, "RangeFinder", CYAN, BLACK, 32, 0 );
     while( 1 )
     {
         tos_task_delay( 1000 );
         LCD_ShowIntNum( 20, 70, _num  , 8, LBBLUE, BLACK, 32 );
     }
 }

PLS-K-100

UART2

特性:

  • 量程: 室内0.03~100m,室外0.03~30m
  • 分辨率: 1mm,重复精度±2mm
  • 输出频率: 2Hz
  • 光源: 635nm,<1mW,红色激光,二类安全激光
  • 温度: -30~60℃/0~40℃
  • 通信: TTL-3.3V,19200-8-N-1
  • 电压: 3.3V@80mA
通信指令

序号

寄存器地址

名称

功能

1

0x0000

REG_ERR_CODE

系统状态代码

2

0x0006

REG_BAT_VLTG

工作电压

3

0x0010

REG_ADDRESS

模块地址

4

0x0012

REG_OFFSET

模块测量结果偏移

5

0x0020

REG_MEA_START

开始测量

6

0x0022

REG_MEA_RESULT

测量结果

7

0x01BE

REG_CTRL_LD

激光二极管的控制

进度更新

09/02

整体PCB整体PCB

打了一板融合的PCB,测试中还有不少问题:

  • PCB设计有些问题,暂时通过跳线测试.
  • 使用了小封装
  • RAM太小,跑LVGL很吃力,需要个简单的GUI菜单
  • BLDC部分验证中
  • 预留了陀螺仪和地磁排针

目前整体的构想是能够

  • 支持激光测距,远距离和直线距离
  • 旋转电机测距,近距离和曲面长度
  • 结合陀螺仪和地磁实现空间面积和体积的计算测量.如实现简单的三角函数,计算面积.
  • 锂电池供电/USB供电自动切换
  • 自动关机低功耗
  • 菜单控制(按键,BLDC做旋钮)
  • BLDC周长校准

后续版本更新将在Oshwhub上更新.

0 人点赞