合泰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()函数开启定时器。
某些情况下,超声波测量数据会波动,无法获取准确的距离。后期有空可能会出超声波+卡尔曼滤波的博客。