提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
HC-SR资料
1、典型工作用电压:5V
2、超小静态工作电流:小于 5mA
3、感应角度(R3 电阻越大,增益越高,探测角度越大):
R3 电阻为 392,不大于 15 度
R3 电阻为 472, 不大于 30 度
4、探测距离(R3 电阻可调节增益,即调节探测距离):
R3 电阻为 392 2cm-450cm
R3 电阻为 472 2cm-700cm
5、高精度:可达 0.3cm
6、盲区(2cm)超近
HC-SR04时序图
一、驱动方式
本产品使用方法:控制口发一个 10US 以上的高电平*[控制口可使用延时函数完成],就可以在接收口等待高电平输出*[判断接收口读取的电平是否处于高电平]。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。
(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
二、接口定义
Vcc:电源正极
Trig(控制端):(GPIO口推挽模式模式)使用ODR寄存器,高低电平切换中延时至少10MS
Echo(接收端):(GPIO口推挽模式模式)使用IDR寄存器,判断引脚是于高电平
Gnd:电源负极\地
三、STM32Cubemx
1、开启GPIO口,输入输出口各一个。输入定义为Echo,输出为Trig
2、开启TIM定时器,TIME=((prescaler[分频器]+1)×(period[周期]+1)/ Timeclock[时钟频率])
3、开启USART串口发送
Printf重定义(示例):
int fputc(int ch,FILE *f)
{
LL_USART_TransmitData8(USART1,ch);
while(!LL_USART_IsActiveFlag_TC(USART1));
return ch;
}
Trig控制口代码(示例):
void HC_SR()
{
LL_GPIO_SetOutputPin(GPIOC,Trig_Pin);//置Trig高电平
LL_mDelay(20);//延时20ms,可以自己切换成10ms
LL_GPIO_ResetOutputPin(GPIOC,Trig_Pin);//置Trig低电平
}
测距代码
代码如下(示例):
float HC_SRvalue(void) //
{
while(LL_GPIO_IsInputPinSet(GPIOC,Echo_Pin)==1);//echo为高电平时,则等待至低电平,才启动超声波
HC_SR(); //启动超声波
while(LL_GPIO_IsInputPinSet(GPIOC,Echo_Pin) == 0);//等待echo的高电平到来
LL_TIM_SetCounter(TIM2,0); //清零计数器
LL_TIM_EnableCounter(TIM2); //使能定时器2,开始计数
while(LL_GPIO_IsInputPinSet(GPIOC,Echo_Pin) ==1);//等待echo的高电平结束
LL_TIM_DisableCounter(TIM2); //失能定时器2,截止计数
count=LL_TIM_GetCounter(TIM2);//count全局变量
temp=count/1000000*340/2 *100; //此处单位转换为cm,temp全局变量
/* Private typedef -----------------------------------------------------------*/
}
main代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/* System interrupt init*/
/** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
*/
LL_GPIO_AF_Remap_SWJ_NOJTAG();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
//float HC_Value;
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();//GPIO初始化,由MX自动生成
MX_USART1_UART_Init();//USART1初始化,由MX自动生成
MX_TIM2_Init();//TIM2初始化,由MX自动生成
/* USER CODE BEGIN 2 */
HC_SRvalue();//HC—SR04测距函数
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
LL_GPIO_TogglePin(GPIOE,LED_Pin);
HC_SRvalue();
// HC_Value=HC_SRvalue();
LL_mDelay(500);
printf("distance:%5.2f\r\n ",temp);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
总结
无STM32CUBEMX的操作图