前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开发者成长激励计划-激光测距仪Demo

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

原创
作者头像
用户5503541
修改2022-09-02 17:42:07
7630
修改2022-09-02 17:42:07
举报
文章被收录于专栏:Locator

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

概述

原项目报名应当是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.\r\n", event );
         return;
     }
     if( btn == &xButton1 )
     {
         LOG_RAW( "Button1 %u.\r\n", event );
         return;
     }
     if( btn == &xButton2 )
     {
         LOG_RAW( "Button2 %u.\r\n", event );
         return;
     }
     LOG_RAW( "ButtonX %u.\r\n", 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上更新.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 开发环境
  • Module
    • Button
      • LCD
        • PLS-K-100
          • 通信指令
      • 进度更新
        • 09/02
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档