![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versão do protegemed que calcula o tempo em ms da fuga, calcula o numero de onverflow (valores muito baixo) e underflow (valores muito altos). Além disso, calcula um valor médio a partir dos valores capturados e não apenas pela fft.
Dependencies: EthernetInterface mbed-rtos mbed
Diff: Codes/Capture.cpp
- Revision:
- 0:c64e1194230b
- Child:
- 1:917ca6b5d9d9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Codes/Capture.cpp Wed Jul 09 21:16:23 2014 +0000 @@ -0,0 +1,85 @@ +/* + * Capture.h + * + * Created on: + * Author: + */ +#include "Capture.h" + +Semaphore Capture::m_CaptureSemaphore(1); //used to alert the capture thread about a ready capture +int Capture::m_BufferIndex; +dmaLinkedListNode Capture::m_Nodes[2] __attribute__((section("AHBSRAM0"))); //this list holds the buffer configuration for the DMA peripheral +unsigned short int Capture::m_AdcBuffers[2][NUMBER_OF_SAMPLES][NUMBER_OF_CHANNELS] __attribute__((section("AHBSRAM0"))); + +//This function prepares the capture buffers and starts the DMA peripheral +void Capture::Start() +{ + m_Nodes[0].destAddr = (unsigned int)m_AdcBuffers[0];// HERE GOES THE BUFFER ADDRESS(unsigned int)adval; + m_Nodes[0].sourceAddr = (unsigned int)&LPC_ADC->ADGDR; + m_Nodes[0].dmaControl = (NUMBER_OF_SAMPLES*NUMBER_OF_CHANNELS)| DMA_DST_WIDTH_HALFWORD | DMA_SRC_WIDTH_HALFWORD | DMA_DST_INCREMENT | DMA_TC_INT; + m_Nodes[0].nextNode = (unsigned int)&m_Nodes[1]; + + m_Nodes[1].destAddr = (unsigned int)m_AdcBuffers[1];// HERE GOES THE BUFFER ADDRESS(unsigned int)adval2; + m_Nodes[1].sourceAddr = (unsigned int)&LPC_ADC->ADGDR; + m_Nodes[1].dmaControl = (NUMBER_OF_SAMPLES*NUMBER_OF_CHANNELS)| DMA_DST_WIDTH_HALFWORD | DMA_SRC_WIDTH_HALFWORD | DMA_DST_INCREMENT | DMA_TC_INT; + m_Nodes[1].nextNode = (unsigned int)&m_Nodes[0]; + + m_BufferIndex=0; + + while(!(LPC_ADC->ADDR0&(1U<<31))); //waits the completion of the ADC Channel 0 capture - for synchronization purposes + while(!(LPC_ADC->ADDR0&(1U<<31))); //waits the completion of the ADC Channel 0 capture - for synchronization purposes + + setup_channel(&m_Nodes[0],0,DMA_PERIPHERAL_ADC,DMA_MEMORY); +} + +//This function initializes the ADC and DMA peripherals +void Capture::Initialize() +{ + init_adc(Settings::get_FreqBase()*NUMBER_OF_SAMPLES*NUMBER_OF_CHANNELS); + select_channels(ADC_CH_0|ADC_CH_1|ADC_CH_2|ADC_CH_3|ADC_CH_4|ADC_CH_5); + LPC_ADC->ADCR |= ADC_MODE_BURST; + + init_dma(); + + Start(); + + m_CaptureSemaphore.wait(); +} + +void Capture::Stop() +{ + m_CaptureSemaphore.release(); //release semaphore + stop_channel(); +} + +void Capture::Wait() +{ + m_CaptureSemaphore.wait(osWaitForever); +} + +unsigned short int Capture::GetValue(int nsamples, int nchannel) +{ + return ADC_CONVERT(m_AdcBuffers[m_BufferIndex][nsamples][nchannel]); +} + +void Capture::CopyBuffer(int channel, unsigned short int *dest) +{ + for(int i=0;i<Settings::get_Samples();i++) + { + dest[i] = GetValue(i,channel); + } +} + +//DMA ISR signals the capture thread about the end of capture event +extern "C" void DMA_IRQHandler(void) +{ + Capture::ISRHandler(); +} + +void Capture::ISRHandler() +{ + Capture::m_BufferIndex = (~Capture::m_BufferIndex)&1; + + Capture::m_CaptureSemaphore.release(); + LPC_GPDMA->DMACIntTCClear = 0xFF; +} \ No newline at end of file