基于STM32的超声波雷达

这篇具有很好参考价值的文章主要介绍了基于STM32的超声波雷达。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

视频地址:1.基于STM32的超声波雷达-演示_哔哩哔哩_bilibili

备注:文档最后有所有文件的网盘地址

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

1. 项目展示

1.1. 最终效果

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

1.2. 项目硬件

全部必要硬件(左到右)

  • ST-LINK调试器:调试下载程序
  • stm32f103c8t6核心板
  • 1.8寸TFT显示器
  • sg90舵机
  • 超声波传感器

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

其他扩展硬件

  • 超声波传感器转接板:方便超声波传感器接到舵机上和接线而已。
    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机
  • 自己焊接洞洞板(不是必要硬件,只是方便接线):同一排的引脚连通的,如标黄色的两个引脚是连接在一起的。(下面是正反面图)
    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机
  • 另一个洞洞板,与上面一样不是必要硬件,只是方便接线
    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

2. 方案设计

2.1. 需求分析

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

2.2. 方案设计

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

2.3. 外设型号

外设

型号

备注

stm32主控芯片

stm32c8t6

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

超声波传感器

hc-sr04

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

舵机

sg90

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

lcd显示屏

ST7735S 1.8寸 128*160tft lcd

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

3. sg90舵机驱动

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

3.1. 简介

舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

舵机内部控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

GND :地线。

+5V :舵机电源,接5V,(3.3V也可正常工作)。

PWM:舵机控制引脚。

引脚一般可以根据线的颜色区分:棕色GND、红色VCC、黄色PWM

3.2. 原理

  • 舵机是一种根据输入PWM信号占空比来控制输出角度的装置输入,将PWM当作通讯协议来使用
  • PWM信号要求:周期为20ms(50HZ),高电平宽度为0.5ms~2.5ms(占空比范围)

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

3.3. 代码

引脚连接关系:(PA1:定时器2的通道2)

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

核心代码:全部代码见文件夹工程

// 产生周期为20ms(50HZ),高电平宽度为0.5ms~2.5ms(占空比范围)
// ARR , PSC 可是多个值,
// ARR = 20000-1  PSC = 72-1;取这个值方便计算而已,其他值也可以
// 舵机电平要求0.5ms~2.5ms  既占空比:0.5ms/20ms = ccr/20000 ~ 2.5ms/20ms = ccr/20000 
// ccr 500 ~ 2500
void pwm_init(void)
{
    //1、打开时钟(TIM,GPIO)
    //2、配置GPIO为复用推挽输出
    //3、选择时钟源
    //4、配置时基单元
    //5、配置输出比较单元
    //6、运行控制(启动定时器)

    //1、打开时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        // TIM2在APB1总线
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       // GPIOA在APB2总线   

    //2、配置GPIO为复用推挽输出
    GPIO_InitTypeDef gpioInit;
    gpioInit.GPIO_Mode  = GPIO_Mode_AF_PP;      // 复用推挽输出(控制权给片上外设(定时器))
    gpioInit.GPIO_Pin   = GPIO_Pin_1;
    gpioInit.GPIO_Speed = GPIO_Speed_50MHz;     //一般设置50MHZ即可
    GPIO_Init(GPIOA, &gpioInit);                
    
    //3、选择内部时钟
    TIM_InternalClockConfig(TIM2);                          

    //4、配置时基单元
    TIM_TimeBaseInitTypeDef timeInit;
    timeInit.TIM_ClockDivision      = TIM_CKD_DIV1;         // 外部时钟滤波单元的分频系数,没用,随便配置一个
    timeInit.TIM_CounterMode        = TIM_CounterMode_Up;   // 向上计数模式
    timeInit.TIM_Period             = 20000 - 1;            // 重装值
    timeInit.TIM_Prescaler          = 72-1;                 // 分频值
    timeInit.TIM_RepetitionCounter  = 0;                    // 重复计数器(高级定时器才有)
    TIM_TimeBaseInit(TIM2, &timeInit);

    //5、配置输出比较单元
    TIM_OCInitTypeDef ocInit;
    TIM_OCStructInit(&ocInit);                        // 结构体初始化(没引用的成员赋默认值)
    ocInit.TIM_OCMode      = TIM_OCMode_PWM1;         // 设置输出模式PWM1模式(先高电平,后低电平)
    ocInit.TIM_OCPolarity  = TIM_OCPolarity_High;     // 设置输出比较的极性不翻转
    ocInit.TIM_OutputState = TIM_OutputState_Enable;  // 设置输出使能
    ocInit.TIM_Pulse       = 0;                       // 设置ccr的值(用于调节占空比)
    TIM_OC2Init(TIM2, &ocInit);                       // 设置通道2输出PWM

    //6、运行控制(启动定时器)
    TIM_Cmd(TIM2, ENABLE);
}

