diff options
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.c | 51 |
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); +} + |