谷动谷力

 找回密码
 立即注册
查看: 3181|回复: 0
打印 上一主题 下一主题
收起左侧

OpenHarmony案例:基于小凌派RK2206开发板的智慧车载

[复制链接]
跳转到指定楼层
楼主
发表于 2022-8-4 09:41:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
OpenHarmony案例:基于小凌派RK2206开发板的智慧车载


一、简介

智慧车载模块是一款集超声波测距以及报警电路的模块。模块可提供2cm-300cm的非接触式距离感测功能,测距精度可达2cm,能将测量距离转化为具有一定宽度的脉冲输出;声光报警电路由外部控制,当外部处理器判断距离达到预警设定值时,控制报警电路工作。

智慧车载模块目前只是一个简单的车距测试模块,随着它的功能逐步完善,其发展的方向将更加宽广。比如:智慧车载模块可完善成为智能车载资通讯电子系统,车辆自动/辅助驾驶系统、驾驶人瞌睡警示、防撞预警、车载自我诊断系统(On Board Diagnostics,OBD)、胎压检测装置(TPMS)、车道偏离警示系统(LWDS)、前方碰撞预警系统(FCWS)及后方碰撞预警系统等智慧车(Smart Car)相关应用。

本文基于瑞芯微RK2206芯片 + LiteOS操作系统,通过gpio控制智慧车载E53模块,实现智慧车载模块和开发板的互相通信功能。


二、硬件电路设计

1、整体硬件电路设计智慧车载模块硬件电路如图1所示,电路中包含了E53接口连接器,EEPROM存储器、超声波处理电路和声光报警电路。

图1  硬件电路图

超声波测距芯片,选用CS-100A,其是一款工业级超声波测距芯片,内部集成超声波发射电路,超声波接收电路,数字处理电路等,单片即可完成超声波测距,测距结果通过脉宽的方式进行输出。

CS100A配合使用40KHz的开放式超声波探头,在超声波发射端并联一个电阻R2到地和8MHz的晶振,即可实现高性能的测距功能,电阻R2的大小决定了超声波测量的距离。

三极管Q1为NPN管,基极为高电平时,三极管才能够导通,蜂鸣器需PWM波驱动,人耳可识别的频率范围为20Hz-20KHz,故PWM频率需在该范围内,我们默认使用3KHz的PWM波驱动。

小凌派-RK2206开发板与智慧车载模块均带有防呆设计,故很容易区分安装方向,直接将模块插入到开发板的E53母座接口上即可,安装如图2所示。
图2 硬件连接图

2.智慧车载电路设计硬件资源图如下所示:



引脚名称开发者可在硬件资源图中查看,也可在智慧车载模块背面查看。



三、程序设计

本实验使用智慧车载模块模拟智慧车载测距应用。超声波模块发送并接收信号,通过发射和接收信号的时间差来计算实际测量的距离;当测量的距离小于预先设置的阈值时,驱动蜂鸣器报警,点亮告警LED灯。

1、主程序设计如图3所示,为智慧车载主程序流程图,开机LiteOS系统初始化后,进入主程序先初始化智慧车载模块。程序进入主循环,采用轮询的方式,2秒测量一次距离,当测量到的距离小于等于20厘米时,控制蜂鸣器响,告警灯亮起;当测量到的距离大于20厘米时,蜂鸣器不响应,告警灯熄灭。


图3  主程序流程图
  1. {
  2.     unsigned int ret = 0;
  3.     /* 每个周期为200usec,占空比为100usec */
  4.     unsigned int duty_ns = 500000;
  5.     unsigned int cycle_ns = 1000000;
  6.     float distance_cm = 0.0;
  7.     /*智慧车载模块初始化*/
  8.     e53_iv01_init();

  9.     while (1)
  10.     {
  11.          /*获取智慧车载模块测量的距离*/
  12.         ret = e53_iv01_get_distance(&distance_cm);
  13.         if (ret == 1)
  14.         {
  15.             printf("distance cm: %f\n", distance_cm);
  16.              /*距离小于等于20cm,开启蜂鸣器告警,点亮LED告警灯;
  17. 否则,关闭蜂鸣器,熄灭LED告警灯*/
  18.             if (distance_cm <= 20.0)
  19.             {
  20.                 e53_iv01_buzzer_set(1, duty_ns, cycle_ns);
  21.                 e53_iv01_led_warning_set(1);
  22.             }
  23.             else
  24.             {
  25.                 e53_iv01_buzzer_set(0, duty_ns, cycle_ns);
  26.                 e53_iv01_led_warning_set(0);
  27.             }
  28.         }
  29.         LOS_Msleep(2000);
  30.     }
  31. }
复制代码

2、初始化程序设计智慧车载初始化程序主要分为IO初始化和PWM设备初始化两部分。