/**
 * @brief 设置pwm的占空比
 * 
 * @param ccr 根据舵机要求计算:取500-2500
 */
void pwm_setCCR(uint16_t ccr)
{
    TIM_SetCompare2(TIM2, ccr);    // 修改通道2ccr的值,实现修改占空比
}

/**
 * @brief 根据角度旋转舵机
 *        ccr取值500~2500  角度0~180
 *        500~2500范围是2000;  0~180范围是180
 *        等比例缩放 ccr/2000 = angle / 180
 *        ccr = angle / 180 *2000
 *        ccr是从500开始,所以还要再偏移500
 *        ccr = angle / 180 *2000 + 500
 * @param angle 旋转角度
 * 
 */
void servo_setAngle(float angle)
{
    uint16_t ccr;
    ccr = angle / 180 *2000 + 500;
    pwm_setCCR(ccr);
}

最终效果图

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

4. 超声波传感器驱动

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

4.1. 简介

HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器,将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们,它将产生一个输出脉冲,其宽度可用于确定脉冲传播的距离。

该传感器体积小,易于在任何机器人项目中使用,并提供2厘米至400厘米(约1英寸至13英尺)之间出色的非接触范围检测,精度为3mm,工作电压为5伏。

以下是完整的规格

描述

参数

Operating Voltage工作电压

直流3.3V---5V

Operating Current工作电流

15毫安

Operating Frequency运行频率

40K赫兹

Max Range最大范围

4m

Min Range最小范围

2厘米

Ranging Accuracy测距精度

3毫米

Measuring Angle测量角度

15度

Trigger Input Signal触发输入信号

10µS TTL脉冲

Dimension尺寸

45 x 20 x 15毫米

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

VCC :HC-SR04超声波距离传感器电源引脚,接5V。

Trig :(Trigger) 引脚用于触发超声波脉冲。

Echo :回声当接收到反射信号时,引脚产生一个脉冲。脉冲长度与检测发射信号所需时间成正比。

GND :地线。

4.2. 原理

  • 采用IO口TRIG触发测距,给最少10us的高电平信号。
  • 模块自动发送8个40khz的方波,自动检测是否有信号返回;
  • 有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。
  • 测试距离=(高电平时间*声速(340M/S))/2

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

只要提供一个 10uS以上脉冲触发信号,该模块内部将发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。

公式: uS/58=厘米或者uS/148=英寸; 或是: 距离=高电平时间*声速( 340M/S) /2;

建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响

4.3. 代码

stm32和超声波传感器引脚连接关系:(PB6为定时器4通道1)

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

stm32和OLED显示屏引脚连接关系:(OLED调试超声波传感器需要用到)

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

核心代码:全部代码见文件夹工程

//返回超声波毫米值
uint32_t hcsr04_getValueMm(void)
{
    uint32_t dist, distMm;
    static uint64_t timeEnd;

    //触发超声波测量
    GPIO_WriteBit(GPIOB,TRIG_PIN,Bit_SET);				//Trig输出高电平
	delay_us(15);										//保持15微秒生效
	GPIO_WriteBit(GPIOB,TRIG_PIN,Bit_RESET);			//Trig输出低电平

    while((GPIO_ReadInputDataBit(GPIOB,ECHO_PIN) == 0));	//等待低电平结束,开始测量
    g_time = 0;											    //计时清零
	while(GPIO_ReadInputDataBit(GPIOB,ECHO_PIN) == 1);	    //等待高电平结束,测量结束
    timeEnd = g_time;
    
    if(timeEnd/100 < 38)		    //判断是否小于38毫秒,大于38毫秒的就是超时,直接跳到下面返回0
	{
	  dist=(timeEnd*346) / 2;       //计算距离,25°C空气中的音速为346m/s
	  distMm=dist/100;		        //timeEnd单位是10微秒,得出单位为毫米的距离结果,还得除以100
	}else
	{
	  distMm=0;
	}
    
    return distMm;
}

//中断服务函数,回波计时,每10微秒g_time加1
void TIM4_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)		//获取TIM2定时器的更新中断标志位
    {
        g_time++;
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);			//清除更新中断标志位
    }
}

