Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
microphone.cpp@5:b6414e3f82d6, 2015-10-22 (annotated)
- 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?
User | Revision | Line number | New 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 |