还是上次那个芯片是STM32F4的iCore板子,上次用了串口,这次使用US-100的电平触发测距
使用电平触发测距,在给模块上电前,先把模式选择那里的跳线帽去掉,datasheet中的介绍如下
在检测到回波信号后开始定时器计时,这样就可以完成测量,代码如下
distance.h
#ifndef __distance_h__
#define __distance_h__
#include "sys.h"
#define Trig PHout(2)
void device_init(void);
float distance(void);
#endif
distance.c
#include "..\include\distance.h"
#include "..\include\sys.h"
#include "..\include\delay.h"
#include "..\include\timer3.h"
#include "..\include\usart.h"
#include "..\fwlib\inc\stm32f4xx_gpio.h"
#include "..\fwlib\inc\stm32f4xx_rcc.h"
#include "..\fwlib\inc\stm32f4xx_tim.h"
//Trig PH2 右2行2列
//Echo PH3 右2行1列
void device_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);//使能GPIOH时钟
//GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
GPIO_Init(GPIOH, &GPIO_InitStructure);//初始化
GPIO_ResetBits(GPIOH,GPIO_Pin_2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
GPIO_Init(GPIOH, &GPIO_InitStructure);//初始化
}
float distance(void)
{
float length = 0,sum = 0;
float tim;
unsigned int i = 0;
while(i != 5)
{
GPIO_SetBits(GPIOH,GPIO_Pin_2);
delay_us(20);
GPIO_ResetBits(GPIOH,GPIO_Pin_2);
while(GPIO_ReadInputDataBit(GPIOH,GPIO_Pin_3) == RESET); //等待高电平
TIM_Cmd(TIM3,ENABLE);
while(GPIO_ReadInputDataBit(GPIOH,GPIO_Pin_3) == SET); //等待低电平
TIM_Cmd(TIM3,DISABLE);
tim = TIM_GetCounter(TIM3);
length = (tim + counter*1000)/1000*170; //(定时器不满一次计数 + 重装载次数 * 重装载数)(us)/1000/1000(s)*(340000(mm)/2)
i += 1;
sum = length + sum;
TIM3->CNT = 0;
counter = 0;
delay_ms(20);
}
length = sum/5;
return length;
}
计算方式那里,我的定时器设置的是1us加一次,重装1000次,这样每次计数就是1ms,得到了length的公式,然后计5次取平均值,大家可以根据自己定时器适当修改公式
然后是main函数
int main(void)
{
delay_init(168);
float i;
char buffer[20];
led.initialize();
timer3.initialize();
device_init();
EXTIX_Init();
usart4.initialize(9600);
usart4.printf("初始化完成\r\n"); //串口4输出
while(1)
{
PIout(5) = !PIout(5);
i = distance();
usart4.printf("dis:%f mm\r\n",i);
delay_ms(1000);
}
}