//定时器4初始化
//定时10us,提供超声波测量时间
//定时器4中断服务函数再drv_sr04.c
void time4_init(void)
{
    //1、RCC开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	
	//2、选择时基单元的时钟源
	TIM_InternalClockConfig(TIM4);	//选择内部时钟(不写也行,默认就是内部时钟)
	
	//3、配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;		//外部时钟滤波单元的分频系数,没用,随便配置一个就行
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; 	//向上计数
	//频率 = CK_PSC / (PSC + 1) / (ARR + 1)  CK_PSC=72MHZ
	//时间=1/频率  72MHZ/72/10 ===》 10us
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;					//分频值
	TIM_TimeBaseInitStruct.TIM_Period = 10-1;						//周期,ARR自动重装器的值
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter =0;				//重复计数器的值,高级定时器才有,给0就行
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
	//TIM_TimeBaseInit设置自动更新会进一次中断,这边清除中断解决刚上电就会进一次中断的问题
    TIM_ClearFlag(TIM4,TIM_FLAG_Update);
    
    
	//4、配置中断输出控制
	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//更新中断到NVIC使能
	
	//5、配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		//选择优先级分组2
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	//6、配置运行控制
	TIM_Cmd(TIM4, ENABLE);	//启动定时器3
}

最终效果图

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

5. TFT显示屏驱动

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

5.1. 简介

该显示屏是一块以ST7735S驱动的1.8英寸采用SPI通信的TFT全彩屏,分辨率是128*128,这里采用RGB565 16bit的色块编译模式(RGB565即高五位为Red,第五位为Blue,中间六位为Green,共16位)。本文仅设计该屏幕的简单应用,不对底层原理进行深究。

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

引脚

Parameter

GND

接地

VCC

3.3V-5V电源接入

SCL

SPI总线时钟信号

SDA

SPI总线写数据信号

RES

液晶屏复位信号,低电平复位

DC

液晶屏寄存器/数据选择信号,高电平:寄存器,低电平:数据

CS

液晶屏片选信号,低电平使能

BL

背光控制,高电平点亮,如无需控制则接3.3V常亮

5.2. 原理

屏幕的参数配置的大体流程如下:

  1. 执行0X11命令,退出睡眠模式,执行命令后延时120ms

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  2. 配置0XB1,0XB2,0XB3,0XB4寄存器,配置在不同颜色模式下屏幕的刷新率,0XB4寄存器配置屏幕是否反色

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  3. 配置0XC0,0XC1,0XC2,0XC3,0XC4寄存器,配置显示屏在不同颜色不同模式下的电压
  4. 配置0X36寄存器,设置显存数据访问方式。如果颜色不正,注意查看颜色是顺序是的BGR的颜色顺序,有一位可以控制顺序的,36H的RGB位从1变到0颜色就正常了。

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  5. 配置0XE0,0XE1寄存器,配置伽马极性
  6. 执行0X3A,设置像素格式

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  7. 执行0X29命令,进行显示

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

5.3. 取模

显示屏的显示原理就是在屏幕上打点,显示中文,英文,图片本质都是在对应的位置,将这些点事先找出来就是取模;中文,英文,图片都要先取模才能显示。

英文取模

附:ASCII码完整表:注第一个字符为空格,不要遗漏

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

  1. 打开取模软件

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  2. 左上角模式选择为字符模式

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  3. 点击选项

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

4.设置如下,然后点击确定。
> 点阵要选择的数要大于字符所占字节数,例如8x16的字符所占字节为 8x16/2=16,所以这里点阵选大于16就行

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  1. 以8x16ASCII取模为例:
    字宽字高都改为16,那么对应的ASCII码为8x16,字宽会变为原来的一半

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  2. 然后在输入栏输入ASCII码表

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  3. 点击生成字模生成的字模

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  4. 得到字模

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

8x16字模在例程font.h中已经取好 如下所示

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

中文取模

  1. 开取模软件

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  2. 左上角模式选择为字符模式

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  3. 点击选项

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  4. 设置如下,然后点击确定。

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  5. 以16x16汉字取模为例:字宽字高都改为16

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  6. 然后在输入栏输入汉字

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  7. 点击生成字模

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  8. 生成的字模如下

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

8x16字模在例程font.h中已经取好 如下所示

注:每个字的字模前需要添加这个汉字,并用双引号括起来然后加上逗号!

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

