文档章节

瑞萨单片机(R5F100LE)利用中断和定时器HC_SR04超声波测距模块

kangxin1234
 kangxin1234
发布于 2015/07/13 23:11
字数 1379
阅读 1071
收藏 1

    HC_SR04超声波测距模块是一个很常见的模块,瑞萨的驱动还不多见,就写了这个文章,当然这个模块使用起来是比较简单的,但大多数情况下大家都使用了阻塞性的代码如while(ECHO)什么的,这样看起了有点不优雅。这篇文章介绍一个无阻塞的实现方式。

    使用了两个定器一个100us的间隔定时器用于计算ECHO高电平时间当然这样只能精确到330*0.0001 = 0.033M = 3.3CM,如果你想要更高的精度你可以用一个更精确的间隔定时器。另一个定时器为一毫秒间隔定时器,作为全局时间变量。用了一个外部中断配置为both模式,上升沿下降沿多触发中断。用于检测echo高电平时间。开P13.0口用来调试。

//引脚接线
TRIG 接P0.0
ECHO 接外部中断INTP0(P13.7)
VCC-VCC
GND-GND

下图是代码生成器的配置:

下面是主函数代码,主要作用

就是每隔500MS触发一次,超声波传感器。

/***********************************************************************************************************************
* File Name    : r_main.c
* Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
* Device(s)    : R5F100LE
* Tool-Chain   : CA78K0R
* Description  : This file implements main function.
* Creation Date: 2015/7/13
***********************************************************************************************************************/

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_intc.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
#define TRIG P0.0
//#define ECHO P0.1

extern uint32_t GlobalTime;//全局时间变量,每隔1ms加一,由1ms间隔定时器触发。

void delayMs(uint16_t ms);
/* End user code. Do not edit comment generated here */
void R_MAIN_UserInit(void);

/***********************************************************************************************************************
* Function Name: main
* Description  : This function implements main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void main(void)
{
    /* Start user code. Do not edit comment generated here */
	uint32_t nowTime=0, lastTime = 0;
	uint32_t yourTime=0, beginTime=0;
	
	uint16_t dist = 0;
	R_MAIN_UserInit();
	R_TAU0_Channel0_Start();	
    R_INTC0_Start();
	while (1U)
    {
		nowTime = GlobalTime;
        if((nowTime-lastTime)>500)//每隔500ms触发一次模块
		{
			lastTime = GlobalTime;
			P13.0 = ~P13.0;//

			TRIG = 1;
			delayMs(2);
			TRIG = 0;
		}
    }
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: R_MAIN_UserInit
* Description  : This function adds user code before implementing main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
void delayMs(uint16_t ms)
{
	uint32_t Tim = GlobalTime + ms;
	while((Tim - GlobalTime)>0);
}
/* End user code. Do not edit comment generated here */

定时器用户文件,主要就是全局计时,HCSR04CNT 用于ECHO高电平计时,在外部中断中被触发计数。

/***********************************************************************************************************************
* File Name    : r_cg_timer_user.c
* Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
* Device(s)    : R5F100LE
* Tool-Chain   : CA78K0R
* Description  : This file implements device driver for TAU module.
* Creation Date: 2015/7/13
***********************************************************************************************************************/

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
#pragma interrupt INTTM00 r_tau0_channel0_interrupt
#pragma interrupt INTTM01 r_tau0_channel1_interrupt
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
uint32_t GlobalTime=0;
uint32_t HCSR04CNT=0;//用于ECHO高电平计时
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
* Function Name: r_tau0_channel0_interrupt
* Description  : This function is INTTM00 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
__interrupt static void r_tau0_channel0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
	++GlobalTime;
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_tau0_channel1_interrupt
* Description  : This function is INTTM01 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
__interrupt static void r_tau0_channel1_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
	++HCSR04CNT;
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

外部中断用户文件。外部中断被配置为both模式,上升沿和下降沿触发中断,用于简单状态机处理这个逻辑。状态0是ECHO刚变为高电平触发了中断,状态0中开启100us定时器开始计时ECHO高电平时间,状态1是ECHO由高电平变为低电平触发中断,这是关闭中断并且取出HCSR04CNT的计数值计算距离单位为cm。

/***********************************************************************************************************************
* File Name    : r_cg_intc_user.c
* Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
* Device(s)    : R5F100LE
* Tool-Chain   : CA78K0R
* Description  : This file implements device driver for INTC module.
* Creation Date: 2015/7/13
***********************************************************************************************************************/

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
#pragma interrupt INTP0 r_intc0_interrupt
/* Start user code for pragma. Do not edit comment generated here */

