2026-04-13 00:24:56 +02:00
2026-04-13 00:24:56 +02:00
2026-04-12 20:11:07 +02:00
2026-04-12 20:11:17 +02:00
2026-04-12 20:11:17 +02:00
2026-04-12 20:11:17 +02:00
2026-04-12 20:11:17 +02:00
2026-04-12 20:11:17 +02:00
2026-04-13 00:24:56 +02:00

I2C Fan Controller v2

~ because I found a cool new microcontroller ~

This one is based on WCH CH32V003 and it's (should be) much better than the shitty ATTiny one.

The i2c_driver.h is copied wholesale from ch32fun i2c_slave examples folder. It literally just works.

RPM readings are getting unstable at ~310-320 RPM but that's probably okay.

How compile?

There's a Makefile shithead

We compile on Debian/ubuntu. Other than the usual build-essential stuff you need also

sudo apt install gcc-riscv64-unknown-elf libnewlib-dev libudev-dev libusb-1.0-0-dev

There is a distrobox.ini provided.

You will also need to clone the ch32fun repo somewhere and modify the Makefile. To flash you will also need to compile minichlink. Included in the ch32fun repo.

???..

Or just use PlatformIO idc. It has debugging.

Pins

For the TSSOP20 package, CH32V003FxPx

Pin # Port Function
3 PD5 TX
4 PD7 NRST
11 PC1 SDA
12 PC2 SCL
16 PC6 POWER_EN
18 PD1 SWIO
19 PD2 PWM_OUT
20 PD3 TACH_IN

Register index

Registers are 8 bit each, but most of them hold 16-bit values. Bytes in even registers are high, bytes in odd registers are low.

Register address Function R/W
0x00, 0x01 whoami (always returns 0x69 0x2b) RO
0x02, 0x03 Current fan speed (RPM) RO
0x04, 0x05 Target fan speed (RPM). Initial default speed is 750 RPM. R/W
0x06, 0x07 Current duty cycle R/W
0x08, 0x09 Maximum duty cycle RO
0x0a State register RO
0x0b Mode register R/W

State register

State equal to 0 means all is good.

Bit Description
0 (0000000x) Steady state flag. 0 - fan reached the requested target speed or fan running in constant duty mode. 1 - fan didn't (yet) reach the target speed.
1 (000000x0) Fan stalled. 0 - fan operating normally. 1 - fan stalled.

Mode register

Bit Description
0 (0000000x) Mode of operation: 0 - Constant duty cycle mode, the controller will keep the fan at a duty cycle set in register 0x06 and not change it automatically. 1 - Constant RPM mode, the controller continuously adjust PWM duty until target RPM is reached. This is the initial mode.
1 (000000x0) Fan power disable: 0 - Fan operates normally. 1 - 12V supply to the fan is cut.
Description
No description provided
Readme 2.8 MiB
v1.0.2 Latest
2026-08-06 19:53:41 +02:00
Languages
C 92.2%
Makefile 7.8%