概要

前段时间通过iceasy 商城样片申请收到了萤火工厂的 24GHz 毫米波雷达模块CEM5826-M11和灵动微的EVB-L0136开发板,今天将雷达模块接入开发板并使用板载段码 LCD 屏对雷达数据进行展示,学习和理解段码 LCD 屏。

接线图展示

正面
雷达

  • 用到的器件

    • EVB-0136(MM32L0136C7P)开发板
    • CEM5826-M11 雷达模块
    • daplink 烧录器 + 串口输出
  • daplink 到开发板 CN7 SWD 接线
    SWD

    • SWD -> SWD IO(SWD 7 号引脚)
    • CLK -> SWC LK(SWD 9 号引脚)
  • daplink 到开发板 UART2 TX 串口接线

    • RX -> PA2 (复用为 UART2 TX)
  • CEM5826-M11 到开发板 UART1 CN9 串口接线
    CEM5826-M11

    • TX -> PA10
    • RX -> PA9
    • 3V -> SWD 1 号引脚 (随便找的 3V 供电)
    • GND -> SWD 20 号引脚(随便找的 GND)

段码 LCD 认识

LCD

上图是 EVB-L0136 板载段码 LCD 简图

控制原理业余解释

来自 GPT 的解释:段码 LCD 屏的显示原理主要依赖于 COM(Common)和 SEG(Segment)的配合使用。COM 作为公共驱动,SEG 作为区段驱动,它们共同控制着 LCD 上部分像素点的显示。当对应 COM 口和对应的 SEG 口之间的压差达到最大值时,两者联合控制的像素点将会显形。

通俗理解:通过 com 控制一行,seg 控制一个段,组合显示字符

LCD 引脚映射图

上表对段码 LCD 屏里每个“段”进行编码,举例:要在 1 号数字段上显示 2,则需要点亮的段为:1A, 1B, 1G, 1E, 1D

像是火柴棒数字组合游戏一样,由于每个可显示字符由段拼接而成,因此段码屏只能显示有限的字符数字集。从官方 SLCD_BASIC 示例代码中可看到字符集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const SLCD_Code_TypeDef SLCD_CodeTable[38] =
{
{ ' ', 0x00 },
{ '0', 0x3F },
{ '1', 0x06 },
{ '2', 0x5B },
{ '3', 0x4F },
{ '4', 0x66 },
{ '5', 0x6D },
{ '6', 0x7D },
{ '7', 0x07 },
{ '8', 0x7F },
{ '9', 0x6F },
{ 'A', 0x77 },
{ 'b', 0x7C },
{ 'c', 0x58 },
{ 'C', 0x39 },
{ 'd', 0x5E },
{ 'E', 0x79 },
{ 'F', 0x71 },
{ 'g', 0x6F },
{ 'H', 0x76 },
{ 'h', 0x74 },
{ 'i', 0x04 },
{ 'I', 0x30 },
{ 'J', 0x1E },
{ 'l', 0x30 },
{ 'L', 0x38 },
{ 'n', 0x54 },
{ 'o', 0x5C },
{ 'O', 0x3F },
{ 'P', 0x73 },
{ 'q', 0x67 },
{ 'r', 0x50 },
{ 'S', 0x6D },
{ 't', 0x78 },
{ 'u', 0x1C },
{ 'U', 0x3E },
{ 'y', 0x6E },
{ '-', 0x40 },
};

比如就无法显示字母X

SLCD_BASIC 示例代码解读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const SLCD_Code_TypeDef SLCD_CodeTable[38] =
{
{ ' ', 0x00 },
{ '0', 0x3F },
{ '1', 0x06 },
{ '2', 0x5B },
{ '3', 0x4F },
...
};

void SLCD_DisplayNumber1(uint8_t Index, char ch, uint8_t Point)
{
char TAB[4][8][4] =
{
{ "1A ", "1B ", "1C ", "1D ", "1E ", "1F ", "1G ", "DP1" },
{ "2A ", "2B ", "2C ", "2D ", "2E ", "2F ", "2G ", "DP2" },
{ "3A ", "3B ", "3C ", "3D ", "3E ", "3F ", "3G ", "DP3" },
{ "4A ", "4B ", "4C ", "4D ", "4E ", "4F ", "4G ", " " },
};
...
uint8_t Code = SLCD_SearchCode(ch);
...
for (i = 0; i < 7; i++)
{
SLCD_WriteBit(COMn, SLCD_SCH[SEGn].Line, SLCD_SCH[SEGn].LineGroup, (Code >> i) & 0x01);
}
...
}

上面结构体将字符编码为7bit显示,为啥是7bit呢?
上面小节看到一个数字段由 ABCDEFG 7 个段组成,因此要显示一个具体字符只要控制不同段的明亮即可完成。

比如字符2,控制 1A, 1B, 1G, 1E, 1D 点亮即可显示,用二进制里的 1 表示点亮,0 表示熄灭,对 7 个段进行编码得到 A(1)/B(1)/C(0)/D(1)/E(1)/F(0)/G(1),二进制为0b1101101,代码里为啥定义为0x5B = 0b1011011呢?
SLCD_DisplayNumber1使用来看,为了方便处理通过Code >> i操作获取某一个段的值,算法从 A 到 G 处理因此将0b1101101反转为0x5B恰好满足算法要求。

实验思路

结合EVB-L0136开发板官方示例代码UART_Polling + SLCD_Basic 组合实现

串口读取雷达数据

CEM5826-M11雷达模块提供串口输出雷达数据,因此这里通过EVB-L0136开发板的 UART1 进行数据读取,为了方便调试同时使用 UART2 进行雷达数据输出。每300ms获取一次雷达数据。

段码 LCD 展示雷达数据

本次实验主要用到几个数字段:

  • 1~4 号数字段:显示雷达模块检测到的运动速度(支持负数,保留小数点后 1 位显示)
  • 5~10 号数字段:显示雷达模块检测到的信号强度

LED 灯

开发板读取到一行完整雷达数据(完整数据格式示例v=-0.6 km/h, str=123\r\n\r),板载绿色 LED 灯闪烁一次。

效果展示

B 站

源代码

github

总结

通过CEM5826-M11雷达模块接入EVB-L0136开发板,熟悉了灵动微MM32L0136C7P系列 HAL 库的使用。HAL 库封装的挺完整的,常用功能都能找到,使用习惯和STM32相近大大减少了MM32系列开发和学习成本。

最后:上次提到这块开发板跑官方示例 SLCD 代码每次按 RST 后会触发一声蜂鸣器响,通过 Debug 单步调试发现是如下代码导致:

1
2
3
4
5
6
7
8
void SLCD_Configure(void)
{
...
// SLCD_Clear(1);
// PLATFORM_DelayMS(1000);
SLCD_Clear(0);
...
}

SLCD_Clear(1);对寄存器写SLCD->DR[i] = 0xFFFFFFFF;, 会触发蜂鸣器声响。具体哪个寄存器置 1 后发出声响未具体探究,这里将其简单注释掉。