致歉: 由于疫情风控,解封后单位赶补项目进度等种种原因,项目完成度不够.在此再次向汪总及赛事举办团队表示歉意.
概述
原项目报名应当是BLDC相关项目(具体名字记不清).打板了磁编码器测试板(兼容MT6825/MT6701/MT6816)和电机驱动板(TMC6300/DRV8313/FD6288),算上几种型号电机,碰上快递无法配送啥的,到现在只测试MT6701.因此不得不改项目(凑数),翻到一个激光测距模块,驱动下.
开发环境
原本搞了Mac环境,但今天在单位赶进度因此最终使用MounRiverIDE
MounRiver_Studio的博客 官方的博客
MounRiverIDE初次上手还是很容易的
- 修改Debug->Run to main.
默认进入调试模式会自动停在
startup_xxx.s
的la gp, __global_pointer$
这个位置(handle_reset). 修改DebugConfigurations
选项卡中Startup
内,勾选set breakpoint at
并填入main
. - 显示外设寄存器
可能由于创建工程的时候选择了OS,调试的时候不能显示外设寄存器值,查看下发现是缺失SVDPath
修改
DebugConfigurations
选项卡中SVD Path
内File 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.c
中SYSCLK_FREQ_xxMHz
宏定义即可
Module
临时搭个环境,具体如下:
如图所示,测距距离为1.4m
Button
需要使用按键控制激光测距模块进行测距,因此引入按键模块.
开发板上可用三颗用户Button.使用Multi_Button库(对原开源库进行了小幅改动)进行驱动,使用RTOS软件定时器进行驱动
- 按键0: 切换激光指示开关
- 按键1: 清空状态
- 按键2: 测量
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设计有些问题,暂时通过跳线测试.
- 使用了小封装
- RAM太小,跑LVGL很吃力,需要个简单的GUI菜单
- BLDC部分验证中
- 预留了陀螺仪和地磁排针
目前整体的构想是能够
- 支持激光测距,远距离和直线距离
- 旋转电机测距,近距离和曲面长度
- 结合陀螺仪和地磁实现空间面积和体积的计算测量.如实现简单的三角函数,计算面积.
- 锂电池供电/USB供电自动切换
- 自动关机低功耗
- 菜单控制(按键,BLDC做旋钮)
- BLDC周长校准
后续版本更新将在Oshwhub上更新.