HT66F2390——HC-SR04超声波配置

合泰HT66F2390超声波测距

关于HC-SR04传感器工作原理,请参考其他博客,本文主要简单分享HT66F2390的HC-SR04超声波测距配置。

定时器配置

本文用标准定时器STM1作超声波计时。

tim.h

#include "HT66F2390.h"

void tm_init();   //开启定时器
void tm1_init(void);
void tm2_init(void);

tim.c

#include "tm.h"

void  tm_init()   //开启定时器
{
//	tm1_init();
	tm2_init();
}

/* STM0 10ms中断配置 */
void tm1_init(void)
{
	_phc0=0;
	_phc1=0;
	_ph0=1;
	_ph1=0;
	_stm0c0=0b00110000;    //TIM0时钟 = sys / 64; TIM0时钟 = 16MHz / 64 = 125kHz;
	_stm0c1=0b11000001;    //定时器模式、比较计数器A匹配清0计数器 计数器计数一次为0.004ms
	_stm0al=2500&0xff;     //0.004ms * 1250 = 10ms
	_stm0ah=2500>>8;
	_stm0af=0;
	_stm0ae=1;
	_mf0f=0;
	_mf0e=1;
	_emi=1;
	_st0on=1;
}
/* STM1计时模式 */
void tm2_init(void)
{
    _stm1c0 = 0x00;  //fSYS/4
    _stm1c1 = 0xc0;  //定时 / 计数器模式,STMn 比较器 P 匹配
}

超声波配置

新建hc-sr04.h和hc-sr04.c两个文件,来配置超声波。

hc-sr04.h

#include "HT66F2390.h"
//#include "sys.h"

#define trig         _pf0
#define echo         _pf1
#define trig_t       _pfc0
#define echo_t       _pfc1

extern float  S1;
extern float  H,H1;

void hcsr04_receive1(float *H1,float *S1);

hc-sr04.c

#include "hc-sr04.h"
/*
项目名:超声波测距
平台:HT-IDE3000
版本:第二版 V2021.04.30
功能:超声波已配置成可调用的函数库,调用起来比第一版方便了许多,函数可以存放两 个参数,分别表示水位和超声波实际测试距离
备注:不同的水箱水位基准不一样,每次更换水箱都要重新配置水位相关参数
*/

float  S1;
float  H=20,H1;

void hcsr04_receive1(float *H1,float *S1)    //超声波1测水位
{
	int time=0;
	*H1=0;
	*S1=0;
	echo_t= 1;              //输入模式
	trig_t = 0;              //输出模式
	trig = 1;
	GCC_DELAY(100);      //延迟25us,GCC_DELAY(4)为1us
    trig = 0;
	while (!echo);		       //当echo为低电平,跳出等待
        _st1on = 1;                   //开始计数
	while (echo);		       //当echo为高电平,停止计数
        _st1on = 0;                   //关闭计数器1
	time = _stm1dh * 256 + _stm1dl;   //计时
	*S1=(time * 1.7) / 400;        //真实距离
	*H1=H-*S1;		//液位
}

调用hcsr04_receive1(float *H1,float *S1)函数前要先进行定时器初始化,即先调用tm_init()函数开启定时器。

某些情况下,超声波测量数据会波动,无法获取准确的距离。后期有空可能会出超声波+卡尔曼滤波的博客。

你可能感兴趣的:(合泰HT66F2390,单片机,c语言,其他)