首页 > 其他分享 >STM32+cubemx岸电绞车超速报警

STM32+cubemx岸电绞车超速报警

时间:2024-11-12 08:51:08浏览次数:3  
标签:SendBuf LED 报警 STM32 cubemx GPIO HAL 拨码 岸电

一、项目背景与概述

       在当今高度自动化和智能化的时代,对电子系统的功能和性能要求不断提高。本项目旨在基于 STM32 微控制器开发一个岸电绞车超速报警模块,提供实时监测与控制其旋转速度,确保安全运行。该系统综合运用了嵌入式软件开发技术、硬件电路设计以及信号处理算法,实现了一系列复杂的功能,为相关领域的应用提供了可靠的解决方案。

二、项目目标与功能实现

       核心功能包括初始速度采样显示、速度设定和超速报警。用户可通过两个4位拨码开关设定绞车的初始时间间隔(转一圈),当监测到的时间间隔低于设定值的0.8倍时,设备会自动触发超速报警,红色的LED3指示灯亮起以提示异常,继而触发继电器刹车。

(一)精确时间测量与显示

1. 定时器中断与高精度时间计算:

——项目中充分利用了 STM32 的定时器资源,通过精确配置定时器中断,实现了每 0.3ms 触发一次的高精度时间基准。这一功能为后续的时间测量和各种时间相关的操作提供了坚实的基础。

—— 在定时器中断处理函数中,通过巧妙的计数器设计和时间转换算法,能够准确地计算出时间间隔,并将其转换为易于理解的单位,如秒、毫秒等。

if (htim->Instance == TIM4) 
{
				
        tick_counter++; // 定时器中断0.3ms递增一次

        //滤波
		uint8_t filteredPI1 = filterInput(0);
		uint8_t filteredPI2 = filterInput(1);

       //LED4、LED5指示接近开关状态
		 LED4_();
		 LED5_();
					
        
        /* 上升沿检测*/
        if (filteredPI1 && !lastState_PI1)
        {

            float interval = (tick_counter - lastPulseTime_PI1)*0.3/1000.0f;//计算间隔
            lastPulseTime_PI1 = tick_counter;
            Compare(interval);//报警刹车操作
					
					if (minInterval == 0.0f || interval < minInterval) 
						{
                minInterval = interval; 
            }
				}
			
        lastState_PI1 = filteredPI1;
			
        
        if (filteredPI2 && !lastState_PI2)
        {
					
            float interval = (tick_counter - lastPulseTime_PI2)*0.3/1000.0f;
            lastPulseTime_PI2 = tick_counter;
            Compare(interval);
					
					if (minInterval == 0.0f || interval < minInterval) 
						{
                minInterval = interval; 
            }
        }
			
        lastState_PI2 = filteredPI2;
			
				if (minInterval != 0.0f) 
					{
            app_SmgDisplay(minInterval); //显示较小时间间隔在数码管上
            minInterval = 0.0f; 
          }
     }

2. 数码管显示与时间呈现:

——为了将测量得到的时间直观地展示给用户,项目采用了数码管显示技术。通过精心编写的驱动程序,能够将时间值以清晰、准确的方式显示在数码管上。

——同时,考虑到不同的时间精度需求,项目实现了对一位整数和两位小数的时间显示格式的灵活切换,满足了用户在不同场景下对时间信息的读取需求。 

void app_SmgDisplay(float number)
{
    uint8_t SendBuf[2] = {0};
		if(number < 10){
		uint16_t numVal = (uint16_t)(number * 100); 
		

    SendBuf[0] = 0x00;
    SendBuf[1] = s_ucSmgFont[(numVal / 1000) % 10];  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);

    SendBuf[0] = 0x01;
    SendBuf[1] = s_ucSmgFont[(numVal / 100) % 10]|0x80;  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);

    SendBuf[0] = 0x02;
    SendBuf[1] = s_ucSmgFont[(numVal / 10) % 10];  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);

    SendBuf[0] = 0x03;
    SendBuf[1] = s_ucSmgFont[(numVal / 1) % 10];  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);
     }
		
		 
		if(number >= 10){
		uint16_t numVal = (uint16_t)(number * 10); 
		

    SendBuf[0] = 0x00;
    SendBuf[1] = s_ucSmgFont[(numVal / 1000) % 10];  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);

    SendBuf[0] = 0x01;
    SendBuf[1] = s_ucSmgFont[(numVal / 100) % 10];  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);

    SendBuf[0] = 0x02;
    SendBuf[1] = s_ucSmgFont[(numVal / 10) % 10]|0x80;  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);

    SendBuf[0] = 0x03;
    SendBuf[1] = s_ucSmgFont[(numVal / 1) % 10];  
    HAL_UART_Transmit(&huart3, SendBuf, 2, 1000);
		}
	}

(二)拨码开关控制与报警功能

1. 拨码开关状态读取与数值转换:

——项目中设计了读取拨码开关状态的功能模块,能够准确地获取拨码开关的当前设置。通过对多个 GPIO 引脚的状态检测,将拨码开关的二进制状态转换为对应的数值。 

——进一步地,根据特定的算法,将拨码开关的值转换为时间值,实现了从硬件设置到实际时间参数的映射。例如,当拨码开关的值为特定组合时,对应的时间可以在 0.5 秒到 8 秒之间进行调整,为系统的灵活性和可配置性提供了有力支持。

float ReadDipSwitchValue(void)//拨码开关时间0.5s-8s(16种状态输入)
{
    uint32_t value = 0;
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15) == 1)
    {
        value += 8;
    }
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3) == 1)
    {
        value += 4;
    }
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1)
    {
        value += 2;
    }
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == 1)
    {
        value += 1;
    }
		
	float time = (value+1)*0.5;
		  
    return time;
    
}

2. 报警功能的实现与误差控制:

——基于拨码开关设置的时间值,项目实现了报警功能。通过比较测量得到的时间间隔与拨码开关设定的时间值,当测量时间小于设定时间的特定比例时,触发报警机制。

——在报警功能的实现过程中,对误差进行了严格的控制。经过深入分析和调试,将报警误差控制在较小的范围内,确保了系统的准确性和可靠性。例如,在大部分拨码值下,报警误差仅为 0.01 秒,而在特定拨码值为 13 时,虽然误差有所增大,但也通过深入的问题分析和优化措施,将误差控制在可接受的范围内。(现报警误差均为0.01s)

(三)LED 指示灯控制与信号响应

1. LED 闪烁控制与功能指示:

—— 项目中通过对 GPIO 引脚的编程控制,实现了多个 LED 指示灯的闪烁功能。不同的 LED 被赋予了特定的含义,用于指示系统的不同状态和事件。

——例如,LED2 的闪烁可以用于表示系统的某种周期性活动,通过精确的时间控制,实现了特定时间间隔的闪烁效果,为用户提供了直观的视觉反馈。

——LED4 和 LED5 的闪烁则与外部输入信号相关联。当检测到特定的输入信号时,相应的 LED 会闪烁,以提示用户系统接收到了特定的信号。

2. 信号检测与 LED 响应:


——系统能够实时检测外部输入信号,如 PI1 和 PI2 信号。当检测到这些信号时,系统会迅速做出响应,通过控制相应的 LED 指示灯的状态来表示信号的接收情况。

——例如,当检测到 PI1 信号为高电平时,LED4 会点亮;当检测到 PI2 信号为高电平时,LED5 会点亮。这种快速的信号响应机制确保了系统能够及时对外部事件做出反应,提高了系统的实时性和可靠性。

(四)刹车与复位功能

1. 刹车功能的实现与安全保障:

—— 为了满足特定应用场景下的安全需求,项目中实现了刹车功能。当检测到特定的输入信号时,系统会触发刹车机制,确保系统的安全运行。

—— 例如,当检测到 LTB 信号剩余 2 圈及以下时,系统会自动启动刹车功能,通过调用特定的刹车函数,实现对系统的紧急制动,防止潜在的危险发生。

2. 断电复位与状态恢复:

——考虑到系统在实际运行过程中可能会遇到断电等意外情况,项目中设计了断电复位功能。当系统断电后重新上电时,能够自动进行复位操作,并尽可能地恢复到断电前的状态。
——通过检测特定的复位标志位,系统能够判断是否是由于断电导致的复位,并根据判断结果执行相应的初始化操作和状态恢复程序。例如,重新初始化关键的外设、从非易失性存储器中读取保存的状态信息等,确保系统在断电后能够快速恢复正常运行。 

三、技术创新与难点突破 

(一)时间计算精度的提升

1. 定时器精度优化:

——在项目实施过程中,为了提高时间计算的精度,对 STM32 的定时器进行了深入的优化。通过仔细调整定时器的时钟源、预分频值和自动重载值等参数,实现了每 0.3ms 的高精度时间间隔触发。

——同时,为了确保定时器的稳定性和准确性,对定时器的中断处理程序进行了精心设计,避免了中断冲突和时间计算误差的产生。

2. 浮点数计算与精度控制:

——在拨码开关值转换为时间值的过程中,涉及到浮点数的计算。为了提高计算精度,项目团队采用了更精确的数据类型和计算方法,避免了浮点数精度损失的问题。

——例如,在计算报警时间时,通过合理的算法设计和数值范围控制,确保了计算结果的准确性和可靠性。同时,对计算过程中的中间结果进行了严格的精度检查和调整,进一步提高了时间计算的精度。 

(二)LED 闪烁的及时性与稳定性

1. 代码执行效率优化:

——为了确保 LED 闪烁的及时性,项目团队对代码的执行效率进行了全面优化。通过减少不必要的计算和循环操作、优化函数调用和内存管理等措施,提高了代码的执行速度。 

——例如,在 LED 闪烁控制函数中,采用了更高效的逻辑判断和状态切换算法,减少了代码执行时间,确保了 LED 能够在规定的时间间隔内准确地闪烁。

2. 硬件干扰排除与稳定性提升:

——在实际应用中,LED 闪烁可能会受到硬件干扰的影响,导致闪烁不及时或不稳定。为了解决这个问题,项目团队进行了深入的硬件调试和优化。

——通过检查硬件连接的稳定性、优化电源供应和接地设计、添加滤波电路等措施,有效地排除了硬件干扰,提高了 LED 闪烁的稳定性和可靠性。 

(三)报警误差的分析与控制

1. 问题根源分析与定位:

——在项目开发过程中,发现报警功能存在一定的误差,尤其是在拨码值为 13 时,误差较大达到了 0.5s。为了解决这个问题,项目团队进行了深入的问题分析和根源定位。

——通过对代码的逐行检查、对硬件信号的测量和分析以及对系统运行过程的跟踪和调试,确定了误差产生的原因主要包括拨码开关读取问题、计算逻辑问题和时间测量问题等。

2. 优化措施与误差控制:

—— 针对问题根源,项目团队采取了一系列优化措施来控制报警误差。在拨码开关读取方面,优化了 GPIO 引脚配置和读取函数的逻辑,确保拨码开关状态的准确读取。

—— 在计算逻辑方面,对报警时间的计算公式进行了调整和优化,避免了数值溢出和精度损失的问题。在时间测量方面,采用了更精确的定时器中断和时间计算方法,提高了时间测量的准确性。 —— 通过这些优化措施,成功地将报警误差控制在可接受的范围内,提高了系统的可靠性和稳定性。

主程序:

int main(void)
{
  SystemClock_Config();
  MX_GPIO_Init();//GPOI初始化
  MX_USART3_UART_Init();//串口初始化
  MX_TIM4_Init();//定时器初始化
  MX_IWDG_Init();//独立看门狗初始化
  HAL_TIM_Base_Start_IT(&htim4);//开始定时器中断
while (1)
  {
     HAL_Delay(1);
     LED2_Blink();
   
//    app_SmgDisplay(ReadDipSwitchValue());//测试数码管与拨码开关模块
		
		//LTB
      if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) == SET)
				{
//				LED3_On();//报警
				SHACHE();//刹车
        }
			
	
		//BRI复位操作
	   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) == SET)
		{
		 app_SmgDisplay(0.00);//数码管显示0.00
		 LED3_Off();//不报警
		 SHACHE_Reset();//刹车复位
		}
		
	   //独立看门狗保持程序稳定运行
		watchdog_refresh();
	}

四、项目成果与应用前景 

(一)功能完备的嵌入式系统

1. 系统的稳定性与可靠性:

——通过严格的测试和优化,本项目开发的嵌入式系统具有高度的稳定性和可靠性。在长时间的运行过程中,系统能够稳定地执行各种功能,不会出现意外的故障或错误。

—— 例如,在各种不同的工作环境下,系统都能够准确地测量时间、响应外部信号、控制 LED 指示灯和执行刹车等功能,为用户提供了可靠的服务。

2. 功能的灵活性与可扩展性:

——系统的设计充分考虑了功能的灵活性和可扩展性。通过拨码开关的设置,可以方便地调整系统的参数和功能,满足不同用户的需求。

—— 同时,系统的硬件和软件架构都具有良好的可扩展性,可以根据未来的需求进行功能升级和扩展。例如,可以添加更多的外部设备接口、实现更复杂的信号处理算法等,为系统的进一步发展提供了广阔的空间。 

(二)广泛的应用前景

1. 工业自动化领域:

—— 在工业自动化领域,本项目开发的系统可以用于各种设备的状态监测和控制。例如,可以通过检测外部信号来控制设备的运行状态、实现设备的自动刹车和复位等功能。

—— 同时,数码管显示的时间信息可以为生产过程提供准确的时间参考,提高生产效率和质量。

2. 智能家居领域:

—— 在智能家居领域,系统可以作为智能设备的控制中心,通过检测各种传感器信号来实现对家居设备的智能控制。

——通过检测人体红外信号来控制灯光的开关、通过检测温度和湿度信号来控制空调和加湿器的运行等。同时,LED 指示灯可以用于显示设备的状态和提示用户操作。

3. 其他领域的应用:

——除了工业自动化和智能家居领域,本项目开发的系统还可以应用于其他领域,如医疗设备、交通运输等。在这些领域中,系统的高精度时间测量、报警功能和 LED 指示灯控制等功能都可以发挥重要的作用。

 五、总结与展望

       本项目基于 STM32 微控制器成功开发了一个岸电绞车超速报警嵌入式模块,实现了精确时间测量与显示、拨码开关控制与报警功能、LED 指示灯控制与信号响应以及刹车与复位功能等一系列复杂的功能。通过技术创新和难点突破,提高了系统的性能和稳定性,为相关领域的应用提供了可靠的解决方案。展望未来,随着技术的不断发展和应用需求的不断增加,本项目开发的系统还有很大的发展空间和应用前景。可以进一步优化系统的性能和功能,提高系统的智能化水平,为用户提供更加便捷、高效的服务。同时,可以将系统应用于更多的领域,为推动社会的发展和进步做出更大的贡献。

标签:SendBuf,LED,报警,STM32,cubemx,GPIO,HAL,拨码,岸电
From: https://blog.csdn.net/qq_48057321/article/details/143671960

相关文章

  • STM32—OLED模块
    OLED(OrganicLightEmittingDiode)显示屏因其轻薄、响应速度快、视角宽、色彩鲜艳等特点,在嵌入式系统中得到广泛应用。本文将详细介绍如何使用STM32微控制器通过I2C接口驱动OLED显示屏,并提供完整的代码实现。OLED模块简介OLED显示屏是一种自发光显示技术,具有轻薄、低功耗......
  • 暂时关闭EXTI外部中断的一个坑 HK32(stm32没有测试过)
    一开始的外部中断是通过这个宏函数来关闭的和开启#defineDisableEXTI_Key()(EXTI->IMR&=~((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin)))//PA0、PC2、3#defineEnableEXTI_Key()(EXTI->IMR|=((1<<KEY1_Pin)+(1<<KEY2_Pin)+(1<<KEY3_Pin)))......
  • STM32CubeMX:使用DAC输出正弦波的三种方法(while,定时器中断,DMA)
    1.DAC概念简介:DAC的工作原理是根据数字输入信号的数值,生成相应的模拟输出电压或电流。它通常接收一个二进制数字输入,该数字代表了一个特定的数值范围。DAC通过将这个数字值转换为模拟信号的电压或电流水平来输出。(功能与ADC相反)2.正弦波输出方式1:简单粗暴while循环输出Cub......
  • stm32 HAL 添加 FREERTOS系统(使用stm32cubemx)
    #学习笔记,留存#1.ClockConfiguration(时钟配置)​​​​​​​HSE,LSE选择外部晶振系统时钟选择TIM6,systick(滴答时钟)给FREERTOS用根据自己的芯片配置时钟(我用的是stm32f103zet6)AHB总线72MHZAPB1总线36MHZ APB2总线72MHZ2.ADDFREERTOS(添加实时系统)在Pinout&Co......
  • OpenMV与STM32之间的通信(附源码)
    在嵌入式项目中,经常需要将图像处理单元(如OpenMV)与微控制器(如STM32)相结合,以实现更复杂的功能。本文将详细介绍如何通过串口通信实现OpenMV与STM32之间的数据传输。OpenMV与STM32通信基础OpenMV是一款专为机器视觉设计的微控制器,它内置了图像传感器和强大的图像处理算法。ST......
  • STM32+TMC2209控制步进电机正反转
    TMC2209是一款由Trinamic公司生产的高性能步进电机驱动器芯片,它支持SPI通信接口,能够实现精准的步进电机控制。本文将详细介绍如何使用STM32微控制器结合TMC2209驱动器来控制步进电机的正反转。TMC2209特点高精度控制:支持步进角为0.9°、1.8°、3.6°等多种细分设置。SPI接......
  • STM32的端口引脚的复用功能及重映射功能解析
    STM32微控制器因其强大的外设功能和灵活的引脚复用能力而被广泛应用于嵌入式系统设计中。本文将详细介绍STM32的端口引脚复用功能和重映射功能,以及如何通过代码实现这些功能。端口引脚复用功能STM32的GPIO端口可以被复用为多种外设功能,如USART、SPI、I2C等。这种复用功能......
  • STM32的内存(堆和栈)
    一般来说单片机的内存指的是FLASH和RAM,当在程序中定义了全局变量、局部变量、只读变量等参数时都是会存放到对应的FLASH或者是RAM中。具体对单片机FLASH和RAM的介绍之后再写,这里只对单片机内存分配,对堆和栈以及变量的存储做一个梳理和记录。1、FLASH(0x08000000)FLASH主要是存放......
  • MAC下使用Clion软件进行STM32的HAL库的开发
    1、准备的软件(1)clion:链接:https://www.jetbrains.com.cn/clion/破解:方法可在某宝上去找。(2)STM32CubeMX与ST_Link:链接:https://www.st.com.cn/content/st_com/zh/stm32cubemx.htmlmac电脑在安装的时候会出现上面的界面,依次安装即可。(3)macOS的包管理器‌brew:打开终端......
  • 基于STM32的温室自主灌溉系统(论文+源码)
    1.总体方案设计本课题为基于STM32的温室自主灌溉系统,通过查阅多种文献和的设计了如图2.1所示的温室自主灌溉系统总体架构,整个系统在器件上包括了主控制器STM32F103,温度传感器DS18B20,土壤湿度传感器YL-69,光敏电阻,显示器LCD1602,继电器,LED灯,蜂鸣器,水泵,按键等等。在功能上,实现了......