NTP-Source
How to NTP a Raspberry Pi 4 via GPS and PPS This also works on Pi 3.
Hardware
A GPS with serial connected to the Pi’s serial port, and PPS connected to gpio 18 (physical pin 12 on the GPIO connector) If possible, configure GPS to output GPZDA at 9600 baud. GPSD will find other baud rates, but takes approximately 8 minutes to get to 115200, and 9600 is the first one it tries.
sudo raspi-config
disable serial console login, enable hardware serial port
sudo apt install pps-tools gpsd gpsd-clients python-gps chrony
edit /etc/modules, add:
pps-gpio
edit /boot/firmware/config.txt (or /boot/config.txt), add:
dtoverlay=pps-gpio,gpiopin=18
edit /etc/default/gpsd, set device to “/dev/ttyS0”, options to “-n -b”
sudo systemctl enable gpsd
edit /etc/chrony/chrony.conf, comment out all servers and pools, add:
refclock SHM 0 poll 0 refid GPS precision 1e-1 offset 0.055 refclock PPS /dev/pps0 lock GPS poll 0 refid PPS precision 1e-9
sudo systemctl restart chrony
Monitor using chronyc sources, or chronyc sourcestats