diff --git a/src/ipa/raspberrypi/controller/awb_algorithm.hpp b/src/ipa/raspberrypi/controller/awb_algorithm.hpp
index 5be0c9f4..96f88afc 100644
--- a/src/ipa/raspberrypi/controller/awb_algorithm.hpp
+++ b/src/ipa/raspberrypi/controller/awb_algorithm.hpp
@@ -15,6 +15,7 @@ class AwbAlgorithm : public Algorithm
 public:
 	AwbAlgorithm(Controller *controller) : Algorithm(controller) {}
 	// An AWB algorithm must provide the following:
+	virtual unsigned int GetConvergenceFrames() const = 0;
 	virtual void SetMode(std::string const &mode_name) = 0;
 	virtual void SetManualGains(double manual_r, double manual_b) = 0;
 };
diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp
index 020825e3..10600f75 100644
--- a/src/ipa/raspberrypi/controller/rpi/awb.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp
@@ -59,6 +59,7 @@ void AwbConfig::Read(boost::property_tree::ptree const &params)
 	bayes = params.get<int>("bayes", 1);
 	frame_period = params.get<uint16_t>("frame_period", 10);
 	startup_frames = params.get<uint16_t>("startup_frames", 10);
+	convergence_frames = params.get<unsigned int>("convergence_frames", 3);
 	speed = params.get<double>("speed", 0.05);
 	if (params.get_child_optional("ct_curve"))
 		read_ct_curve(ct_r, ct_b, params.get_child("ct_curve"));
@@ -165,6 +166,16 @@ void Awb::Initialise()
 	prev_sync_results_ = sync_results_;
 }
 
+unsigned int Awb::GetConvergenceFrames() const
+{
+	// If colour gains have been explicitly set, there is no convergence
+	// to happen, so no need to drop any frames - return zero.
+	if (manual_r_ && manual_b_)
+		return 0;
+	else
+		return config_.convergence_frames;
+}
+
 void Awb::SetMode(std::string const &mode_name)
 {
 	std::unique_lock<std::mutex> lock(settings_mutex_);
diff --git a/src/ipa/raspberrypi/controller/rpi/awb.hpp b/src/ipa/raspberrypi/controller/rpi/awb.hpp
index 545d85a8..6fc045ce 100644
--- a/src/ipa/raspberrypi/controller/rpi/awb.hpp
+++ b/src/ipa/raspberrypi/controller/rpi/awb.hpp
@@ -37,6 +37,7 @@ struct AwbConfig {
 	uint16_t frame_period;
 	// number of initial frames for which speed taken as 1.0 (maximum)
 	uint16_t startup_frames;
+	unsigned int convergence_frames; // approx number of frames to converge
 	double speed; // IIR filter speed applied to algorithm results
 	bool fast; // "fast" mode uses a 16x16 rather than 32x32 grid
 	Pwl ct_r; // function maps CT to r (= R/G)
@@ -82,6 +83,7 @@ public:
 	char const *Name() const override;
 	void Initialise() override;
 	void Read(boost::property_tree::ptree const &params) override;
+	unsigned int GetConvergenceFrames() const override;
 	void SetMode(std::string const &name) override;
 	void SetManualGains(double manual_r, double manual_b) override;
 	void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override;
