I've never ran PID auto tune on either version. When I was running 2.02, it was able to hold temperature quite well, so I never went further with it. I reran the config tool with PID with the added M501 at the end but still get
Error: Heater 0 fault: temperature rising much more slowly than the expected 1.0°C/sec
new config.g:
; Configuration file for Duet WiFi (firmware version 3)
; executed by the firmware on start-up
;
; generated by RepRapFirmware Configuration Tool v3.1.3 on Sat Jun 13 2020 21:28:18 GMT-0700 (Pacific Daylight Time)
; General preferences
G90 ; send absolute coordinates...
M83 ; ...but relative extruder moves
M550 P"X5S Duet 2 WiFi" ; set printer name
M669 K1 ; select CoreXY mode
; Network
M551 P"omitted" ; set password
M552 S1 ; enable network
M586 P0 S1 ; enable HTTP
M586 P1 S1 ; enable FTP
M586 P2 S0 ; disable Telnet
; Drives
M569 P0 S0 ; physical drive 0 goes backwards
M569 P1 S0 ; physical drive 1 goes backwards
M569 P2 S1 ; physical drive 2 goes forwards
M569 P3 S1 ; physical drive 3 goes forwards
M584 X0 Y1 Z2 E3 ; set drive mapping
M350 X16 Y16 Z16 E16 I1 ; configure microstepping with interpolation
M92 X80.00 Y80.00 Z400.00 E90.00 ; set steps per mm
M566 X600.00 Y600.00 Z12.00 E300.00 ; set maximum instantaneous speed changes (mm/min)
M203 X6000.00 Y6000.00 Z180.00 E1200.00 ; set maximum speeds (mm/min)
M201 X3000.00 Y3000.00 Z20.00 E10000.00 ; set accelerations (mm/s^2)
M906 X800 Y800 Z800 E800 I35 ; set motor currents (mA) and motor idle factor in per cent
M84 S3000 ; Set idle timeout
; Axis Limits
M208 X0 Y0 Z0 S1 ; set axis minima
M208 X318 Y310 Z400 S0 ; set axis maxima
; Endstops
M574 X1 S1 P"xstop" ; configure active-high endstop for low end on X via pin xstop
M574 Y2 S1 P"ystop" ; configure active-high endstop for high end on Y via pin ystop
M574 Z1 S1 P"zstop" ; configure active-high endstop for low end on Z via pin zstop
; Z-Probe
M558 P5 C"zprobe.in+zprobe.mod" H5 F120 T6000 ; set Z probe type to switch and the dive height + speeds
G31 P500 X0 Y0 Z0 ; set Z probe trigger value, offset and trigger height
M557 X30:290 Y15:290 S20 ; define mesh grid
; Heaters
M308 S0 P"bedtemp" Y"thermistor" T100000 B4138 ; configure sensor 0 as thermistor on pin bedtemp
M950 H0 C"bedheat" T0 ; create bed heater output on bedheat and map it to sensor 0
M307 H0 B0 S1.00 ; disable bang-bang mode for the bed heater and set PWM limit
M140 H0 ; map heated bed to heater 0
M143 H0 S100 ; set temperature limit for heater 0 to 100C
M308 S1 P"e0temp" Y"thermistor" T100000 B4138 ; configure sensor 1 as thermistor on pin e0temp
M950 H1 C"e0heat" T1 ; create nozzle heater output on e0heat and map it to sensor 1
M307 H1 B0 S1.00 ; disable bang-bang mode for heater and set PWM limit
; Fans
M950 F0 C"fan0" Q500 ; create fan 0 on pin fan0 and set its frequency
M106 P0 S0 H T45 ; set fan 0 value. Thermostatic control is turned on
M950 F1 C"fan1" Q500 ; create fan 1 on pin fan1 and set its frequency
M106 P1 S1 H1 T45 ; set fan 1 value. Thermostatic control is turned on
; Tools
M563 P0 D0 H1 F0 ; define tool 0
G10 P0 X0 Y0 Z0 ; set tool 0 axis offsets
G10 P0 R0 S0 ; set initial tool 0 active and standby temperatures to 0C
; Custom settings are not defined
; Miscellaneous
M575 P1 S1 B57600 ; enable support for PanelDue
M501 ; load saved parameters from non-volatile memory
Edit: After finding the auto PID procedure, I can now get my heated bed running without throwing a fault. Thanks Phaedrux for pointing out auto PID.