超声波模块-HC-SR04
CubeMX配置
配置两个IO口,一个输入模式做为信号接收(ECHO),一个推挽输出做为信号发射(TRIG)
开启一个基本定时器,用于定时,溢出时间为50ms
驱动代码
u_ultrasonic.h
#ifndef _U_ULTRASONIC_H_
#define _U_ULTRASONIC_H_
#include "main.h"
float Get_Distance(TIM_HandleTypeDef* htim); //超声波测距
#endif //_U_ULTRASONIC_H_
u_ultrasonic.c
//返回值为距离,单位为cm
// 参数为定时器句柄,可自由选择空闲的定时器
float Get_Distance(TIM_HandleTypeDef *htim) // 超声波使用到的定时器。
{
unsigned int x1,x2; //接收端高电平起始、结束时定时器的计数值
float Distance; //定义距离
htim->Instance->CNT = 0; //清空定时器计数值
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,GPIO_PIN_SET); //开始测距,将TRIG拉高
HAL_Delay(1); //保持高电平10us以上
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,GPIO_PIN_RESET); //将TRIG拉低
while(HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 0); //等待ECHO的高电平起始时间
x1 = htim->Instance->CNT;
while(HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 1); //记录ECHO高电平结束时间
x2 = htim->Instance->CNT;
htim->Instance->CNT = 0; //
Distance = (x2-x1)*0.017 ; //计算距离,单位为cm
return Distance;
}
main
PrintfDebug()函数的使用方法在之前的文章里有介绍:https://blog.csdn.net/weixin_60301126/article/details/131327438
int main(void)
{
float Distance;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
HAL_TIM_Base_Start(&htim6);
while (1)
{
Distance = Get_Distance(&htim6);
PrintfDebug("distance = %0.1fcm\r\n",Distance); //串口调试函数
HAL_Delay(400);
}
}
舵机模块-DS3120
与那种蓝色的小舵机一样使用,黑色线接GND,红色线接+V5,黄色线接单片机IO口。
这种舵机的功耗要比蓝色小舵机的高很多,电源部分如果做的不是很好尽量不要让DS3120转动的太频繁。
CubeMX配置
开启一个溢出时间为20ms的PWM
驱动代码
占空比为2.5%旋转置0度,占空比每增加2.5%旋转角度增加45度
int main()
{
//.......
HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
Servo(15); //旋转90度
while(1)
{
}
}
void Servo(uint8_t angle) //舵机转向 5 10 15 20 25
{
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, angle);
}