Skip to content

Commit 5a465b1

Browse files
authored
Merge pull request #255 from FOSDEM/fan-test
Fan control changes and printf output
2 parents 2a5e726 + 1491f57 commit 5a465b1

File tree

4 files changed

+37
-46
lines changed

4 files changed

+37
-46
lines changed

hardware/firmware/box_rp2040/src/io/serial.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ void io_say(const char* buf) {
5656
io_say_n(buf, strlen(buf));
5757
}
5858

59+
void io_say_f(const char *fmt, ...) {
60+
char buffer[1024];
61+
va_list args;
62+
va_start(args, fmt);
63+
vsnprintf(buffer, 1024, fmt, args);
64+
va_end(args);
65+
io_say(buffer);
66+
}
67+
5968
char line_buf[100];
6069
int n = 0;
6170
io_state_t state = io_state_cmdline;

hardware/firmware/box_rp2040/src/io/serial.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ void io_task(void);
99
void io_say_n(const char* buf, int n);
1010
void io_say(const char* buf);
1111
void io_say_uint(uint32_t x);
12+
void io_say_f(const char *fmt, ...);
1213
void io_say_bool(bool x);

hardware/firmware/box_rp2040/src/pwr_brd_ctl/fan_ctl.c

Lines changed: 26 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include <stdint.h>
2-
2+
#include <math.h>
33
#include <hardware/i2c.h>
44

55
#include "config.h"
@@ -27,6 +27,27 @@ bool fan_ctl_i2c_write(uint8_t reg_id, uint8_t val) {
2727
return pwr_brd_i2c_write_reg(PWR_BRD_FAN_CTL_ADDR, reg_id, &val, 1);
2828
}
2929

30+
bool fan_ctl_set_pwm_frequency(uint8_t fan1, uint8_t fan2, uint8_t fan3, uint8_t fan4, uint8_t fan5) {
31+
uint8_t f123 = fan1 | (fan2<<2) | (fan3<<4);
32+
bool ret = fan_ctl_i2c_write(0x2D, f123);
33+
if (!ret) {
34+
return ret;
35+
}
36+
37+
uint8_t f45 = fan4 | (fan5<<2);
38+
return fan_ctl_i2c_write(0x2C, f45);
39+
}
40+
41+
void pwr_brd_fan_init() {
42+
uint64_t now = time_us_64();
43+
44+
fan_ctl_set_pwm_frequency(0, 0, 0, 0, 0);
45+
for (int i = 0; i < NUMFAN; i++) {
46+
time_next_cmd[i] = now;
47+
desired_fan_speed[i] = DESIRED_RPM;
48+
}
49+
}
50+
3051
bool fan_ctl_i2c_write_and_check(uint8_t reg_id, uint8_t val) {
3152
if (!pwr_brd_i2c_write_reg(PWR_BRD_FAN_CTL_ADDR, reg_id, &val, 1)) {
3253
return false;
@@ -160,18 +181,12 @@ void fan_ctl_task() {
160181
continue;
161182
}
162183

163-
// in all cases below, fan should be on
164-
165-
if (
166-
fanspeed > desired_fan_speed[i] - DESIRED_RPM_THRESH_LOWER &&
167-
fanspeed < desired_fan_speed[i] + DESIRED_RPM_THRESH_UPPER
168-
) {
169-
// fan is within threshold, do nothing
170-
continue;
171-
}
172-
184+
int difference = desired_fan_speed[i] - fanspeed;
173185
uint8_t pwm;
174186
fan_ctl_get_pwm(i, &pwm);
187+
float smooth = 0.0005f;
188+
pwm += ((difference>>2) * (1.0f - exp(-smooth)));
189+
fan_ctl_set_pwm(i, pwm);
175190

176191
if (pwm > FAN_MAX_PWM) {
177192
// PWM was set by the fan controller's default power on value
@@ -195,39 +210,5 @@ void fan_ctl_task() {
195210
continue;
196211
}
197212

198-
if (fanspeed > desired_fan_speed[i] * 2) {
199-
// fan is way too fast, dividing PWM in half
200-
fan_ctl_set_pwm(i, pwm >> 1);
201-
continue;
202-
}
203-
204-
if (fanspeed > desired_fan_speed[i] + DESIRED_RPM_THRESH_UPPER) {
205-
// fan is a bit too fast
206-
207-
if (pwm < 1) {
208-
// fan is already at minimum PWN, nothing to do
209-
continue;
210-
}
211-
212-
// decrease PWM by 1
213-
fan_ctl_set_pwm(i, pwm - 1);
214-
215-
// give it more time to spin down
216-
time_next_cmd[i] = now + 2 * CMD_WAIT_TIME_US;
217-
continue;
218-
}
219-
220-
if (fanspeed < desired_fan_speed[i] - DESIRED_RPM_THRESH_LOWER) {
221-
// fan is a bit too slow
222-
223-
if (pwm >= FAN_MAX_PWM) {
224-
// fan is already at max PWM, nothing to do
225-
continue;
226-
}
227-
228-
// increase PWM by 1
229-
fan_ctl_set_pwm(i, pwm + 1);
230-
continue;
231-
}
232213
}
233214
}

hardware/firmware/box_rp2040/src/pwr_brd_ctl/fan_ctl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <stdbool.h>
55

66
#define FAN_TACH_CONSTANT (7864320)
7-
#define CMD_WAIT_TIME_US (1000*1000)
7+
#define CMD_WAIT_TIME_US (3000 * 1000)
88
#define DESIRED_RPM (5000)
99
#define DESIRED_RPM_THRESH_UPPER (1000)
1010
#define DESIRED_RPM_THRESH_LOWER (2000)

0 commit comments

Comments
 (0)