图片取模

  1. 打开下面文件夹的软件

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  2. 打开要取模的图片:以例程的40x40企鹅图片为例

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  3. 观察左下角的输入图像,如果显示如下这样,请看5

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  4. 如果显示无效的输入图像,那么请使用电脑自带的画图软件将图片转化为16色位的bmp格式图片。

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  5. 打开图片后设置如下

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机


    最大宽度和高度:设置好后点击右边三角形设置按钮(注意:此软件只能缩小图片不能放大图片!缩小是等比例缩小!)
  6. 然后点击保存,输入文件名,得到数据数组

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

5.4. 代码

引脚连接关系

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

LCD初始化代码:全部代码见文件夹工程

// lcd1.8寸 128*160 初始化函数
void lcd_init(void)
{
	lcd_gpio_init();
	spi_init();

	lcd_set_rest();			// lcd复位

	lcd_wr_bl(1);			// 打开背光
  	delay_ms(100);
	
	//************* Start Initial Sequence **********//
	lcd_wr_regist(0x11); //Sleep out 
	delay_ms(120);              //Delay 120ms 
	//------------------------------------ST7735S Frame Rate-----------------------------------------// 
	lcd_wr_regist(0xB1); 
	lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C); 
	
	lcd_wr_regist(0xB2); 
	lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C); 

	lcd_wr_regist(0xB3); 
	lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C); 
	lcd_wr_data(0x05); lcd_wr_data(0x3C); lcd_wr_data(0x3C); 

	//------------------------------------End ST7735S Frame Rate---------------------------------// 
	lcd_wr_regist(0xB4); //Dot inversion 
	lcd_wr_data(0x03); 

	//------------------------------------ST7735S Power Sequence---------------------------------// 
	lcd_wr_regist(0xC0); 
	lcd_wr_data(0x28); lcd_wr_data(0x08); lcd_wr_data(0x04); 

	lcd_wr_regist(0xC1); 
	lcd_wr_data(0XC0); 

	lcd_wr_regist(0xC2); 
	lcd_wr_data(0x0D); lcd_wr_data(0x00); 

	lcd_wr_regist(0xC3); 
	lcd_wr_data(0x8D); lcd_wr_data(0x2A); 

	lcd_wr_regist(0xC4); 
	lcd_wr_data(0x8D); lcd_wr_data(0xEE); 

	//---------------------------------End ST7735S Power Sequence-------------------------------------// 
	lcd_wr_regist(0xC5); //VCOM 
	lcd_wr_data(0x1A); 

	lcd_wr_regist(0x36); //MX, MY, RGB mode 
	if(USE_HORIZONTAL==0)lcd_wr_data(0x00);
	else if(USE_HORIZONTAL==1)lcd_wr_data(0xC0);
	else if(USE_HORIZONTAL==2)lcd_wr_data(0x70);
	else lcd_wr_data(0xA0); 
	
	//------------------------------------ST7735S Gamma Sequence---------------------------------// 
	lcd_wr_regist(0xE0); 
	lcd_wr_data(0x04); lcd_wr_data(0x22); lcd_wr_data(0x07); 
	lcd_wr_data(0x0A); lcd_wr_data(0x2E); lcd_wr_data(0x30); 
	lcd_wr_data(0x25); lcd_wr_data(0x2A); lcd_wr_data(0x28); 
	lcd_wr_data(0x26); lcd_wr_data(0x2E); lcd_wr_data(0x3A); 
	lcd_wr_data(0x00); lcd_wr_data(0x01); lcd_wr_data(0x03); 
	lcd_wr_data(0x13); 

	lcd_wr_regist(0xE1); 
	lcd_wr_data(0x04); lcd_wr_data(0x16); lcd_wr_data(0x06); 
	lcd_wr_data(0x0D); lcd_wr_data(0x2D); lcd_wr_data(0x26); 
	lcd_wr_data(0x23); lcd_wr_data(0x27); lcd_wr_data(0x27); 
	lcd_wr_data(0x25); lcd_wr_data(0x2D); lcd_wr_data(0x3B); 
	lcd_wr_data(0x00); lcd_wr_data(0x01); lcd_wr_data(0x04); 
	lcd_wr_data(0x13); 
	//------------------------------------End ST7735S Gamma Sequence-----------------------------//

	lcd_wr_regist(0x3A); //65k mode 
	lcd_wr_data(0x05); 
	lcd_wr_regist(0x29); //Display on 
}

测试代码效果

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

