DonghunKang

Dependencies:   mbed Adafruit_GFX

main.cpp

Committer:
Donghun
Date:
2019-11-04
Revision:
4:a37c4436b6eb
Parent:
3:e7cab3f9facb

File content as of revision 4:a37c4436b6eb:

// made by H. S. Lee. 2019-10-28
// DAC Test for F303RE

#include "mbed.h"
#include "Adafruit_SSD1306.h"   // Adafruit_GFX library
Ticker DACtimer;
Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut  Board_led(LED1);
DigitalOut  Out_led(PA_12);
DigitalIn   myButton(PC_13);
DigitalIn   exButton(PC_11);
AnalogOut  myAnalogOut(PA_4);
bool flagTimer = 0;
BusOut My7segment_pin(PA_8, PA_9, PA_10, PC_9, PC_8, PC_7, PC_6, PA_11); // 8bit data
            // LSB,                                      , MSB
char    val7Seg[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,
                        0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
char rxData[5];
bool flagRx = 0;
int delay =0;

#define Pr_2_3

#ifdef  TEST1

int main(void)
{
    pc.baud(115200);
    pc.puts("\n TESt1: Starting Program \n");
    
    while (1) {
        // change the voltage on the digital output pin by 0.1 * VCC
        //  and print what the measured voltage should be (assuming VCC = 3.3v)
        for (float n = 0.0f; n < 1.0f; n += 0.1f) {
            myAnalogOut = n;
//            myAnalogOut.write(n);
            
            pc.printf("n=%1.2f, output = %1.2f volts\n", n, myAnalogOut.read() * 3.3f);
            // turn on the led if the voltage is greater than 0.5f * VCC
            Board_led = (myAnalogOut > 0.5f) ? 1 : 0;
            wait(0.1);
        }
    }
}
#endif

#ifdef  TEST2
Ticker  DACtimer;
bool    flagTimer = 0;

void DACInt()
{
    flagTimer = 1;
}

main()
{
    pc.baud(115200);
    pc.puts("\n Test2: Starting Program \n");
        
    // for 10kHz sine wave generation, it's needed to have 
    // a sampling frequency in 10 times of that frequency, 
    // or 100kHz -> 10us period
    const float samplingTime = 0.00005;

    DACtimer.attach(&DACInt, samplingTime);      // 50us is appropriate for F303RE (20kHz)
//    DACtimer.attach_us(&DACInt, samplingTime*1000000);      // 50us is appropriate for F303RE
    
    float soundFreq = 1000;      // 1kHz = 1000Hz
    pc.printf("smapling time = %dus, sound frequency = %dHz\n", (int)(samplingTime*1000000),   (int)soundFreq);
    
    unsigned int n = 0; 
    float tempVal;
    while(1)
    {
        if (1 == flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*samplingTime;
            myAnalogOut = sin(2*3.14159*tempVal)*0.5+0.5;        // an angle is expressed in radians.
//            myAnalogOut = (sin(2*3.14159*tempVal)+sin(tempVal))*0.25+0.5;        // an angle is expressed in radians.
            if (tempVal > 1.0f) n = 0;      // to prevent a phase shift due to overflow of the unsinged int variable
            n++;
        }    
    }       
}
#endif


#ifdef Pr_1
void DACInt()
{
    flagTimer = 1;
}

main()
{
    pc.baud(115200);
    pc.puts("\n Test2: Starting Program \n");
    
    const float samplingTime = 0.00005;
    DACtimer. attach(&DACInt, samplingTime);
    float soundFreq = 400.0f;
    float soundFreq_count = 0.0275f;
    unsigned int n = 0;
    float tempVal;
    while(1)
    {
        if (1==flagTimer)
        {
                flagTimer = 0;
                tempVal = soundFreq*n*samplingTime;
                myAnalogOut = sin(2 * 3.14159 * tempVal) * 0.5 + 0.5;
//            myAnalogOut = (sin(2*3.14159*tempVal)+sin(tempVal))*0.25+0.5;        // an angle is expressed in radians.Q
                soundFreq = soundFreq + soundFreq_count;
                if(2000<soundFreq) soundFreq_count = -soundFreq_count;
                if(400>soundFreq) soundFreq_count = -soundFreq_count;
                if(tempVal>1.0f)n=0;
                n++;
//                if(12000.0f < n) n = 0;
                       
        }
        
    }
}
#endif


#ifdef Pr_2_3
void ReceiveInt()
{
    char inChar;
    static char rxCount = 0;
    static char rxBuf[5];
    
    while(1 == pc.readable())
    {
        inChar=pc.getc();
        pc.putc(inChar);
        if ('<' == inChar)
        {
            rxCount = 1;
        }
        else if (rxCount > 0 && rxCount < 5)
        {
            rxBuf[rxCount - 1] = inChar;
            rxCount++;
        }
        else if (rxCount == 5 && '>' == inChar)
        {
            rxCount = 0;
            flagRx = 1;
            memcpy(rxData,rxBuf,rxCount-1);
        }
        else
        {
            rxCount = 0;
        } 
    }  
}

void DACInt()
{
    flagTimer = 1;
}

main()
{
    pc.baud(115200);
    pc.puts("\n Practice2: Starting Program \n");
    pc.attach(&ReceiveInt,Serial::RxIrq);
    
    char tmpCommand[3];
    int rxVal;
    Board_led=1;
    const float samplingTime = 0.00005;
    DACtimer. attach(&DACInt, samplingTime);
    float soundFreq = 400.0f;
    unsigned int n = 0;
    float tempVal;
    double soundVolume = 2;
    double squaremaker = 0.0005;

    while(1)
    {
        if(1 == flagRx)
        {
            flagRx=0;
            tmpCommand[0]=rxData[0];
            tmpCommand[1]=rxData[1];
            tmpCommand[2]=0;
            rxVal = atoi(rxData + 2);
            if(!strcmp(tmpCommand,"SI"))
            {
                pc.printf("Sine Wave: %d\n",rxVal);
                soundFreq = rxVal*10.0f;
                flagTimer = 2;
            }
            else if(!strcmp(tmpCommand,"SQ"))
            {
                pc.printf("Square Wave: %d\n",rxVal);
                flagTimer = 3;
            }
            else if(!strcmp(tmpCommand,"PL"))
            {
                pc.printf("Play Limit: %d\n",rxVal);
                soundVolume = 0;
                flagTimer = 4;
            }
            else if(!strcmp(tmpCommand,"VL"))
            {
                pc.printf("Volume Limit: %d\n",rxVal);
                soundVolume = rxVal*1.0f;
                flagTimer = 5;
            }
            else if(!strcmp(tmpCommand,"TR"))
            {
                pc.printf("Triangle Wave: %ds\n",rxVal);
                flagTimer = 6;
            }
            else if(!strcmp(tmpCommand,"SA"))
            {
                pc.printf("Sawtooth Wave: %d\n",rxVal);
                flagTimer = 7;
            }            
        }

        if (2==flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*samplingTime;
            myAnalogOut = sin(soundVolume*3.14159*tempVal)*0.5+0.5;       
            if (tempVal > 1.0f) n = 0;      
            n++;
        }
        else if (3==flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*squaremaker;
            myAnalogOut = sin(soundVolume*3.14159*tempVal)*0.5+0.5;        
            if (tempVal > 1.0f) n = 0;      
            n++;
        }
        else if (4==flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*samplingTime;
            myAnalogOut = sin(soundVolume*3.14159*tempVal)*0.5+0.5;      
            if (tempVal > 1.0f) n = 0;      
            n++;
        } 
        else if (5==flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*samplingTime;
            myAnalogOut = sin(soundVolume*3.14159*tempVal)*0.5+0.5;        
            if (tempVal > 1.0f) n = 0;     
            n++;
        } 
        else if (6==flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*samplingTime;
            myAnalogOut = sin(soundVolume*3.14159*tempVal)*0.5 + 0.5 + 0.5 * sin((soundVolume * 3.14159 * tempVal)*2) * 0.5 + 0.33 * sin((soundVolume + 3.14159 + tempVal)*3) * 0.5 + 0.5 + 0.25 * sin((soundVolume + 3.14159 + tempVal)*4) * 0.5 + 0.5 + 0.2 * sin((soundVolume + 3.14159 + tempVal)*5) * 0.5 + 0.5 + 0.166 * sin((soundVolume + 3.14159 + tempVal)*6) * 0.5 + 0.5;
            if (tempVal > 1.0f) n = 0; 
            n++;
        }
        else if (7==flagTimer)
        {
            flagTimer = 0;
            tempVal = soundFreq*n*samplingTime;
            myAnalogOut = sin(soundVolume*3.14159*tempVal)*0.5 + 0.5 + 0.33 * sin((soundVolume * 3.14159 * tempVal)*3 ) * 0.5 + 0.2 * sin((soundVolume + 3.14159 + tempVal)*5) * 0.5 + 0.5 + 0.144 * sin((soundVolume + 3.14159 + tempVal)*7) * 0.5 + 0.5 + 0.111 * sin((soundVolume + 3.14159 + tempVal)*9) * 0.5 + 0.5 + 0.0999 * sin((soundVolume + 3.14159 + tempVal)*11) * 0.5 + 0.5;
            if (tempVal > 1.0f) n = 0;     
            n++;
        }      
        
    }
}
#endif