Versão sem FFT e aquisição por DMA. 256 amostras.

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }