一、项目背景与概述
在当今高度自动化和智能化的时代,对电子系统的功能和性能要求不断提高。本项目旨在基于 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