DCS_TEAM / Mbed 2 deprecated Chemical_Sensor_DMA

Dependencies:   mbed

Dependents:   DCS_FINAL_CODE

Fork of Chemical_Sensor_DMA by Jared Baxter

main.cpp

Committer:
baxterja
Date:
2015-10-29
Revision:
2:3771b3195c7b
Parent:
1:f0a5690db73f
Child:
3:a85b742be262

File content as of revision 2:3771b3195c7b:

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *      
 *         
 *          Pinout for FRDM-k64f                                    
 *                                  J2
 *                                  X X 
 *                                  X X 
 *                                  X X 
 *          J3                      X X GND
 *          X X                     X X SCLK
 *          X X                     X X MISO
 *          X X                     X X MOSI
 *          X X                     X X CS
 *          X X                 GND X X 
 *      GND X X                     X X 
 *      GND X X                         
 *     5Vin X X                     J1  
 *                                  X X 
 *          J4                      X X motorA
 *          X X                     X X motorB
 *     mic1 X X                     X X 
 *     mic2 X X                     X X 
 *          X X                     X X 
 *          X X               quadA X X 
 *          X X               quadB X X 
 *  
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "mbed.h"
#include "pause.cpp"

// Sampling
#include "Sample/adc.h"
#include "Sample/pdb.h"
#include "Sample/quad.h"

#include "AngleEncoder.h"
#include "MotorControl.h"

// for debug purposes
Serial pc(USBTX, USBRX);
DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);
DigitalOut led_blue(LED_BLUE);
//DigitalIn switch1(PTA4);
//DigitalIn switch2(PTC6);
//DigitalOut TotalInd(PTC4);
//DigitalOut SampleInd(PTC5);

MotorControl motor(PTC2, PTA2, 2000, 25); // cw, ccw, period_us, safetyPeriod_us
AngleEncoder angle_encoder(PTD2, PTD3, PTD1, PTD0, 8, 0, 1000000); // mosi, miso, sclk, cs, bit_width, mode, hz

// defined in dma.cpp
extern int len;
extern uint16_t sample_array0[];
extern uint16_t sample_array1[];
extern uint16_t angle_array[];
extern bool dma_done;
extern bool dma_half_done;

int motorVal = 10;

// Declaration of functions
void output_data();

Timer t1;
using namespace std;
 