/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_intc.h"
/* Start user code for include. Do not edit comment generated here */
#include "r_cg_timer.h"
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
extern uint32_t GlobalTime;
extern uint32_t HCSR04CNT;
uint16_t Distance=0;
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
* Function Name: r_intc0_interrupt
* Description  : This function is INTP0 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
__interrupt static void r_intc0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
	static uint8_t state=0;
	static uint16_t pro=0;
	
	
	switch(state)
	{
		case 0:
		{
			if(P13.7)
			{
				state = 1; 
				R_TAU0_Channel1_Start();//上升沿中断触发100us间隔定时器计数
			}
			else
				state = 0;
		}break;
		case 1:
		{
			if(!P13.7)
			{
				state = 0; 
				R_TAU0_Channel1_Stop();//下降沿中断关闭100us间隔定时器
				pro = HCSR04CNT;
				HCSR04CNT = 0;
				if(pro<200)
				{
					Distance = pro*3.3/2;//计算距离100us == 3.3cm
				}
			}
			else
				state = 0;
		}break;
		default:state=0;break;
	}

	
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */


注意:使用时去掉中文注释。cutesuite + 对中文支持不好。

代码工程链接不明白的地方可以下来工程看看


瑞萨单片机(R5F100LE)利用中断和定时器HC_SR04超声波测距模块Cubesuite + 工程


© 著作权归作者所有

kangxin1234

kangxin1234

粉丝 38
博文 51
码字总数 35417
作品 0
程序员
私信 提问
[自娱自乐] 3、超声波测距模块DIY笔记(三)

前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射...

史迪奇2号
2017/08/09
0
0
【树莓派智能家居】超声波测距(Python2代码控制)

正文之前 这是计算机控制系统的课程设计,巨坑,但是没办法,还是要做,主要是要做控制器,但是我以前搞过这个超声波模块的小玩具。所以索性做个智能家居的玩意来玩。这一篇是打头阵的。中心...

HustWolf
2017/12/27
0
0
超声波传感器测距原理与模块使用

超声波 ultrasonic (waves): 人类耳朵能听到的声波频率为20HZ~20KHz。当声波的振动频率大于20KHz或小于20Hz时,我们便听不见了。因此,我们把频率高于20KHz赫兹的声波称为“超声波”。因其...

u014224380
2018/03/28
0
0
pcDuino上使用Serial 16×2 LCD和超声波测距

Serial 16×2 LCD 和 超声波测距我们之前的实验有涉猎到,把这两个结合起来能完成很有趣的实验。 实验准备 Serial 16×2 LCD 一块 HC-SR04 超声波模块一块 pcDuino v2 一块 面包板一个 杜邦线...

酸酸苹果汁
2014/03/12
328
0
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zk中选举Leader时的网络IO QuorumCnxManager解析

每台服务启动过程中,会启动一个QuorumCnxManager,负责各台服务器之间底层Leader选举过程中的网络通信 当集群中有服务器服务中断时,zk会重新选举leader 内部类 Message定义消息结构 包含了...

writeademo
19分钟前
2
0
使用mdBook 替代 gitbook。

###** 为什么要替代gitbook** gitbook 有个模板问题:如果md文件中有连续的大括号(比如:&{{父亲 40}}),gitbook会把{{ 父亲 40 }}中的父亲 40当做一个模板变量。如果这个变量不存在,会报...

王坤charlie
22分钟前
3
0
TL-A7HSAD采集卡硬件的处理器、NOR FLASH、DDR3

TL-A7HSAD是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的高速数据采集卡,可配套广州创龙TMS320C6655、TMS320C6657、TMS320C6678开发板使用。该采集卡包含1个双通道250MSPS*12Bit的高...

Tronlong创龙
34分钟前
3
0
项目启动报fastjson版本可能过低

进行项目启动的过程中,之前都正常,这次启动突然就失败了: 查看日志说的是版本过低,后来查看官方网站版本,替换了最新版本: 选择了最新版本的1.2.60,1.2.62尝试后都不行,后来查看网上搜...

aiChuang
34分钟前
3
0
McDonald’s is using Alexa and Google to accepting job applications

McDonald’s today announced a new initiative the fast food chain is calling the “Apply Thru,” in which owners of Amazon Alexa or Google Assistant devices can begin job applic......

wowloop
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部