6. 雷达功能实现

6.1. 雷达GUI设计

使用TFT显示屏的驱动,在屏幕上画出雷达GUI图像

  1. 确定圆心(80,108),绘制多个圆

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  2. 绘图填充图像,去掉圆的下半部分

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  3. 绘制不同角度的斜线

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

  4. 绘制角度,距离等提示信息

    基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

绘制雷达图像代码

// 根据角度和长度,绘制从圆心开始的斜线
void radar_line(double k,int r)
{
    int16_t x,y;
	
	x=80+r*(double)cos(k/180*3.1415926);	
	y=108-r*(double)sin(k/180*3.1415926);
	
	lcd_simple_line(80,108,x,y,GREEN);
	
}
//雷达图像
void radar_picture(void)
{   
	lcd_draw_chinese(80,0,GREEN,BLACK,16, 0,"超声波雷达"); 	

    //画圆:(圆心坐标,半径,颜色)
	lcd_simple_circle(80,108,76,GREEN);
	lcd_simple_circle(80,108,57,GREEN);
	lcd_simple_circle(80,108,38,GREEN);
	lcd_simple_circle(80,108,19,GREEN);

	lcd_simple_fill(0, 108, 160, 20, BLACK);	//去掉园的下半部分

    //画斜线:(角度,长度)
	radar_line(30,85);
	radar_line(60,85);
	radar_line(90,85);
	radar_line(120,85);
	radar_line(150,85);
	lcd_simple_line(0,108,160,108,GREEN);

	//数据信息
	lcd_draw_integer(0,   46, GREEN, BLACK, 16, 0, 3, 150);	// 150°数值
	lcd_draw_integer(38,  22, GREEN, BLACK, 16, 0, 3, 120); // 120°数值
	lcd_draw_integer(83,  20, GREEN, BLACK, 16, 0, 2, 90);  // 90°数值
	lcd_draw_integer(124, 32, GREEN, BLACK, 16, 0, 2, 60);  // 60°数值
    lcd_draw_integer(140, 49, GREEN, BLACK, 16, 0, 2, 30);  // 30°数值

	lcd_draw_chinese(21,  44, GREEN, BLACK, 16, 0, "°"); // 150°符号
    lcd_draw_chinese(59,  19, GREEN, BLACK, 16, 0, "°"); // 120°符号
    lcd_draw_chinese(97,  18, GREEN, BLACK, 16, 0, "°"); // 90°符号
    lcd_draw_chinese(137, 30, GREEN, BLACK, 16, 0, "°"); // 60°符号
    lcd_draw_chinese(152, 45, GREEN, BLACK, 16, 0, "°"); // 30°符号	

	lcd_simple_hz(0, 0, GREEN, "角度");
	lcd_simple_char(4,0,GREEN, ':');	
	lcd_simple_hz(4,0,GREEN ,"°"); //显示°

	lcd_simple_hz(0, 7, GREEN, "距离");
	lcd_simple_char(4, 7, GREEN, ':');
	lcd_simple_str(9,7,GREEN,"mm");	
}

6.2. 雷达功能实现

根据超声波传感器返回的距离值,根据屏幕尺寸等比例缩放,在屏幕上打印对应的点,下面是关键逻辑代码

while (1)
    {
       for (uint8_t i = 30; i <= 150; i++)  // 舵机旋转
        {
            distMm = hcsr04_getValueMm();   // 获取超声波数据
            uint16_t lcdMm = distMm/6;      // 等比例缩小,便于显示在屏幕上
            if(distMm <= 500)
            {
                lcd_simple_int(5,7, BLACK, 4, oldMn);   // 覆盖上次距离信息
                lcd_simple_int(5,7, GREEN, 4, distMm);  // 显示新的距离信息
                oldMn = distMm;

                radar_redPoint(i, lcdMm);   // 屏幕上打点
            }
            // lcd_draw_integer(3,114,3,GREEN,BLACK,16,0,distanceMm);
            servo_setAngle(i);
            lcd_simple_int(5,0, BLACK, 3, i-1);   // 覆盖上次距离信息
            lcd_simple_int(5,0, GREEN, 3, i);     // 显示新的距离信息
            delay_ms(20);

        }
        lcd_simple_int(5,0, BLACK, 3, 150);   // 覆盖上次内容

        for (uint8_t i = 30; i <= 150; i++) // 舵机往回旋转
        {
            distMm = hcsr04_getValueMm();   // 获取超声波数据
            uint16_t lcdMm = distMm/6;      // 等比例缩小,便于显示在屏幕上
            if(distMm <= 500)
            {
                radar_redPoint(180-i, lcdMm);
                lcd_simple_int(5,7, BLACK, 4, oldMn);   // 覆盖上次内容
                lcd_simple_int(5,7, GREEN, 4, distMm);  // 显示新的内容
                oldMn = distMm;
            }
            servo_setAngle(180 - i);
            
            lcd_simple_int(5,0, BLACK, 3, 180-i+1);   // 覆盖上次内容
            lcd_simple_int(5,0, GREEN, 3, 180-i);  // 显示新的内容

            delay_ms(20);
        
        }
        lcd_simple_int(5,0, GREEN, 3, 30);  // 显示新的内容
        
    }

