不韋 呂 / UITDSP_ADDA2

Dependents:   UITDSP_ADDA_Example2

Committer:
MikamiUitOpen
Date:
Mon Mar 16 23:59:49 2015 +0000
Revision:
1:e997f4e94491
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 1:e997f4e94491 1 //--------------------------------------------------------------
MikamiUitOpen 1:e997f4e94491 2 // Class for Internal ADC using Ticker for trigger -- Header
MikamiUitOpen 1:e997f4e94491 3 //
MikamiUitOpen 1:e997f4e94491 4 // 2015/02/23, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 1:e997f4e94491 5 //--------------------------------------------------------------
MikamiUitOpen 1:e997f4e94491 6
MikamiUitOpen 1:e997f4e94491 7 #ifndef INTERNAL_ADC_HPP
MikamiUitOpen 1:e997f4e94491 8 #define INTERNAL_ADC_HPP
MikamiUitOpen 1:e997f4e94491 9
MikamiUitOpen 1:e997f4e94491 10 #include "mbed.h"
MikamiUitOpen 1:e997f4e94491 11
MikamiUitOpen 1:e997f4e94491 12 namespace Mikami
MikamiUitOpen 1:e997f4e94491 13 {
MikamiUitOpen 1:e997f4e94491 14 class InternalADC
MikamiUitOpen 1:e997f4e94491 15 {
MikamiUitOpen 1:e997f4e94491 16 private:
MikamiUitOpen 1:e997f4e94491 17 // Following object of AnalogIn class will be
MikamiUitOpen 1:e997f4e94491 18 // initialized by menber initializer
MikamiUitOpen 1:e997f4e94491 19 AnalogIn adc_;
MikamiUitOpen 1:e997f4e94491 20 // Following two objects of AnalogIn class will be
MikamiUitOpen 1:e997f4e94491 21 // initailized by regular executable statements
MikamiUitOpen 1:e997f4e94491 22 AnalogIn* adc2_;
MikamiUitOpen 1:e997f4e94491 23 AnalogIn* adc3_;
MikamiUitOpen 1:e997f4e94491 24
MikamiUitOpen 1:e997f4e94491 25 Ticker timer_;
MikamiUitOpen 1:e997f4e94491 26
MikamiUitOpen 1:e997f4e94491 27 // Channel of ADC1
MikamiUitOpen 1:e997f4e94491 28 uint8_t ch1_, ch2_, ch3_;
MikamiUitOpen 1:e997f4e94491 29
MikamiUitOpen 1:e997f4e94491 30 // Exctract channel number
MikamiUitOpen 1:e997f4e94491 31 uint8_t GetChannelNumber(PinName pin)
MikamiUitOpen 1:e997f4e94491 32 {
MikamiUitOpen 1:e997f4e94491 33 uint8_t ch = 0;
MikamiUitOpen 1:e997f4e94491 34 if ((pin & 0x30) == 0x00) ch = pin;
MikamiUitOpen 1:e997f4e94491 35 if ((pin & 0x30) == 0x10) ch = (pin & 0x01) + 8;
MikamiUitOpen 1:e997f4e94491 36 if ((pin & 0x30) == 0x20) ch = (pin & 0x07) + 10;
MikamiUitOpen 1:e997f4e94491 37 return ch;
MikamiUitOpen 1:e997f4e94491 38 }
MikamiUitOpen 1:e997f4e94491 39
MikamiUitOpen 1:e997f4e94491 40 // for inhibition of copy constructor
MikamiUitOpen 1:e997f4e94491 41 InternalADC(const InternalADC&);
MikamiUitOpen 1:e997f4e94491 42 // for inhibition of substitute operator
MikamiUitOpen 1:e997f4e94491 43 InternalADC& operator=(const InternalADC&);
MikamiUitOpen 1:e997f4e94491 44
MikamiUitOpen 1:e997f4e94491 45 protected:
MikamiUitOpen 1:e997f4e94491 46 // for normalize
MikamiUitOpen 1:e997f4e94491 47 static const float AMP_ = 1.0f/2048.0f;
MikamiUitOpen 1:e997f4e94491 48
MikamiUitOpen 1:e997f4e94491 49 ADC_TypeDef* const myAdc_;
MikamiUitOpen 1:e997f4e94491 50
MikamiUitOpen 1:e997f4e94491 51 // Wait until completion of AD conversion
MikamiUitOpen 1:e997f4e94491 52 void WaitDone()
MikamiUitOpen 1:e997f4e94491 53 { while((myAdc_->SR & ADC_SR_EOC) == RESET); }
MikamiUitOpen 1:e997f4e94491 54
MikamiUitOpen 1:e997f4e94491 55 public:
MikamiUitOpen 1:e997f4e94491 56
MikamiUitOpen 1:e997f4e94491 57 // Constructor
MikamiUitOpen 1:e997f4e94491 58 // pin1: Pin Name for input as A0, A1, etc.
MikamiUitOpen 1:e997f4e94491 59 // pin2: If use 2nd channel set this parameter
MikamiUitOpen 1:e997f4e94491 60 // pin3: If use 3rd channel set this parameter
MikamiUitOpen 1:e997f4e94491 61 InternalADC(PinName pin1, PinName pin2 = NC, PinName pin3 = NC);
MikamiUitOpen 1:e997f4e94491 62
MikamiUitOpen 1:e997f4e94491 63 // Set sampling period, specifiying the period in micro-seconds
MikamiUitOpen 1:e997f4e94491 64 void SetSamplingPeriod(int us)
MikamiUitOpen 1:e997f4e94491 65 { timer_.attach_us(this, &InternalADC::SoftStart, us); }
MikamiUitOpen 1:e997f4e94491 66
MikamiUitOpen 1:e997f4e94491 67 // Read ADC with waiting, range: [0, 0x0FFF]
MikamiUitOpen 1:e997f4e94491 68 virtual uint16_t Read_u16()
MikamiUitOpen 1:e997f4e94491 69 {
MikamiUitOpen 1:e997f4e94491 70 WaitDone();
MikamiUitOpen 1:e997f4e94491 71 return myAdc_->DR;
MikamiUitOpen 1:e997f4e94491 72 }
MikamiUitOpen 1:e997f4e94491 73
MikamiUitOpen 1:e997f4e94491 74 // Read ADC with waiting, range: [-1.0f, 1.0f]
MikamiUitOpen 1:e997f4e94491 75 virtual float Read()
MikamiUitOpen 1:e997f4e94491 76 {
MikamiUitOpen 1:e997f4e94491 77 WaitDone();
MikamiUitOpen 1:e997f4e94491 78 return AMP_*((int16_t)myAdc_->DR - 2048);
MikamiUitOpen 1:e997f4e94491 79 }
MikamiUitOpen 1:e997f4e94491 80
MikamiUitOpen 1:e997f4e94491 81 // Select channel
MikamiUitOpen 1:e997f4e94491 82 void Select1stChannel() { myAdc_->SQR3 = ch1_; }
MikamiUitOpen 1:e997f4e94491 83 void Select2ndChannel()
MikamiUitOpen 1:e997f4e94491 84 {
MikamiUitOpen 1:e997f4e94491 85 if (adc2_ == NULL)
MikamiUitOpen 1:e997f4e94491 86 {
MikamiUitOpen 1:e997f4e94491 87 fprintf(stderr, "\r\n2nd channel is not assigned to any pin.\r\n");
MikamiUitOpen 1:e997f4e94491 88 return;
MikamiUitOpen 1:e997f4e94491 89 }
MikamiUitOpen 1:e997f4e94491 90 myAdc_->SQR3 = ch2_;
MikamiUitOpen 1:e997f4e94491 91 }
MikamiUitOpen 1:e997f4e94491 92 void Select3rdChannel()
MikamiUitOpen 1:e997f4e94491 93 {
MikamiUitOpen 1:e997f4e94491 94 if (adc3_ == NULL)
MikamiUitOpen 1:e997f4e94491 95 {
MikamiUitOpen 1:e997f4e94491 96 fprintf(stderr, "\r\n3rd channel is not assigned to any pin.\r\n");
MikamiUitOpen 1:e997f4e94491 97 return;
MikamiUitOpen 1:e997f4e94491 98 }
MikamiUitOpen 1:e997f4e94491 99 myAdc_->SQR3 = ch3_;
MikamiUitOpen 1:e997f4e94491 100 }
MikamiUitOpen 1:e997f4e94491 101
MikamiUitOpen 1:e997f4e94491 102 // Software start
MikamiUitOpen 1:e997f4e94491 103 void SoftStart()
MikamiUitOpen 1:e997f4e94491 104 { myAdc_->CR2 |= ADC_CR2_SWSTART; }
MikamiUitOpen 1:e997f4e94491 105
MikamiUitOpen 1:e997f4e94491 106 uint32_t ReadSQR3() { return myAdc_->SQR3; }
MikamiUitOpen 1:e997f4e94491 107 };
MikamiUitOpen 1:e997f4e94491 108 }
MikamiUitOpen 1:e997f4e94491 109 #endif // INTERNAL_ADC_HPP