Browse Source

风扇反馈相关逻辑

master
tianjialong 2 years ago
parent
commit
7320fda777
  1. 26
      app/MDK-ARM/app.uvguix.29643
  2. 70
      src/board/fan_state_monitor.cpp
  3. 46
      src/board/fan_state_monitor.hpp
  4. 30
      src/board/hardware.cpp
  5. 13
      src/board/hardware.hpp

26
app/MDK-ARM/app.uvguix.29643
File diff suppressed because it is too large
View File

70
src/board/fan_state_monitor.cpp

@ -0,0 +1,70 @@
#include "fan_state_monitor.hpp"
#include "libiflytop_micro/stm32/basic/basic.h"
#include "libiflytop_micro\stm32\basic/stm32_hal.hpp"
using namespace iflytop;
#define TAG "FAN_STATE_MONITOR"
void FanStateMonitor::initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate) {
m_FB_GPIOx = FB_GPIOx;
m_FB_GPIO_Pin = FB_GPIO_Pin;
m_fanstate = fanstate;
m_os = os;
m_fanFBCount = 0;
m_lastPinState = GPIO_PIN_RESET;
m_lastCallTicket = 0;
m_fanOpenTicket = 0;
m_lastFanState = false;
m_fanError = false;
STM32_HAL::gpioInitAsInput(FB_GPIOx, FB_GPIO_Pin);
m_lastPinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin);
}
void FanStateMonitor::doFanStateCheckPeriodicJob() {
/**
* @brief
*/
GPIO_PinState pinState = HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin);
if (HAL_GPIO_ReadPin(m_FB_GPIOx, m_FB_GPIO_Pin) != m_lastPinState) {
m_fanFBCount++;
m_count++;
m_lastPinState = pinState;
}
/**
* @brief 22
*/
if (m_os->hasPassedMS(m_fanOpenTicket) > 2000 && m_os->hasPassedMS(m_lastCallTicket) > 2000) {
if (m_fanFBCount == 0) {
ZLOGE(TAG, "Fan is not working!");
m_fanError = true;
}
m_lastCallTicket = m_os->getTicket();
m_fanFBCount = 0;
}
}
void FanStateMonitor::periodicJob() {
//
bool& fanstate = *m_fanstate;
if (fanstate != m_lastFanState) {
m_lastFanState = fanstate;
if (fanstate) {
/**
* @brief
*/
// 启动检查
m_fanOpenTicket = m_os->getTicket();
m_lastCallTicket = m_os->getTicket();
m_fanFBCount = 0;
m_fanError = false;
}
}
/**
* @brief
*/
if (fanstate) {
doFanStateCheckPeriodicJob();
}
}

46
src/board/fan_state_monitor.hpp

@ -0,0 +1,46 @@
#pragma once
#include "libiflytop_micro/stm32/basic/iflytop_micro_os.hpp"
#include "main.h"
namespace iflytop {
class FanStateMonitor {
GPIO_TypeDef* m_FB_GPIOx; // 风扇反馈引脚
uint16_t m_FB_GPIO_Pin; // 风扇反馈引脚
bool* m_fanstate; // 风扇当前是否正在工作
IflytopMicroOS* m_os; // 系统基础方法
uint16_t m_fanFBCount; // 风扇反馈计数
GPIO_PinState m_lastPinState; // 上次风扇反馈引脚状态,用来实现风扇反馈计数逻辑
uint32_t m_lastCallTicket; // 上次调用周期性任务的时间戳
uint32_t m_fanOpenTicket; // 风扇打开的时间戳
bool m_lastFanState; // 上次风扇状态,用来实现捕获风扇打开事件
bool m_fanError; // 风扇故障标志位
uint32_t m_count; // 总计数,不清零
public:
FanStateMonitor(/* args */){};
~FanStateMonitor(){};
void initialize(IflytopMicroOS* os, GPIO_TypeDef* FB_GPIOx, uint16_t FB_GPIO_Pin, bool* fanstate);
/**
* @brief
*
* 1.
* 2. clearFanError()
* @return true
* @return false
*/
bool getFanError() { return m_fanError; }
void clearFanError() { m_fanError = false; }
uint32_t getCount() { return m_count; }
/*******************************************************************************
* *
*******************************************************************************/
/**
* @brief ,
*/
void periodicJob();
private:
void doFanStateCheckPeriodicJob();
};
} // namespace iflytop

30
src/board/hardware.cpp

@ -180,12 +180,12 @@ void Hardware::fan_init(int freq) {
* FAN4_FB_INT PC7
* FAN5_FB_INT PC10
*/
// m_fan.fanStateMonitor[0].initialize(this, GPIOC, GPIO_PIN_1, fanGetPowerState(0));
// m_fan.fanStateMonitor[1].initialize(this, GPIOC, GPIO_PIN_4, fanGetPowerState(1));
// m_fan.fanStateMonitor[2].initialize(this, GPIOC, GPIO_PIN_5, fanGetPowerState(2));
// m_fan.fanStateMonitor[3].initialize(this, GPIOC, GPIO_PIN_6, fanGetPowerState(3));
// m_fan.fanStateMonitor[4].initialize(this, GPIOC, GPIO_PIN_7, fanGetPowerState(4));
// m_fan.fanStateMonitor[5].initialize(this, GPIOC, GPIO_PIN_10, fanGetPowerState(5));
m_fan.fanStateMonitor[0].initialize(this, GPIOC, GPIO_PIN_1, fanGetPowerState(0));
m_fan.fanStateMonitor[1].initialize(this, GPIOC, GPIO_PIN_4, fanGetPowerState(1));
m_fan.fanStateMonitor[2].initialize(this, GPIOC, GPIO_PIN_5, fanGetPowerState(2));
m_fan.fanStateMonitor[3].initialize(this, GPIOC, GPIO_PIN_6, fanGetPowerState(3));
m_fan.fanStateMonitor[4].initialize(this, GPIOC, GPIO_PIN_7, fanGetPowerState(4));
m_fan.fanStateMonitor[5].initialize(this, GPIOC, GPIO_PIN_10, fanGetPowerState(5));
}
void Hardware::fanSetDutyCycle(int fanIndex, uint16_t dutyCycle) {
@ -259,9 +259,9 @@ void Hardware::fan_periodicJob() {
/**
* @brief
*/
// for (size_t i = 0; i < ZARRAY_SIZE(m_fan.fanStateMonitor); i++) {
// m_fan.fanStateMonitor[i].periodicJob();
// }
for (size_t i = 0; i < ZARRAY_SIZE(m_fan.fanStateMonitor); i++) {
m_fan.fanStateMonitor[i].periodicJob();
}
/**
* @brief
@ -286,12 +286,12 @@ void Hardware::fan_periodicJob() {
*fanGetPowerState(4), //
*fanGetPowerState(5)); //
// ZLOGI(TAG, "FANCount:%d,%d,%d,%d,%d,%d", m_fan.fanStateMonitor[0].getCount(), //
// m_fan.fanStateMonitor[1].getCount(), //
// m_fan.fanStateMonitor[2].getCount(), //
// m_fan.fanStateMonitor[3].getCount(), //
// m_fan.fanStateMonitor[4].getCount(), //
// m_fan.fanStateMonitor[5].getCount());
ZLOGI(TAG, "FANCount:%d,%d,%d,%d,%d,%d", m_fan.fanStateMonitor[0].getCount(), //
m_fan.fanStateMonitor[1].getCount(), //
m_fan.fanStateMonitor[2].getCount(), //
m_fan.fanStateMonitor[3].getCount(), //
m_fan.fanStateMonitor[4].getCount(), //
m_fan.fanStateMonitor[5].getCount());
}
}
}

13
src/board/hardware.hpp

@ -1,5 +1,6 @@
#pragma once
#include "board/fan_state_monitor.hpp"
#include "board/project_board.hpp"
#include "i2c.h"
#include "libiflytop_micro/stm32/basic/basic.h"
@ -18,7 +19,7 @@ class HardwareListener {
virtual void Hardware_onHomeRefSwitchISR(){};
};
class Hardware {
class Hardware : public IflytopMicroOS {
private:
/* data */
@ -37,11 +38,11 @@ class Hardware {
int32_t pwm;
};
struct fan_res_t {
// FanStateMonitor fanStateMonitor[6];
bool m_fanState[6];
uint16_t fan0_3duty;
uint16_t fan4duty;
uint16_t fan5duty;
FanStateMonitor fanStateMonitor[6];
bool m_fanState[6];
uint16_t fan0_3duty;
uint16_t fan4duty;
uint16_t fan5duty;
};
fan_res_t m_fan;
can_res_t m_can;

Loading…
Cancel
Save