Versão sem FFT e aquisição por DMA. 256 amostras.
Dependencies: EthernetInterface NTPClient mbed-rtos mbed
Codes/Capture.cpp@0:e57bc370d339, 2016-01-05 (annotated)
- Committer:
- rebonatto
- Date:
- Tue Jan 05 11:45:44 2016 +0000
- Revision:
- 0:e57bc370d339
Vers?o est?vel sem calculo de FFT. Aquisi??o por DMA. Usa 256 amostras.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rebonatto | 0:e57bc370d339 | 1 | /* |
rebonatto | 0:e57bc370d339 | 2 | * Capture.h |
rebonatto | 0:e57bc370d339 | 3 | * |
rebonatto | 0:e57bc370d339 | 4 | * Created on: |
rebonatto | 0:e57bc370d339 | 5 | * Author: |
rebonatto | 0:e57bc370d339 | 6 | */ |
rebonatto | 0:e57bc370d339 | 7 | #include "Capture.h" |
rebonatto | 0:e57bc370d339 | 8 | |
rebonatto | 0:e57bc370d339 | 9 | Semaphore Capture::m_CaptureSemaphore(1); //used to alert the capture thread about a ready capture |
rebonatto | 0:e57bc370d339 | 10 | int Capture::m_BufferIndex; |
rebonatto | 0:e57bc370d339 | 11 | |
rebonatto | 0:e57bc370d339 | 12 | __attribute((section("AHBSRAM1"),aligned)) dmaLinkedListNode Capture::m_Nodes[2];// __attribute__((section("AHBSRAM0"))); //this list holds the buffer configuration for the DMA peripheral |
rebonatto | 0:e57bc370d339 | 13 | __attribute((section("AHBSRAM1"),aligned)) unsigned short int Capture::m_AdcBuffers[2][NUMBER_OF_SAMPLES][NUMBER_OF_CHANNELS];// __attribute__((section("AHBSRAM0"))); |
rebonatto | 0:e57bc370d339 | 14 | Serial rfid_serial(p28,p27); |
rebonatto | 0:e57bc370d339 | 15 | |
rebonatto | 0:e57bc370d339 | 16 | //This function prepares the capture buffers and starts the DMA peripheral |
rebonatto | 0:e57bc370d339 | 17 | void Capture::Start() |
rebonatto | 0:e57bc370d339 | 18 | { |
rebonatto | 0:e57bc370d339 | 19 | m_Nodes[0].destAddr = (unsigned int)m_AdcBuffers[0];// HERE GOES THE BUFFER ADDRESS(unsigned int)adval; |
rebonatto | 0:e57bc370d339 | 20 | m_Nodes[0].sourceAddr = (unsigned int)&LPC_ADC->ADGDR; |
rebonatto | 0:e57bc370d339 | 21 | m_Nodes[0].dmaControl = (NUMBER_OF_SAMPLES*NUMBER_OF_CHANNELS)| DMA_DST_WIDTH_HALFWORD | DMA_SRC_WIDTH_HALFWORD | DMA_DST_INCREMENT | DMA_TC_INT; |
rebonatto | 0:e57bc370d339 | 22 | m_Nodes[0].nextNode = (unsigned int)&m_Nodes[1]; |
rebonatto | 0:e57bc370d339 | 23 | |
rebonatto | 0:e57bc370d339 | 24 | m_Nodes[1].destAddr = (unsigned int)m_AdcBuffers[1];// HERE GOES THE BUFFER ADDRESS(unsigned int)adval2; |
rebonatto | 0:e57bc370d339 | 25 | m_Nodes[1].sourceAddr = (unsigned int)&LPC_ADC->ADGDR; |
rebonatto | 0:e57bc370d339 | 26 | m_Nodes[1].dmaControl = (NUMBER_OF_SAMPLES*NUMBER_OF_CHANNELS)| DMA_DST_WIDTH_HALFWORD | DMA_SRC_WIDTH_HALFWORD | DMA_DST_INCREMENT | DMA_TC_INT; |
rebonatto | 0:e57bc370d339 | 27 | m_Nodes[1].nextNode = (unsigned int)&m_Nodes[0]; |
rebonatto | 0:e57bc370d339 | 28 | |
rebonatto | 0:e57bc370d339 | 29 | m_BufferIndex=0; |
rebonatto | 0:e57bc370d339 | 30 | |
rebonatto | 0:e57bc370d339 | 31 | while(!(LPC_ADC->ADDR0&(1U<<31))); //waits the completion of the ADC Channel 0 capture - for synchronization purposes |
rebonatto | 0:e57bc370d339 | 32 | while(!(LPC_ADC->ADDR0&(1U<<31))); //waits the completion of the ADC Channel 0 capture - for synchronization purposes |
rebonatto | 0:e57bc370d339 | 33 | |
rebonatto | 0:e57bc370d339 | 34 | setup_channel(&m_Nodes[0],0,DMA_PERIPHERAL_ADC,DMA_MEMORY); |
rebonatto | 0:e57bc370d339 | 35 | } |
rebonatto | 0:e57bc370d339 | 36 | |
rebonatto | 0:e57bc370d339 | 37 | //This function initializes the ADC and DMA peripherals |
rebonatto | 0:e57bc370d339 | 38 | void Capture::Initialize() |
rebonatto | 0:e57bc370d339 | 39 | { |
rebonatto | 0:e57bc370d339 | 40 | //printf("0x%lx\n", LargeBuffer); |
rebonatto | 0:e57bc370d339 | 41 | init_adc(FREQBASE*NUMBER_OF_SAMPLES*NUMBER_OF_CHANNELS); |
rebonatto | 0:e57bc370d339 | 42 | select_channels(ADC_CH_0|ADC_CH_1|ADC_CH_2|ADC_CH_3|ADC_CH_4|ADC_CH_5); |
rebonatto | 0:e57bc370d339 | 43 | LPC_ADC->ADCR |= ADC_MODE_BURST; |
rebonatto | 0:e57bc370d339 | 44 | |
rebonatto | 0:e57bc370d339 | 45 | init_dma(); |
rebonatto | 0:e57bc370d339 | 46 | |
rebonatto | 0:e57bc370d339 | 47 | Start(); |
rebonatto | 0:e57bc370d339 | 48 | |
rebonatto | 0:e57bc370d339 | 49 | m_CaptureSemaphore.wait(); |
rebonatto | 0:e57bc370d339 | 50 | } |
rebonatto | 0:e57bc370d339 | 51 | |
rebonatto | 0:e57bc370d339 | 52 | void Capture::Stop() |
rebonatto | 0:e57bc370d339 | 53 | { |
rebonatto | 0:e57bc370d339 | 54 | m_CaptureSemaphore.release(); //release semaphore |
rebonatto | 0:e57bc370d339 | 55 | stop_channel(); |
rebonatto | 0:e57bc370d339 | 56 | } |
rebonatto | 0:e57bc370d339 | 57 | |
rebonatto | 0:e57bc370d339 | 58 | void Capture::Wait() |
rebonatto | 0:e57bc370d339 | 59 | { |
rebonatto | 0:e57bc370d339 | 60 | m_CaptureSemaphore.wait(osWaitForever); |
rebonatto | 0:e57bc370d339 | 61 | } |
rebonatto | 0:e57bc370d339 | 62 | |
rebonatto | 0:e57bc370d339 | 63 | unsigned short int Capture::GetValue(int nsamples, int nchannel) |
rebonatto | 0:e57bc370d339 | 64 | { |
rebonatto | 0:e57bc370d339 | 65 | return ADC_CONVERT(m_AdcBuffers[m_BufferIndex][nsamples][nchannel]); |
rebonatto | 0:e57bc370d339 | 66 | } |
rebonatto | 0:e57bc370d339 | 67 | |
rebonatto | 0:e57bc370d339 | 68 | void Capture::CopyBuffer(int channel, short int *dest) |
rebonatto | 0:e57bc370d339 | 69 | { |
rebonatto | 0:e57bc370d339 | 70 | for(int i=0;i<NUMBER_OF_SAMPLES;i++) |
rebonatto | 0:e57bc370d339 | 71 | { |
rebonatto | 0:e57bc370d339 | 72 | dest[i] = GetValue(i,channel); |
rebonatto | 0:e57bc370d339 | 73 | } |
rebonatto | 0:e57bc370d339 | 74 | } |
rebonatto | 0:e57bc370d339 | 75 | |
rebonatto | 0:e57bc370d339 | 76 | |
rebonatto | 0:e57bc370d339 | 77 | void Capture::CopyBufferFloat(int channel, float *dest) |
rebonatto | 0:e57bc370d339 | 78 | { |
rebonatto | 0:e57bc370d339 | 79 | for(int i=0;i<NUMBER_OF_SAMPLES;i++) |
rebonatto | 0:e57bc370d339 | 80 | { |
rebonatto | 0:e57bc370d339 | 81 | dest[i] = (float) GetValue(i,channel); |
rebonatto | 0:e57bc370d339 | 82 | } |
rebonatto | 0:e57bc370d339 | 83 | } |
rebonatto | 0:e57bc370d339 | 84 | |
rebonatto | 0:e57bc370d339 | 85 | //DMA ISR signals the capture thread about the end of capture event |
rebonatto | 0:e57bc370d339 | 86 | extern "C" void DMA_IRQHandler(void) |
rebonatto | 0:e57bc370d339 | 87 | { |
rebonatto | 0:e57bc370d339 | 88 | Capture::ISRHandler(); |
rebonatto | 0:e57bc370d339 | 89 | } |
rebonatto | 0:e57bc370d339 | 90 | |
rebonatto | 0:e57bc370d339 | 91 | void Capture::ISRHandler() |
rebonatto | 0:e57bc370d339 | 92 | { |
rebonatto | 0:e57bc370d339 | 93 | Capture::m_BufferIndex = (~Capture::m_BufferIndex)&1; |
rebonatto | 0:e57bc370d339 | 94 | |
rebonatto | 0:e57bc370d339 | 95 | Capture::m_CaptureSemaphore.release(); |
rebonatto | 0:e57bc370d339 | 96 | LPC_GPDMA->DMACIntTCClear = 0xFF; |
rebonatto | 0:e57bc370d339 | 97 | } |
rebonatto | 0:e57bc370d339 | 98 | /* |
rebonatto | 0:e57bc370d339 | 99 | bool Capture::ReadRFID(int channel,char *rfid) |
rebonatto | 0:e57bc370d339 | 100 | { |
rebonatto | 0:e57bc370d339 | 101 | |
rebonatto | 0:e57bc370d339 | 102 | char cmd[4]; |
rebonatto | 0:e57bc370d339 | 103 | cmd[0] = 'S'; |
rebonatto | 0:e57bc370d339 | 104 | cmd[1] = '0'+channel; |
rebonatto | 0:e57bc370d339 | 105 | cmd[2] = '\n'; |
rebonatto | 0:e57bc370d339 | 106 | cmd[3] = '\0'; |
rebonatto | 0:e57bc370d339 | 107 | |
rebonatto | 0:e57bc370d339 | 108 | //send |
rebonatto | 0:e57bc370d339 | 109 | rfid_serial.puts(cmd); |
rebonatto | 0:e57bc370d339 | 110 | |
rebonatto | 0:e57bc370d339 | 111 | //receive |
rebonatto | 0:e57bc370d339 | 112 | char ch=0; |
rebonatto | 0:e57bc370d339 | 113 | char ans[10]; |
rebonatto | 0:e57bc370d339 | 114 | int cnt=0; |
rebonatto | 0:e57bc370d339 | 115 | int tmout=1000; |
rebonatto | 0:e57bc370d339 | 116 | while(ch != '\n' && tmout-- && cnt<9) |
rebonatto | 0:e57bc370d339 | 117 | { |
rebonatto | 0:e57bc370d339 | 118 | if(rfid_serial.readable()) |
rebonatto | 0:e57bc370d339 | 119 | { |
rebonatto | 0:e57bc370d339 | 120 | ch = rfid_serial.getc(); |
rebonatto | 0:e57bc370d339 | 121 | if(!((ch>='0' && ch<='9') || (ch >= 'A' && ch <= 'F')))ch='0'; |
rebonatto | 0:e57bc370d339 | 122 | ans[cnt++] = ch; |
rebonatto | 0:e57bc370d339 | 123 | } |
rebonatto | 0:e57bc370d339 | 124 | else |
rebonatto | 0:e57bc370d339 | 125 | wait_ms(1); |
rebonatto | 0:e57bc370d339 | 126 | |
rebonatto | 0:e57bc370d339 | 127 | } |
rebonatto | 0:e57bc370d339 | 128 | if (cnt > 0){ |
rebonatto | 0:e57bc370d339 | 129 | ans[cnt-1] = '\0'; |
rebonatto | 0:e57bc370d339 | 130 | for(int i=0;i<10;i++) |
rebonatto | 0:e57bc370d339 | 131 | rfid[i] = ans[i]; |
rebonatto | 0:e57bc370d339 | 132 | return true; |
rebonatto | 0:e57bc370d339 | 133 | } |
rebonatto | 0:e57bc370d339 | 134 | return false; |
rebonatto | 0:e57bc370d339 | 135 | |
rebonatto | 0:e57bc370d339 | 136 | } |
rebonatto | 0:e57bc370d339 | 137 | */ |
rebonatto | 0:e57bc370d339 | 138 | |
rebonatto | 0:e57bc370d339 | 139 | void Capture::ReadRFID(int channel,char *rfid) |
rebonatto | 0:e57bc370d339 | 140 | { |
rebonatto | 0:e57bc370d339 | 141 | |
rebonatto | 0:e57bc370d339 | 142 | char cmd[4]; |
rebonatto | 0:e57bc370d339 | 143 | cmd[0] = 'S'; |
rebonatto | 0:e57bc370d339 | 144 | cmd[1] = '0'+channel; |
rebonatto | 0:e57bc370d339 | 145 | cmd[2] = '\n'; |
rebonatto | 0:e57bc370d339 | 146 | cmd[3] = '\0'; |
rebonatto | 0:e57bc370d339 | 147 | |
rebonatto | 0:e57bc370d339 | 148 | //send |
rebonatto | 0:e57bc370d339 | 149 | rfid_serial.puts(cmd); |
rebonatto | 0:e57bc370d339 | 150 | |
rebonatto | 0:e57bc370d339 | 151 | //receive |
rebonatto | 0:e57bc370d339 | 152 | char ch=0; |
rebonatto | 0:e57bc370d339 | 153 | char ans[10]; |
rebonatto | 0:e57bc370d339 | 154 | int cnt=0; |
rebonatto | 0:e57bc370d339 | 155 | int tmout=1000; |
rebonatto | 0:e57bc370d339 | 156 | while(ch != '\n' && tmout-- && cnt<9) |
rebonatto | 0:e57bc370d339 | 157 | { |
rebonatto | 0:e57bc370d339 | 158 | if(rfid_serial.readable()) |
rebonatto | 0:e57bc370d339 | 159 | { |
rebonatto | 0:e57bc370d339 | 160 | ch = rfid_serial.getc(); |
rebonatto | 0:e57bc370d339 | 161 | if(!((ch>='0' && ch<='9') || (ch >= 'A' && ch <= 'F')))ch='0'; |
rebonatto | 0:e57bc370d339 | 162 | ans[cnt++] = ch; |
rebonatto | 0:e57bc370d339 | 163 | } |
rebonatto | 0:e57bc370d339 | 164 | else |
rebonatto | 0:e57bc370d339 | 165 | wait_ms(1); |
rebonatto | 0:e57bc370d339 | 166 | |
rebonatto | 0:e57bc370d339 | 167 | } |
rebonatto | 0:e57bc370d339 | 168 | ans[cnt-1] = '\0'; |
rebonatto | 0:e57bc370d339 | 169 | for(int i=0;i<9;i++) |
rebonatto | 0:e57bc370d339 | 170 | rfid[i] = ans[i]; |
rebonatto | 0:e57bc370d339 | 171 | |
rebonatto | 0:e57bc370d339 | 172 | } |