int main() {
    
    led_blue = 1;
    led_green = 1;
    led_red = 1;
    
    pc.baud(230400);
    pc.printf("Starting...\r\n");
    
    for(int i = 0; i < 86; i++) 
    {
        if(NVIC_GetPriority((IRQn_Type) i) == 0) NVIC_SetPriority((IRQn_Type) i, 2);
    }
    
    // Give hardware associated with 
    // sampling the highest priority
    NVIC_SetPriority(ADC1_IRQn,0);
    NVIC_SetPriority(ADC0_IRQn,0);
    NVIC_SetPriority(PDB0_IRQn,0);
    NVIC_SetPriority(DMA0_IRQn,0);
    NVIC_SetPriority(DMA1_IRQn,0);
    NVIC_SetPriority(DMA2_IRQn,0);
    
    NVIC_SetPriority(ENET_1588_Timer_IRQn,1);
    NVIC_SetPriority(ENET_Transmit_IRQn,1);
    NVIC_SetPriority(ENET_Receive_IRQn,1);
    NVIC_SetPriority(ENET_Error_IRQn,1);
    
    //quad_init(); // initialize FTM2 quadrature decoder
    //quad_invert(); // invert the direction of counting
    adc_init(); // initialize ADCs (always initialize adc before dma)
    dma_init(); // initializes DMAs
    pdb_init(); // initialize PDB0 as the timer for ADCs and DMA2 
    
    // flash green led indicating startup complete
    led_red = 1;
    led_blue = 1;
    led_green = 0;
    pause_ms(500);
    led_green = 1;
    pause_ms(200);
    led_green = 0;
    pause_ms(500);
    led_green = 1;
    pdb_start();
    t1.start();
    t1.reset();
    int startAddress = (int)&sample_array0[0];
    while (1)
    {
        if (t1.read()>2)
        {
            //pdb_start();
            pc.printf("%i\t%i\t%i\r\n", sample_array0[1], sample_array1[1],(DMA_TCD0_DADDR-startAddress)/2);
            t1.reset();
        }
    }
 //   while(1) {
//        if(pc.readable() > 0) {
//            char temp = pc.getc();
//            
//            switch(temp) {
//                case '1': // run motor and sample
//                {
//                    // wait for angle to set to zero
//                    led_blue = 0;
//                    while(!angle_encoder.set_zero()) {pc.printf("AngleNotSet");}
//                    quad_reset();
//                    led_blue = 1;
//                    
//                    // release mallet                                
//                    motor.releaseMallet();
//                    
//                    // wait for mallet to drop to certin point before beginning to sample
//                    /*
//                    led_red = 0;
//                    int angleVal;
//                    do {
//                        angleVal = angle_encoder.absolute_angle();
//                        }
//                    while(!(angleVal > 150 && angleVal < 400));
//                    led_red = 1;
//                    */
//                    
//                    // begin sampling
//                    pdb_start();
//                    //pause_us(TOTAL_SAMPLES*10);
//                    //while(!dma_done) {led_green = 0;}
//                    led_green = 1;
//                    
//                    // reset mallet
//                    motor.reset();
//                    output_data();
//                    
//                    
//                    led_red = 1;
//                    led_blue = 1;
//                    led_green = 1;
//                    }
//                    break;
//                
//                case '2':
//                {
//                    motor.releaseMallet();
//                    pause(1);
//                    
//                    while(!angle_encoder.set_zero()) {}
//                    quad_reset();
//                    
//                    pdb_start();
//                    motor.clockwise(1);
//                    pause(1);
//                    motor.off();
//                    output_data();
//                    
//                    }
//                    break;
//                
//                case '3':
//                {    
//                    /*
//                    while(angleVar)
//                    {
//                        counter++;
//                        angleVar = angle_encoder.absolute_angle();
//                        angleVar -= motorVal;
//                        if(angleVar == 0x00ff0000) {} // do nothing
//                        //else if(angleVar > 340) motorB.pulsewidth_us(8000); // max speed 
//                        else if(angleVar < 43) {
//                            angleVar = 0; // exit loop
//                            //motorB.pulsewidth_us(0);} // min speed
//                        //else motorB.pulsewidth_us(angleVar*800/34);
//                        }
//                    motor.off();
//                    */
//                    }
//                    break;    
//                
//                
//                /********************************************************************
//                * The code below is for testing and troubleshooting.  Don't delete. *
//                ********************************************************************/
//                case 'B':
//                case 'b':
//                    led_blue = !led_blue;
//                    pc.printf("Blue LED\r\n");
//                    break;
//                case 'R':
//                case 'r':
//                    led_red = !led_red;
//                    pc.printf("Red LED\r\n");
//                    break;
//                 
//                // test sampling
//                case 'Q':
//                case 'q':
//                    quad_reset();
//                    pdb_start();
//                    
//                    while(!dma_half_done) {
//                        pc.printf("first half\r\n");
//                        pause_ms(1);
//                        }
//                    
//                    while(!dma_done) {
//                        pc.printf("second half\r\n");
//                        pause_ms(1);
//                        }
//                    for(int i = 0; i < len; i++) pc.printf("%i\t %i\t %i\r\n", sample_array0[i],sample_array1[i], angle_array[i]);
//                    pc.printf("\r\n");
//                    
//                    led_red = 1;
//                    led_green = 1;
//                    led_blue = 1;
//                    
//                    
//                    /*
//                    while(!angle_encoder.set_zero()) {}
//                    quad_reset();
//                    
//                    
//                    pdb_start();
//                    pause_us(TOTAL_SAMPLES*10);
//                    output_data();*/
//                    
//                    break;
//                case 'W':
//                case 'w': // reads 0 unless the counter is running
//                    pc.printf("PDB: %i\r\n",PDB0_CNT);
//                    break;
//                
//                // test angle encoder
//                case 'A':
//                case 'a': // set zero
//                    if(angle_encoder.set_zero()) {
//                        pc.printf("Zero set\r\n");
//                    }
//                    else {
//                        pc.printf("Zero NOT set\r\n");
//                    }
//                    break;
//                case 'S':
//                case 's': // perform "no operation", which returns 0xa5
//                {
//                    pc.printf("NOP: 0x%02x\r\n", angle_encoder.nop());
//                    break;
//                }
//                case 'D':
//                case 'd': // read absolute and relative angles
//                {
//                    pc.printf("Angle: %i %i\r\n", angle_encoder.absolute_angle(), quad_read());
//                    break;
//                }
//                case 'F':
//                case 'f':
//                    pc.printf("Quad Cnt: %i\r\n", quad_read());
//                    break;
//                    
//                // test motor
//                case 'Z':
//                case 'z': // release the mallet
//                    motor.releaseMallet();
//                    break;
//                case 'X':
//                case 'x':    
//                    motor.hardReset(motorVal);
//                    break;
//                case '+':
//                case '=':
//                    motorVal++;
//                    if(motorVal > 8000) motorVal = 8000;
//                    pc.printf("MotorVal: %i\r\n", motorVal);
//                    break;
//                case '-':
//                {
//                    motorVal--;
//                    if(motorVal < 0) motorVal = 0;
//                    pc.printf("MotorVal: %i\r\n", motorVal);
//                    break;
//                }
//            }
//        }
//    }
}

void output_data()
{
    for (int n = 0; n < len; n++) {
        pc.printf("%i\t%i\r\n", sample_array0[n], sample_array1[n]);
        
    }
}