Oscar Schofield / Mbed 2 deprecated Elec350_OBS

Dependencies:   mbed

Committer:
Oschofield
Date:
Thu Oct 22 10:40:47 2015 +0000
Revision:
5:b6414e3f82d6
added the microphone C++ and h file;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Oschofield 5:b6414e3f82d6 1 #include "microphone.h"
Oschofield 5:b6414e3f82d6 2
Oschofield 5:b6414e3f82d6 3 bool _mic_toggle = false;
Oschofield 5:b6414e3f82d6 4 uint8_t _mic_pulses= 0;
Oschofield 5:b6414e3f82d6 5 uint8_t _mic_pulses_buffered = 0;
Oschofield 5:b6414e3f82d6 6 uint8_t _mic_counter = 0;
Oschofield 5:b6414e3f82d6 7 DigitalIn* _mic_d;
Oschofield 5:b6414e3f82d6 8 DigitalOut* _mic_clk;
Oschofield 5:b6414e3f82d6 9
Oschofield 5:b6414e3f82d6 10 void _mic_timer_int()
Oschofield 5:b6414e3f82d6 11 {
Oschofield 5:b6414e3f82d6 12 // If clock output to mic is low, read data pin and increment
Oschofield 5:b6414e3f82d6 13 // pulse count if it's high.
Oschofield 5:b6414e3f82d6 14 if (!_mic_toggle) {
Oschofield 5:b6414e3f82d6 15 _mic_counter += 1;
Oschofield 5:b6414e3f82d6 16 if (_mic_counter == 0) {
Oschofield 5:b6414e3f82d6 17 _mic_pulses_buffered = _mic_pulses;
Oschofield 5:b6414e3f82d6 18 _mic_pulses = 0;
Oschofield 5:b6414e3f82d6 19 }
Oschofield 5:b6414e3f82d6 20 if (_mic_d->read()) _mic_pulses++;
Oschofield 5:b6414e3f82d6 21 }
Oschofield 5:b6414e3f82d6 22
Oschofield 5:b6414e3f82d6 23 // Toggle clock output to mic
Oschofield 5:b6414e3f82d6 24 _mic_toggle = !_mic_toggle;
Oschofield 5:b6414e3f82d6 25 _mic_clk->write(_mic_toggle);
Oschofield 5:b6414e3f82d6 26
Oschofield 5:b6414e3f82d6 27 // Clear interrupt
Oschofield 5:b6414e3f82d6 28 TIM3->SR &= ~TIM_SR_UIF;
Oschofield 5:b6414e3f82d6 29 }
Oschofield 5:b6414e3f82d6 30
Oschofield 5:b6414e3f82d6 31 Microphone::Microphone()
Oschofield 5:b6414e3f82d6 32 {
Oschofield 5:b6414e3f82d6 33 this->isStarted = false;
Oschofield 5:b6414e3f82d6 34 }
Oschofield 5:b6414e3f82d6 35
Oschofield 5:b6414e3f82d6 36 void Microphone::start()
Oschofield 5:b6414e3f82d6 37 {
Oschofield 5:b6414e3f82d6 38 if (!this->isStarted) {
Oschofield 5:b6414e3f82d6 39 // Two pins: clock to microphone and data from microphone.
Oschofield 5:b6414e3f82d6 40 _mic_d = new DigitalIn(PC_3);
Oschofield 5:b6414e3f82d6 41 _mic_clk = new DigitalOut(PB_10);
Oschofield 5:b6414e3f82d6 42
Oschofield 5:b6414e3f82d6 43 // Use timer 3 to sample from the MP45DT02 microphone.
Oschofield 5:b6414e3f82d6 44
Oschofield 5:b6414e3f82d6 45 // Enable timer.
Oschofield 5:b6414e3f82d6 46 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
Oschofield 5:b6414e3f82d6 47
Oschofield 5:b6414e3f82d6 48 // Scale timer so ticks are 100ns
Oschofield 5:b6414e3f82d6 49 uint32_t PCLK = SystemCoreClock / 4;
Oschofield 5:b6414e3f82d6 50 uint32_t prescale = PCLK / 10000000; // 10Mhz (100ns ticks)
Oschofield 5:b6414e3f82d6 51 TIM3->PSC = prescale - 1;
Oschofield 5:b6414e3f82d6 52
Oschofield 5:b6414e3f82d6 53 // Enable counter
Oschofield 5:b6414e3f82d6 54 TIM3->CR1 |= TIM_CR1_CEN;
Oschofield 5:b6414e3f82d6 55
Oschofield 5:b6414e3f82d6 56 // Set auto-reset after five ticks (500ns).
Oschofield 5:b6414e3f82d6 57 TIM3->ARR = 4;
Oschofield 5:b6414e3f82d6 58
Oschofield 5:b6414e3f82d6 59 // Re-initialize counter.
Oschofield 5:b6414e3f82d6 60 TIM3->EGR |= TIM_EGR_UG;
Oschofield 5:b6414e3f82d6 61
Oschofield 5:b6414e3f82d6 62 // Set up and enable interrupt for when timer overflows.
Oschofield 5:b6414e3f82d6 63 NVIC_SetVector(TIM3_IRQn, (uint32_t)_mic_timer_int);
Oschofield 5:b6414e3f82d6 64 NVIC_EnableIRQ(TIM3_IRQn);
Oschofield 5:b6414e3f82d6 65 TIM3->DIER |= TIM_DIER_UIE;
Oschofield 5:b6414e3f82d6 66 this->isStarted = true;
Oschofield 5:b6414e3f82d6 67 }
Oschofield 5:b6414e3f82d6 68 }
Oschofield 5:b6414e3f82d6 69
Oschofield 5:b6414e3f82d6 70 void Microphone::stop() // Not tested!
Oschofield 5:b6414e3f82d6 71 {
Oschofield 5:b6414e3f82d6 72 if (this->isStarted) {
Oschofield 5:b6414e3f82d6 73 // Disable interrupts.
Oschofield 5:b6414e3f82d6 74 NVIC_SetVector(TIM3_IRQn, (uint32_t)_mic_timer_int);
Oschofield 5:b6414e3f82d6 75 NVIC_DisableIRQ(TIM3_IRQn);
Oschofield 5:b6414e3f82d6 76 TIM3->DIER &= ~TIM_DIER_UIE;
Oschofield 5:b6414e3f82d6 77
Oschofield 5:b6414e3f82d6 78 // Disable counter
Oschofield 5:b6414e3f82d6 79 TIM3->CR1 &= ~TIM_CR1_CEN;
Oschofield 5:b6414e3f82d6 80
Oschofield 5:b6414e3f82d6 81 // Disable timer.
Oschofield 5:b6414e3f82d6 82 RCC->APB1ENR &= ~RCC_APB1ENR_TIM3EN;
Oschofield 5:b6414e3f82d6 83
Oschofield 5:b6414e3f82d6 84 // Clear interrupt
Oschofield 5:b6414e3f82d6 85 TIM3->SR &= ~TIM_SR_UIF;
Oschofield 5:b6414e3f82d6 86
Oschofield 5:b6414e3f82d6 87 delete _mic_d; _mic_d = NULL;
Oschofield 5:b6414e3f82d6 88 delete _mic_clk; _mic_clk = NULL;
Oschofield 5:b6414e3f82d6 89 }
Oschofield 5:b6414e3f82d6 90 }
Oschofield 5:b6414e3f82d6 91
Oschofield 5:b6414e3f82d6 92 int8_t Microphone::read()
Oschofield 5:b6414e3f82d6 93 {
Oschofield 5:b6414e3f82d6 94 if (this->isStarted) {
Oschofield 5:b6414e3f82d6 95 return (int8_t)((uint16_t)_mic_pulses_buffered - 128);
Oschofield 5:b6414e3f82d6 96 } else {
Oschofield 5:b6414e3f82d6 97 return 0;
Oschofield 5:b6414e3f82d6 98 }
Oschofield 5:b6414e3f82d6 99 }
Oschofield 5:b6414e3f82d6 100