elec350

Dependencies:   mbed

Fork of elec350 by Bob Merrison-Hort

Committer:
rmerrisonhort
Date:
Thu Nov 19 10:06:45 2015 +0000
Revision:
16:721e41936a07
Added InternalTemperature class.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rmerrisonhort 16:721e41936a07 1 /* Internal temperature sensor class. Adapted from AnalogIn.h, from:
rmerrisonhort 16:721e41936a07 2 * mbed Microcontroller Library
rmerrisonhort 16:721e41936a07 3 * Copyright (c) 2006-2013 ARM Limited
rmerrisonhort 16:721e41936a07 4 *
rmerrisonhort 16:721e41936a07 5 * Licensed under the Apache License, Version 2.0 (the "License");
rmerrisonhort 16:721e41936a07 6 * you may not use this file except in compliance with the License.
rmerrisonhort 16:721e41936a07 7 * You may obtain a copy of the License at
rmerrisonhort 16:721e41936a07 8 *
rmerrisonhort 16:721e41936a07 9 * http://www.apache.org/licenses/LICENSE-2.0
rmerrisonhort 16:721e41936a07 10 *
rmerrisonhort 16:721e41936a07 11 * Unless required by applicable law or agreed to in writing, software
rmerrisonhort 16:721e41936a07 12 * distributed under the License is distributed on an "AS IS" BASIS,
rmerrisonhort 16:721e41936a07 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rmerrisonhort 16:721e41936a07 14 * See the License for the specific language governing permissions and
rmerrisonhort 16:721e41936a07 15 * limitations under the License.
rmerrisonhort 16:721e41936a07 16 */
rmerrisonhort 16:721e41936a07 17 #ifndef INTERNAL_TEMP_H
rmerrisonhort 16:721e41936a07 18 #define INTERNAL_TEMP_H
rmerrisonhort 16:721e41936a07 19
rmerrisonhort 16:721e41936a07 20 #include "platform.h"
rmerrisonhort 16:721e41936a07 21
rmerrisonhort 16:721e41936a07 22 #if DEVICE_ANALOGIN
rmerrisonhort 16:721e41936a07 23
rmerrisonhort 16:721e41936a07 24 #include "analogin_api.h"
rmerrisonhort 16:721e41936a07 25
rmerrisonhort 16:721e41936a07 26 void temp_init(analogin_t *obj) {
rmerrisonhort 16:721e41936a07 27 obj->adc = (ADCName)16;
rmerrisonhort 16:721e41936a07 28
rmerrisonhort 16:721e41936a07 29 // Enable ADC1 clock source.
rmerrisonhort 16:721e41936a07 30 RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
rmerrisonhort 16:721e41936a07 31
rmerrisonhort 16:721e41936a07 32 // Enable the ADC
rmerrisonhort 16:721e41936a07 33 ADC1->CR2 |= ADC_CR2_ADON;
rmerrisonhort 16:721e41936a07 34
rmerrisonhort 16:721e41936a07 35 // Enable internal temperature sensor.
rmerrisonhort 16:721e41936a07 36 ADC->CCR |= ADC_CCR_TSVREFE;
rmerrisonhort 16:721e41936a07 37
rmerrisonhort 16:721e41936a07 38 // Set longest sample time just to be safe.
rmerrisonhort 16:721e41936a07 39 ADC1->SMPR1 |= 0x1c;
rmerrisonhort 16:721e41936a07 40 }
rmerrisonhort 16:721e41936a07 41
rmerrisonhort 16:721e41936a07 42 static inline uint32_t temp_read(analogin_t *obj) {
rmerrisonhort 16:721e41936a07 43 // Select the appropriate channel
rmerrisonhort 16:721e41936a07 44 ADC1->SQR3 = (int) obj->adc;
rmerrisonhort 16:721e41936a07 45
rmerrisonhort 16:721e41936a07 46 // Start conversion
rmerrisonhort 16:721e41936a07 47 ADC1->CR2 |= ADC_CR2_SWSTART;
rmerrisonhort 16:721e41936a07 48
rmerrisonhort 16:721e41936a07 49 // Wait for conversion to finish
rmerrisonhort 16:721e41936a07 50 while (!(ADC1->SR & ADC_SR_EOC));
rmerrisonhort 16:721e41936a07 51
rmerrisonhort 16:721e41936a07 52 uint32_t data = ADC1->DR;
rmerrisonhort 16:721e41936a07 53 return data; // 12 bit
rmerrisonhort 16:721e41936a07 54 }
rmerrisonhort 16:721e41936a07 55
rmerrisonhort 16:721e41936a07 56 static inline uint32_t temp_read_u32(analogin_t *obj) {
rmerrisonhort 16:721e41936a07 57 uint32_t value;
rmerrisonhort 16:721e41936a07 58 value = temp_read(obj);
rmerrisonhort 16:721e41936a07 59 return value;
rmerrisonhort 16:721e41936a07 60 }
rmerrisonhort 16:721e41936a07 61
rmerrisonhort 16:721e41936a07 62 uint16_t temperature_read_u16(analogin_t *obj) {
rmerrisonhort 16:721e41936a07 63 uint32_t value = temp_read_u32(obj);
rmerrisonhort 16:721e41936a07 64
rmerrisonhort 16:721e41936a07 65 return (value << 4) | ((value >> 8) & 0x000F); // 12 bit
rmerrisonhort 16:721e41936a07 66 }
rmerrisonhort 16:721e41936a07 67
rmerrisonhort 16:721e41936a07 68 float temperature_read(analogin_t *obj) {
rmerrisonhort 16:721e41936a07 69 uint32_t value = temp_read_u32(obj);
rmerrisonhort 16:721e41936a07 70 return (float)value * (1.0f / (float)0xFFF); //Check range
rmerrisonhort 16:721e41936a07 71 }
rmerrisonhort 16:721e41936a07 72
rmerrisonhort 16:721e41936a07 73 class InternalTemperature {
rmerrisonhort 16:721e41936a07 74
rmerrisonhort 16:721e41936a07 75 public:
rmerrisonhort 16:721e41936a07 76 InternalTemperature() {
rmerrisonhort 16:721e41936a07 77 temp_init(&_adc);
rmerrisonhort 16:721e41936a07 78 }
rmerrisonhort 16:721e41936a07 79
rmerrisonhort 16:721e41936a07 80 float read() {
rmerrisonhort 16:721e41936a07 81 return temperature_read(&_adc);
rmerrisonhort 16:721e41936a07 82 }
rmerrisonhort 16:721e41936a07 83
rmerrisonhort 16:721e41936a07 84 unsigned short read_u16() {
rmerrisonhort 16:721e41936a07 85 return temperature_read_u16(&_adc);
rmerrisonhort 16:721e41936a07 86 }
rmerrisonhort 16:721e41936a07 87
rmerrisonhort 16:721e41936a07 88 #ifdef MBED_OPERATORS
rmerrisonhort 16:721e41936a07 89 operator float() {
rmerrisonhort 16:721e41936a07 90 return read();
rmerrisonhort 16:721e41936a07 91 }
rmerrisonhort 16:721e41936a07 92 #endif
rmerrisonhort 16:721e41936a07 93
rmerrisonhort 16:721e41936a07 94 protected:
rmerrisonhort 16:721e41936a07 95 analogin_t _adc;
rmerrisonhort 16:721e41936a07 96 };
rmerrisonhort 16:721e41936a07 97
rmerrisonhort 16:721e41936a07 98
rmerrisonhort 16:721e41936a07 99 #endif
rmerrisonhort 16:721e41936a07 100
rmerrisonhort 16:721e41936a07 101 #endif
rmerrisonhort 16:721e41936a07 102