IO初始化程序主要设置GPIO0_PC4为输出模式,作为超声波测距Trig控制管脚;设置GPIO0_PA5为输出模式,作为LED_WARNING告警灯控制管脚;设置GPIO_PA2为输入模式,作为超声波测距Echo控制管脚。
  1. {
  2.         /* Trig引脚设置为GPIO输出模式 */
  3.         PinctrlSet(E53_IV01_TRIG_GPIO, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);
  4.         LzGpioInit(E53_IV01_TRIG_GPIO);
  5.         LzGpioSetDir(E53_IV01_TRIG_GPIO, LZGPIO_DIR_OUT);
  6.         E53_IV01_TRIG_Clr();
  7.       
  8.         /* LED告警灯引脚设置为GPIO输出模式 */
  9.         PinctrlSet(E53_IV01_LED_WARNING_GPIO, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);
  10.         LzGpioInit(E53_IV01_LED_WARNING_GPIO);
  11.         LzGpioSetDir(E53_IV01_LED_WARNING_GPIO, LZGPIO_DIR_OUT);
  12.     e53_iv01_led_warning_set(0);

  13.         /* Echo引脚设置为GPIO输入模式 */
  14.         PinctrlSet(E53_IV01_ECHO0_GPIO, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);
  15.         LzGpioInit(E53_IV01_ECHO0_GPIO);
  16.         LzGpioSetDir(E53_IV01_ECHO0_GPIO, LZGPIO_DIR_IN);

  17.     }
复制代码


初始化PWM7设备,使用PWM7作为蜂鸣器的控制源。
  1. {
  2.     /* 初始化pwm */
  3.     PinctrlSet(E53_IV01_BUZZER_GPIO, MUX_FUNC2, PULL_DOWN, DRIVE_KEEP);
  4.     PwmIoInit(m_buzzer_config);
  5.     LzPwmInit(E53_IV01_PWM_IO);
  6.    
  7.     return 0;
  8. }
复制代码


3、距离测量程序设计发送至少10us的高电平给智慧车载,触发其开始工作;等待200ms,整个测距最长为66ms,获取Echo管脚的电平,当高电平时获取一个时间戳,当低电平时再获取一个时间戳,两个时间戳的差值即为超声波测距所产生的时间。
  1. {
  2.     uint8_t value = 0;
  3.     m_echo_info.flag = EECHO_FLAG_CAPTURE_RISE;

  4.     while (1)
  5.     {
  6.         LzGpioGetVal(E53_IV01_ECHO0_GPIO, &value);
  7.         if (value == LZGPIO_LEVEL_HIGH)
  8.         {
  9.             m_echo_info.time_rise = *m_ptimer5_current_value_low;
  10.             m_echo_info.flag = EECHO_FLAG_CAPTURE_FALL;
  11.             break;
  12.         }
  13.     }

  14.     while (1)
  15.     {
  16.         LzGpioGetVal(E53_IV01_ECHO0_GPIO, &value);
  17.         if (value == LZGPIO_LEVEL_LOW)
  18.         {
  19.             m_echo_info.time_fall = *m_ptimer5_current_value_low;
  20.             m_echo_info.flag = EECHO_FLAG_CAPTURE_SUCCESS;
  21.             break;
  22.         }
  23.     }

  24.     /* 释放信号量 */
  25.     LOS_SemPost(m_task_sem);
  26. }
复制代码

获得超声波测距的时间后,通过公式计算距离,计算公式:距离 = 时间差 * 340米/秒 / 2 * 100厘米/米
  1. {
  2.     float f_time = (float)time;
  3.     float f_freq = (float)freq;
  4.    
  5.     /* 距离 = 时间差 * 340米/秒 / 2(超时波来回2次) * 100厘米/米 */
  6.     *cmeter = f_time / f_freq * 170.0 * 100.0;
  7. }
复制代码


四、编译过程

1、搭建和下载源代码
我已将OpenHarmony源代码上传到Gitee社区中,大家可以根据以下网址下载。https://gitee.com/Lockzhiner-Ele ... 6-openharmony3.0lts

注意:编译环境可根据以下网址来操作:https://gitee.com/Lockzhiner-Ele ... rk2206/README_zh.md

2、打开sdk下面路径的文件
/vendor/lockzhiner/rk2206/samples/c4_e53_intelligent_vehicle_01 /e53_intelligent_vehicle_01_example.c

3、修改编译脚本
修改 vendor/lockzhiner/rk2206/sample 路径下 BUILD.gn 文件,指定 e53_iv01_example 参与编译。
"./c4_e53_intelligent_vehicle_01:e53_iv01_example"

修改 device/lockzhiner/rk2206/sdk_liteos 路径下 Makefile 文件,添加 -le53_iv01_example 参与编译。
hardware_LIBS = -lhal_iothardware -lhardware -le53_iv01_example

4、编译固件
hb set -root .hb sethb build -f

5、烧写固件
请参考Gitee网址的说明手册(“烧录打印”章节):https://gitee.com/Lockzhiner-Ele ... ckchip/README_zh.md


五、实验结果

程序编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志如下;智慧车载模块超声波探头正对着墙壁进行测距,移动模块到不同的距离,当测量的距离小于等于20厘米时,蜂鸣器响起,告警灯亮起;当测量的距离大于20厘米时,蜂鸣器不响应,告警灯熄灭。
  1. ========== E53 IV Example ==========
  2. distance cm: 23.89
  3. ========== E53 IV Example ==========
  4. distance cm: 23.90
复制代码


好了,今天的分享就到这里,我们下次再见!

+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-11-18 09:49 , Processed in 0.278698 second(s), 42 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表