Impedance Fast Circuitry Software

Dependencies:   mbed-dsp mbed

Fork of DSP_200kHz by Mazzeo Research Group

Committer:
timmey9
Date:
Sun Jan 25 09:10:24 2015 +0000
Revision:
36:07d8a3143967
Parent:
35:df40c4566826
Child:
37:8bdc71f3e874
DMA0 and DMA1 are working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
timmey9 20:f533b3c9296f 1 // Server code
donatien 0:bb128f0e952f 2 #include "mbed.h"
timmey9 24:a5891669afc5 3 #include <stdio.h>
timmey9 22:523e316cbe70 4
timmey9 22:523e316cbe70 5 // Analog sampling
timmey9 22:523e316cbe70 6 #include "PeripheralNames.h"
timmey9 22:523e316cbe70 7 #include "PeripheralPins.h"
timmey9 22:523e316cbe70 8 #include "fsl_adc_hal.h"
timmey9 22:523e316cbe70 9 #include "fsl_clock_manager.h"
timmey9 22:523e316cbe70 10 #include "fsl_dspi_hal.h"
timmey9 22:523e316cbe70 11 #include "AngleEncoder.h"
timmey9 22:523e316cbe70 12
timmey9 34:44cc9b76a507 13 #include "dma.h"
timmey9 28:4a833d59897b 14
timmey9 22:523e316cbe70 15 // Analog sampling
timmey9 22:523e316cbe70 16 #define MAX_FADC 6000000
timmey9 36:07d8a3143967 17 #define SAMPLING_RATE 10 // In microseconds, so 10 us will be a sampling rate of 100 kHz
timmey9 36:07d8a3143967 18 #define TOTAL_SAMPLES 3 // originally 30000 for 0.3 ms of sampling.
timmey9 22:523e316cbe70 19
timmey9 22:523e316cbe70 20 #define LAST_SAMPLE_INDEX (TOTAL_SAMPLES-1) // If sampling time is 25 us, then 2000 corresponds to 50 ms
timmey9 22:523e316cbe70 21 #define FIRST_SAMPLE_INDEX 0
timmey9 22:523e316cbe70 22 #define BEGIN_SAMPLING 0xFFFFFFFF
timmey9 22:523e316cbe70 23 #define WAITING_TO_BEGIN (BEGIN_SAMPLING-1)
timmey9 22:523e316cbe70 24
timmey9 21:1fb5023b72af 25
timmey9 22:523e316cbe70 26 // for debug purposes
timmey9 18:b17ddeeb1c09 27 Serial pc(USBTX, USBRX);
timmey9 18:b17ddeeb1c09 28 DigitalOut led_red(LED_RED);
timmey9 18:b17ddeeb1c09 29 DigitalOut led_green(LED_GREEN);
timmey9 18:b17ddeeb1c09 30 DigitalOut led_blue(LED_BLUE);
timmey9 18:b17ddeeb1c09 31
timmey9 22:523e316cbe70 32 AngleEncoder angle_encoder(PTD2, PTD3, PTD1, PTD0, 8, 0, 1000000); // mosi, miso, sclk, cs, bit_width, mode, hz
timmey9 22:523e316cbe70 33 DigitalIn AMT20_A(PTC0); // input for quadrature encoding from angle encoder
timmey9 22:523e316cbe70 34 DigitalIn AMT20_B(PTC1); // input for quadrature encoding from angle encoder
timmey9 22:523e316cbe70 35
timmey9 22:523e316cbe70 36 // Analog sampling
timmey9 22:523e316cbe70 37 AnalogIn A0_pin(A0);
timmey9 22:523e316cbe70 38 AnalogIn A2_pin(A2);
timmey9 34:44cc9b76a507 39 Ticker Sampler;
timmey9 22:523e316cbe70 40
timmey9 22:523e316cbe70 41 uint32_t current_sample_index = WAITING_TO_BEGIN;
timmey9 25:abbc19af13f9 42 uint16_t sample_array1[TOTAL_SAMPLES];
timmey9 25:abbc19af13f9 43 uint16_t sample_array2[TOTAL_SAMPLES];
timmey9 22:523e316cbe70 44 uint16_t angle_array[TOTAL_SAMPLES];
timmey9 34:44cc9b76a507 45 float currA0 = 0;
timmey9 34:44cc9b76a507 46 float currA2 = 0;
timmey9 22:523e316cbe70 47
timmey9 22:523e316cbe70 48 // Declaration of functions
timmey9 22:523e316cbe70 49 void analog_initialization(PinName pin);
timmey9 22:523e316cbe70 50 void timed_sampling();
timmey9 22:523e316cbe70 51
timmey9 22:523e316cbe70 52 // Important globabl variables necessary for the sampling every interval
timmey9 22:523e316cbe70 53 int rotary_count = 0;
timmey9 22:523e316cbe70 54 uint32_t last_AMT20_AB_read = 0;
timmey9 23:9e5141647775 55
timmey9 22:523e316cbe70 56 using namespace std;
timmey9 17:2f978f823020 57
emilmont 7:65188f4a8c25 58 int main() {
timmey9 22:523e316cbe70 59 led_blue = 1;
timmey9 35:df40c4566826 60 led_green = 1;
timmey9 18:b17ddeeb1c09 61 led_red = 1;
timmey9 34:44cc9b76a507 62
timmey9 18:b17ddeeb1c09 63 pc.baud(230400);
timmey9 34:44cc9b76a507 64 pc.printf("Starting\r\n");
timmey9 27:8c2b30c855d1 65
timmey9 27:8c2b30c855d1 66 analog_initialization(A0);
timmey9 27:8c2b30c855d1 67 analog_initialization(A2);
timmey9 27:8c2b30c855d1 68
timmey9 36:07d8a3143967 69 // enable the DMA
timmey9 36:07d8a3143967 70 ADC0->SC2 |= ADC_SC2_DMAEN_MASK;
timmey9 36:07d8a3143967 71 ADC1->SC2 |= ADC_SC2_DMAEN_MASK;
timmey9 35:df40c4566826 72 ADC0->SC3 = 0; // Reset SC3
timmey9 36:07d8a3143967 73 ADC1->SC3 = 0; // Reset SC3
timmey9 35:df40c4566826 74
timmey9 36:07d8a3143967 75 dma_init(sample_array1, sample_array2, angle_array, TOTAL_SAMPLES);
timmey9 35:df40c4566826 76 pc.printf("SampleArr: %08x\r\n", &sample_array1);
timmey9 35:df40c4566826 77 uint16_t* dma_csr = (uint16_t*) 0x4000901C;
timmey9 35:df40c4566826 78 uint32_t* dma_daddr = (uint32_t*) 0x40009010;
timmey9 35:df40c4566826 79 *dma_csr |= 1;
timmey9 35:df40c4566826 80
timmey9 27:8c2b30c855d1 81 // Start the sampling loop
timmey9 27:8c2b30c855d1 82 current_sample_index = WAITING_TO_BEGIN;
timmey9 34:44cc9b76a507 83 Sampler.attach_us(&timed_sampling, SAMPLING_RATE);
timmey9 27:8c2b30c855d1 84
timmey9 35:df40c4566826 85 pc.printf("\r\n\r\n\r\n");
timmey9 35:df40c4566826 86
timmey9 34:44cc9b76a507 87 while(1) {
timmey9 36:07d8a3143967 88 rotary_count++;
timmey9 34:44cc9b76a507 89 if(pc.readable() > 0) {
timmey9 34:44cc9b76a507 90 char temp = pc.getc();
timmey9 34:44cc9b76a507 91
timmey9 34:44cc9b76a507 92 switch(temp) {
timmey9 34:44cc9b76a507 93 case 's':
timmey9 35:df40c4566826 94 for(int i = 0; i < TOTAL_SAMPLES; i++) pc.printf("%i: %f\t",i,sample_array1[i]*3.3/65535);
timmey9 36:07d8a3143967 95
timmey9 35:df40c4566826 96 pc.printf("\r\n");
timmey9 34:44cc9b76a507 97 break;
timmey9 34:44cc9b76a507 98 case 'f':
timmey9 34:44cc9b76a507 99 for(int i = 0; i < TOTAL_SAMPLES; i++) sample_array1[i] = 0;
timmey9 34:44cc9b76a507 100 break;
timmey9 34:44cc9b76a507 101
timmey9 34:44cc9b76a507 102 }
timmey9 34:44cc9b76a507 103 }
timmey9 36:07d8a3143967 104 for(int i = 0; i < TOTAL_SAMPLES; i++) pc.printf("A%i: %f ",i,sample_array1[i]*3.3/65535);
timmey9 36:07d8a3143967 105 for(int i = 0; i < TOTAL_SAMPLES; i++) pc.printf("B%i: %f ",i,sample_array2[i]*3.3/65535);
timmey9 36:07d8a3143967 106 for(int i = 0; i < TOTAL_SAMPLES; i++) pc.printf("C%i: %i ",i,angle_array[i]);
timmey9 35:df40c4566826 107 pc.printf("\r");
timmey9 35:df40c4566826 108 //pc.printf("DMA_DADDR: %08x \r", *dma_daddr);
timmey9 35:df40c4566826 109 //pc.printf("A1: %f\tA2: %f\r\n", currA0, currA2);
timmey9 34:44cc9b76a507 110 wait(1);
timmey9 17:2f978f823020 111 }
timmey9 22:523e316cbe70 112
timmey9 34:44cc9b76a507 113
timmey9 22:523e316cbe70 114 }
timmey9 23:9e5141647775 115
timmey9 22:523e316cbe70 116 void timed_sampling() {
timmey9 35:df40c4566826 117
timmey9 35:df40c4566826 118 // Write to SC1A to start conversion with channel 12 PTB2
timmey9 35:df40c4566826 119 //ADC0_SC1A = (ADC_SC1_ADCH(ADC_CHANNEL) | (ADC0_SC1A & (ADC_SC1_AIEN_MASK | ADC_SC1_DIFF_MASK)));
timmey9 35:df40c4566826 120
timmey9 35:df40c4566826 121 //__disable_irq(); // Disable Interrupts
timmey9 34:44cc9b76a507 122
timmey9 34:44cc9b76a507 123
timmey9 22:523e316cbe70 124 // The following performs analog-to-digital conversions - first reading the last conversion - then initiating another
timmey9 35:df40c4566826 125 //uint32_t A0_value = adc_hal_get_conversion_value(0, 0); // ADC0_RA
timmey9 35:df40c4566826 126 //uint32_t A2_value = adc_hal_get_conversion_value(1, 0);
timmey9 35:df40c4566826 127
timmey9 35:df40c4566826 128
timmey9 22:523e316cbe70 129 BW_ADC_SC1n_ADCH(0, 0, kAdcChannel12); // This corresponds to starting an ADC conversion on channel 12 of ADC 0 - which is A0 (PTB2)
timmey9 22:523e316cbe70 130 BW_ADC_SC1n_ADCH(1, 0, kAdcChannel14); // This corresponds to starting an ADC conversion on channel 14 of ADC 1 - which is A2 (PTB10)
timmey9 22:523e316cbe70 131
timmey9 35:df40c4566826 132 /*
timmey9 34:44cc9b76a507 133 currA0 = (float) A0_value*3.3/65535;
timmey9 34:44cc9b76a507 134 currA2 = (float) A2_value*3.3/65535;
timmey9 36:07d8a3143967 135 */
timmey9 35:df40c4566826 136
timmey9 22:523e316cbe70 137 // The following updates the rotary counter for the AMT20 sensor
timmey9 22:523e316cbe70 138 // Put A on PTC0
timmey9 22:523e316cbe70 139 // Put B on PTC1
timmey9 22:523e316cbe70 140 uint32_t AMT20_AB = HW_GPIO_PDIR_RD(HW_PORTC) & 0x03;
timmey9 22:523e316cbe70 141 if (AMT20_AB != last_AMT20_AB_read)
timmey9 22:523e316cbe70 142 {
timmey9 22:523e316cbe70 143 // change "INVERT_ANGLE" to change whether relative angle counts up or down.
timmey9 22:523e316cbe70 144 if ((AMT20_AB >> 1)^(last_AMT20_AB_read) & 1U)
timmey9 22:523e316cbe70 145 #if INVERT_ANGLE == 1
timmey9 22:523e316cbe70 146 {rotary_count--;}
timmey9 22:523e316cbe70 147 else
timmey9 22:523e316cbe70 148 {rotary_count++;}
timmey9 22:523e316cbe70 149 #else
timmey9 22:523e316cbe70 150 {rotary_count++;}
timmey9 22:523e316cbe70 151 else
timmey9 22:523e316cbe70 152 {rotary_count--;}
timmey9 22:523e316cbe70 153 #endif
timmey9 22:523e316cbe70 154
timmey9 22:523e316cbe70 155 last_AMT20_AB_read = AMT20_AB;
timmey9 22:523e316cbe70 156 }
timmey9 36:07d8a3143967 157 /*
timmey9 22:523e316cbe70 158 //current_sample_index = BEGIN_SAMPLING; // Used to force extra time.
timmey9 22:523e316cbe70 159 if (current_sample_index == WAITING_TO_BEGIN) {}
timmey9 22:523e316cbe70 160 else
timmey9 28:4a833d59897b 161 {
timmey9 22:523e316cbe70 162 if (current_sample_index == BEGIN_SAMPLING) {
timmey9 22:523e316cbe70 163 current_sample_index = FIRST_SAMPLE_INDEX;
timmey9 22:523e316cbe70 164 }
timmey9 22:523e316cbe70 165
timmey9 27:8c2b30c855d1 166 sample_array1[current_sample_index] = A0_value;
timmey9 27:8c2b30c855d1 167 sample_array2[current_sample_index] = A2_value;
timmey9 22:523e316cbe70 168 angle_array[current_sample_index] = rotary_count;
timmey9 22:523e316cbe70 169
timmey9 22:523e316cbe70 170 if (current_sample_index == LAST_SAMPLE_INDEX) {
timmey9 22:523e316cbe70 171 current_sample_index = WAITING_TO_BEGIN;
timmey9 22:523e316cbe70 172 }
timmey9 22:523e316cbe70 173 else { current_sample_index++; }
timmey9 28:4a833d59897b 174 }
timmey9 35:df40c4566826 175 */
timmey9 35:df40c4566826 176 //__enable_irq(); // Enable Interrupts
timmey9 22:523e316cbe70 177 }
timmey9 22:523e316cbe70 178
timmey9 22:523e316cbe70 179 void analog_initialization(PinName pin)
timmey9 22:523e316cbe70 180 {
timmey9 22:523e316cbe70 181 ADCName adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
timmey9 22:523e316cbe70 182 // MBED_ASSERT(adc != (ADCName)NC);
timmey9 22:523e316cbe70 183
timmey9 22:523e316cbe70 184 uint32_t instance = adc >> ADC_INSTANCE_SHIFT;
timmey9 22:523e316cbe70 185
timmey9 22:523e316cbe70 186 clock_manager_set_gate(kClockModuleADC, instance, true);
timmey9 22:523e316cbe70 187
timmey9 22:523e316cbe70 188 uint32_t bus_clock;
timmey9 22:523e316cbe70 189 clock_manager_get_frequency(kBusClock, &bus_clock);
timmey9 22:523e316cbe70 190 uint32_t clkdiv;
timmey9 22:523e316cbe70 191 for (clkdiv = 0; clkdiv < 4; clkdiv++) {
timmey9 22:523e316cbe70 192 if ((bus_clock >> clkdiv) <= MAX_FADC)
timmey9 22:523e316cbe70 193 break;
timmey9 22:523e316cbe70 194 }
timmey9 22:523e316cbe70 195 if (clkdiv == 4) {
timmey9 22:523e316cbe70 196 clkdiv = 0x7; //Set max div
timmey9 22:523e316cbe70 197 }
timmey9 22:523e316cbe70 198 // adc is enabled/triggered when reading.
timmey9 22:523e316cbe70 199 adc_hal_set_clock_source_mode(instance, (adc_clock_source_mode_t)(clkdiv >> 2));
timmey9 22:523e316cbe70 200 adc_hal_set_clock_divider_mode(instance, (adc_clock_divider_mode_t)(clkdiv & 0x3));
timmey9 22:523e316cbe70 201 adc_hal_set_reference_voltage_mode(instance, kAdcVoltageVref);
timmey9 22:523e316cbe70 202 adc_hal_set_resolution_mode(instance, kAdcSingleDiff16);
timmey9 22:523e316cbe70 203 adc_hal_configure_continuous_conversion(instance, false);
timmey9 22:523e316cbe70 204 adc_hal_configure_hw_trigger(instance, false); // sw trigger
timmey9 22:523e316cbe70 205 adc_hal_configure_hw_average(instance, false);
timmey9 22:523e316cbe70 206 adc_hal_set_hw_average_mode(instance, kAdcHwAverageCount4);
timmey9 22:523e316cbe70 207 adc_hal_set_group_mux(instance, kAdcChannelMuxB); // only B channels are avail
timmey9 22:523e316cbe70 208
timmey9 22:523e316cbe70 209 pinmap_pinout(pin, PinMap_ADC);
timmey9 35:df40c4566826 210 }
timmey9 35:df40c4566826 211
timmey9 35:df40c4566826 212
timmey9 35:df40c4566826 213
timmey9 35:df40c4566826 214 /*
timmey9 35:df40c4566826 215 // read some registers for some info.
timmey9 35:df40c4566826 216 uint32_t* dma_cr = (uint32_t*) 0x40008000;
timmey9 35:df40c4566826 217 pc.printf("DMA_CR: %08x\r\n", *dma_cr);
timmey9 35:df40c4566826 218
timmey9 35:df40c4566826 219 uint32_t* dma_eei = (uint32_t*) 0x40008014;
timmey9 35:df40c4566826 220 pc.printf("DMA_EEI: %08x\r\n", *dma_eei);
timmey9 35:df40c4566826 221
timmey9 35:df40c4566826 222 uint32_t* dma_erq = (uint32_t*) 0x4000800C;
timmey9 35:df40c4566826 223 pc.printf("DMA_ERQ: %08x\r\n", *dma_erq);
timmey9 35:df40c4566826 224
timmey9 35:df40c4566826 225 uint16_t* dma_csr = (uint16_t*) 0x4000901C;
timmey9 35:df40c4566826 226 pc.printf("DMA_TD0_CSR: %04x\r\n\n", *dma_csr);
timmey9 35:df40c4566826 227
timmey9 35:df40c4566826 228 uint32_t* dma_saddr = (uint32_t*) 0x40009000;
timmey9 35:df40c4566826 229 pc.printf("DMA_SAADR: %08x\r\n", *dma_saddr);
timmey9 35:df40c4566826 230
timmey9 35:df40c4566826 231 uint16_t* dma_soff = (uint16_t*) 0x40009004;
timmey9 35:df40c4566826 232 pc.printf("DMA_SOFF: %04x\r\n", *dma_soff);
timmey9 35:df40c4566826 233
timmey9 35:df40c4566826 234 uint16_t* dma_attr = (uint16_t*) 0x40009006;
timmey9 35:df40c4566826 235 pc.printf("DMA_ATTR: %04x\r\n", *dma_attr);
timmey9 35:df40c4566826 236
timmey9 35:df40c4566826 237 uint32_t* dma_minor = (uint32_t*) 0x40009008;
timmey9 35:df40c4566826 238 pc.printf("DMA_MINOR: %08x\r\n", *dma_minor);
timmey9 35:df40c4566826 239
timmey9 35:df40c4566826 240 uint32_t* dma_daddr = (uint32_t*) 0x40009010;
timmey9 35:df40c4566826 241 pc.printf("DMA_DADDR: %08x\r\n", *dma_daddr);
timmey9 35:df40c4566826 242
timmey9 35:df40c4566826 243
timmey9 35:df40c4566826 244 // read some registers for some info.
timmey9 35:df40c4566826 245 pc.printf("DMA_CR: %08x\r\n", *dma_cr);
timmey9 35:df40c4566826 246 pc.printf("DMA_EEI: %08x\r\n", *dma_eei);
timmey9 35:df40c4566826 247 pc.printf("DMA_ERQ: %08x\r\n", *dma_erq);
timmey9 35:df40c4566826 248 pc.printf("DMA_TD0_CSR: %04x\r\n\n", *dma_csr);
timmey9 35:df40c4566826 249 pc.printf("DMA_SAADR: %08x\r\n", *dma_saddr);
timmey9 35:df40c4566826 250 pc.printf("DMA_SOFF: %04x\r\n", *dma_soff);
timmey9 35:df40c4566826 251 pc.printf("DMA_ATTR: %04x\r\n", *dma_attr);
timmey9 35:df40c4566826 252 pc.printf("DMA_MINOR: %08x\r\n", *dma_minor);
timmey9 35:df40c4566826 253 pc.printf("DMA_DADDR: %08x\r\n", *dma_daddr);
timmey9 35:df40c4566826 254 pc.printf("SampleArr: %08x\r\n",&sample_array1);
timmey9 35:df40c4566826 255 */