Support derivative term in PID algorithm and support to set cycle interval time from fan table
1. Support to calculate derivative term in PID algorithm.
2. Add two properties: cycleIntervalTimeMS and updateThermalsTimeMS
in fan table that could be used to decide "time interval of PID control loop"
and "time interval to update thermals' cached value".
Tested:
- PID algorithm:
1. Check pid-control-service could calculate output PWM
according to the fan table.
[Test log]
root@greatlakes:~# systemctl status phosphor-pid-control -l
* phosphor-pid-control.service - Phosphor-Pid-Control Margin-based Fan Control Daemon
Loaded: loaded (/lib/systemd/system/phosphor-pid-control.service; enabled; preset: enabled)
Active: active (running) since Fri 2018-03-09 05:09:35 PST; 1min 47s ago
Main PID: 3105 (swampd)
CGroup: /system.slice/phosphor-pid-control.service
`-3105 /usr/bin/swampd -c /usr/share/entity-manager/configurations/fan-table.json
...
Mar 09 05:10:29 greatlakes phosphor-pid-control[3105]: PID Zone 1 max SetPoint 3.75 requested by
PID_NIC_SENSOR_TEMP BMC_SENSOR_FAN0_TACH BMC_SENSOR_FAN2_TACH BMC_SENSOR_FAN4_TACH BMC_SENSOR_FAN6_TACH
- Cycle interval time:
1. Set cycleIntervalTimeMS and updateThermalsTimeMS
to 1000 ms in fan table
2. Check service would update thermal every second from debug log.
[Test log]
root@greatlakes:~# journalctl -u phosphor-pid-control --since "Mar 09 04:52:16"
Mar 09 04:52:16 greatlakes systemd[1]: Started Phosphor-Pid-Control Margin-based Fan Control Daemon.
...
Mar 09 04:53:28 greatlakes phosphor-pid-control[2795]: processThermals
Mar 09 04:53:28 greatlakes phosphor-pid-control[2795]: processFans
Mar 09 04:53:29 greatlakes phosphor-pid-control[2795]: processThermals
Mar 09 04:53:29 greatlakes phosphor-pid-control[2795]: processFans
Mar 09 04:53:30 greatlakes phosphor-pid-control[2795]: processThermals
Mar 09 04:53:30 greatlakes phosphor-pid-control[2795]: processFans
Change-Id: I04e1b440603c3ad66a1e26c96451992785da6fe6
Signed-off-by: Bonnie Lo <Bonnie_Lo@wiwynn.com>
diff --git a/pid/pidloop.cpp b/pid/pidloop.cpp
index a5d0daf..aba2b6e 100644
--- a/pid/pidloop.cpp
+++ b/pid/pidloop.cpp
@@ -48,7 +48,7 @@
void pidControlLoop(std::shared_ptr<ZoneInterface> zone,
std::shared_ptr<boost::asio::steady_timer> timer,
- const bool* isCanceling, bool first, int ms100cnt)
+ const bool* isCanceling, bool first, uint64_t cycleCnt)
{
if (*isCanceling)
return;
@@ -64,8 +64,9 @@
processThermals(zone);
}
- timer->expires_after(std::chrono::milliseconds(100));
- timer->async_wait([zone, timer, ms100cnt, isCanceling](
+ timer->expires_after(
+ std::chrono::milliseconds(zone->getCycleIntervalTime()));
+ timer->async_wait([zone, timer, cycleCnt, isCanceling](
const boost::system::error_code& ec) mutable {
if (ec == boost::asio::error::operation_aborted)
{
@@ -102,16 +103,16 @@
// Check if we should just go back to sleep.
if (zone->getManualMode())
{
- pidControlLoop(zone, timer, isCanceling, false, ms100cnt);
+ pidControlLoop(zone, timer, isCanceling, false, cycleCnt);
return;
}
// Get the latest fan speeds.
zone->updateFanTelemetry();
- if (10 <= ms100cnt)
+ if (zone->getUpdateThermalsCycle() <= cycleCnt)
{
- ms100cnt = 0;
+ cycleCnt = 0;
processThermals(zone);
}
@@ -126,9 +127,9 @@
zone->writeLog(out.str());
}
- ms100cnt += 1;
+ cycleCnt += 1;
- pidControlLoop(zone, timer, isCanceling, false, ms100cnt);
+ pidControlLoop(zone, timer, isCanceling, false, cycleCnt);
});
}