my library for elec350

Dependencies:   mbed

Committer:
spanesar
Date:
Wed Oct 19 20:33:20 2016 +0000
Revision:
3:d62097c19a4e
added microphone files;

Who changed what in which revision?

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