summaryrefslogtreecommitdiff
path: root/FreeRTOS-Plus/Test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS-Plus/Test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c')
-rw-r--r--FreeRTOS-Plus/Test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/FreeRTOS-Plus/Test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c b/FreeRTOS-Plus/Test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c
new file mode 100644
index 000000000..b2a3f2c13
--- /dev/null
+++ b/FreeRTOS-Plus/Test/CMock/examples/temp_sensor/src/AdcTemperatureSensor.c
@@ -0,0 +1,51 @@
+#include "Types.h"
+#include "AdcTemperatureSensor.h"
+
+static inline uint32 ConvertAdcCountsToPicovolts(uint32 counts);
+static inline uint16 ConvertPicovoltsToMillivolts(uint32 picovolts);
+
+//
+// PUBLIC METHODS
+//
+
+void Adc_StartTemperatureSensorConversion(void)
+{
+ AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
+}
+
+bool Adc_TemperatureSensorSampleReady(void)
+{
+ return ((AT91C_BASE_ADC->ADC_SR & AT91C_ADC_EOC4) == AT91C_ADC_EOC4);
+}
+
+uint16 Adc_ReadTemperatureSensor(void)
+{
+ uint32 picovolts = ConvertAdcCountsToPicovolts(AT91C_BASE_ADC->ADC_CDR4);
+ return ConvertPicovoltsToMillivolts(picovolts);
+}
+
+//
+// PRIVATE HELPERS
+//
+
+static inline uint32 ConvertAdcCountsToPicovolts(uint32 counts)
+{
+ // ADC bit weight at 10-bit resolution with 3.0V reference = 2.9296875 mV/LSB
+ uint32 picovoltsPerAdcCount = 2929688;
+
+ // Shift decimal point by 6 places to preserve accuracy in fixed-point math
+ return counts * picovoltsPerAdcCount;
+}
+
+static inline uint16 ConvertPicovoltsToMillivolts(uint32 picovolts)
+{
+ const uint32 halfMillivoltInPicovolts = 500000;
+ const uint32 picovoltsPerMillivolt = 1000000;
+
+ // Add 0.5 mV to result so that truncation yields properly rounded result
+ picovolts += halfMillivoltInPicovolts;
+
+ // Divide appropriately to convert to millivolts
+ return (uint16)(picovolts / picovoltsPerMillivolt);
+}
+