基于STM32的超声波雷达,嵌入式项目合集,stm32,嵌入式硬件,单片机

 7.资料下载地址

链接:https://pan.baidu.com/s/11KXIBepREsnWUQEn3BvVLg 
提取码:8oai文章来源地址https://www.toymoban.com/news/detail-652691.html

到了这里,关于基于STM32的超声波雷达的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32_HAL库实现超声波测距

    核心板               : STM32F103C8T6。 超声波测距模块 : HC-SR04超声波测距模块 实验目的            : 利用超声波测距,将测量的距离打印在串口并输出。 HC-SR04超声波测距模块介绍         接口定义:Vcc、 Trig(控制端——PA2)、 Echo(接收端——PA11)、 Gnd        

    2024年02月16日
    浏览(52)
  • 基于STM32F407实现超声波测距(SR04)

    今天要实现的功能是超声波测距,这一功能在很多的地方都能用到,比如:在智能小车上可以添加超声波避障功能。今天需要用到SR04超声波模块,在使用这一模块的时候我很会接触到时序图。 模块如图所示: 模块有四个引脚 VCC 供 5V电源, GND 为地线, TRIG 触 发 控 制 信 号

    2024年02月11日
    浏览(58)
  • 基于STM32的智能循迹避障小车实验(超声波部分)

    接上一篇基于STM32的智能循迹避障小车实验(舵机旋转部分) 最后这部分我们实现超声波部分和最后代码的整合 本部分实验采用的是 超声波模块 HC-SR04 ,它长这样:   买这个的时候最好再买一个支架,可以直接架在舵机上,探查周围的距离。 超声波模块有 4 个引脚 ,分别

    2024年02月07日
    浏览(48)
  • 基于STM32F103的红外循迹 超声波避障小车

    单片机:stm32f103 传感器:普通红外(我用了4个) 超声波:HC-SR04 舵机:SG90 目标:可以循黑线(十字直行)、并避障 如果硬件配置和我一样以下代码可直接使用,用我配置的引脚即可。 亲测好用。 复制代码的同时请点个赞,多谢! .c .h .c .h .c .h .c .h 我的主函数有些啰嗦,

    2024年02月05日
    浏览(55)
  • 基于STM32的HC_SR04模块实现超声波测距(附源码)

    本次实验需要通过STM32与HC_SR04模块实现实时测距,并将测距信息通过串口显示在电脑上 原理 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时

    2024年02月11日
    浏览(49)
  • 基于STM32F103C8T6的超声波测距应用

    #一、超声波HC_SR04简介 #二、超声波工作原理 #三、超声波测距步骤 #四、硬件接线 #五、项目代码 一、超声波HC_SR04简介 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应) 工作电压与电流

    2024年02月03日
    浏览(47)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(69)
  • STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2024年02月05日
    浏览(77)
  • STM32——超声波传感器

    需求: 使用超声波测距,当手离传感器距离小于 5cm 时, LED1 点亮,否则保持不亮状态   接线:     定时器配置: 使用 TIM2 ,只用作计数功能,不用作定时。 将 PSC 配置为 71 ,则计数 1 次代表 1us 。   编写微秒级函数: 1、总结 微秒级定时: 这个延迟函数的实现利用了定

    2024年02月05日
    浏览(46)
  • 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)

            前言: 本文主要是为了 日常普通场合 下测距做的 对比实验 ,本实验主要包含 2种模块 : 超声波测距模块 (HC-SR04)和 红外测距模块 (SHARP GP2Y0A21YK0F)。两种模块不管是测距原理和编程实验方式都是不相同的,其测距效果也存在很大差异。感兴趣的读者朋友,

    2023年04月27日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包