Frequency generator example application for the FRDM_K22F. SW3 to enter a new frequency via terminal SW2 to change waveform type (sine, triangle, square)

Dependencies:   mbed

Committer:
amccartney
Date:
Fri Oct 21 15:58:36 2016 +0000
Revision:
0:b12e0784b4b4
FRDM_K22F Frequency Generator

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amccartney 0:b12e0784b4b4 1 #include "mbed.h"
amccartney 0:b12e0784b4b4 2
amccartney 0:b12e0784b4b4 3 DigitalOut led_red(LED_RED);
amccartney 0:b12e0784b4b4 4 DigitalOut led_green(LED_GREEN);
amccartney 0:b12e0784b4b4 5 DigitalOut led_blue(LED_BLUE);
amccartney 0:b12e0784b4b4 6 DigitalIn sw2(SW2);
amccartney 0:b12e0784b4b4 7 DigitalIn sw3(SW3);
amccartney 0:b12e0784b4b4 8 Serial pc(USBTX, USBRX);
amccartney 0:b12e0784b4b4 9 AnalogOut my_output(DAC0_OUT);
amccartney 0:b12e0784b4b4 10
amccartney 0:b12e0784b4b4 11 char newFreq[3];
amccartney 0:b12e0784b4b4 12 int Freq = 60;
amccartney 0:b12e0784b4b4 13 //int bufferSize = 0;
amccartney 0:b12e0784b4b4 14
amccartney 0:b12e0784b4b4 15 #define PI (3.141592653589793238462)
amccartney 0:b12e0784b4b4 16 #define AMPLITUDE (1.0) // x * 3.3V
amccartney 0:b12e0784b4b4 17 #define PHASE (PI * 1) // 2*pi is one period
amccartney 0:b12e0784b4b4 18 #define RANGE (0x7FFF)
amccartney 0:b12e0784b4b4 19 #define OFFSET (0x7FFF)
amccartney 0:b12e0784b4b4 20 #define STEP_US (49)
amccartney 0:b12e0784b4b4 21 #define FREQ_HZ (60)
amccartney 0:b12e0784b4b4 22 #define STEP (0.00005)
amccartney 0:b12e0784b4b4 23 #define BUFFER_SIZE ( (int) ( 1 / ( FREQ_HZ * STEP )))
amccartney 0:b12e0784b4b4 24
amccartney 0:b12e0784b4b4 25 int bufferSize = ( (int) ( 1 / ( Freq * STEP )));
amccartney 0:b12e0784b4b4 26 int sw2_data = 0;
amccartney 0:b12e0784b4b4 27
amccartney 0:b12e0784b4b4 28 void calculate_sinewave(void);
amccartney 0:b12e0784b4b4 29 void calculate_squarewave(void);
amccartney 0:b12e0784b4b4 30 void calculate_triwave(void);
amccartney 0:b12e0784b4b4 31 void check_sw2(void)
amccartney 0:b12e0784b4b4 32 {
amccartney 0:b12e0784b4b4 33 if (sw2 == 0) {
amccartney 0:b12e0784b4b4 34 //sw2_data++;
amccartney 0:b12e0784b4b4 35 //pc.printf("SW2 button pressed. \n");
amccartney 0:b12e0784b4b4 36 if (sw2_data == 0) {
amccartney 0:b12e0784b4b4 37 led_green = 1;
amccartney 0:b12e0784b4b4 38 led_blue = 0;
amccartney 0:b12e0784b4b4 39 led_red = 1;
amccartney 0:b12e0784b4b4 40 calculate_triwave();
amccartney 0:b12e0784b4b4 41 pc.printf("TRIANGLE - Blue\n");
amccartney 0:b12e0784b4b4 42 sw2_data = 1;
amccartney 0:b12e0784b4b4 43 }
amccartney 0:b12e0784b4b4 44 else if (sw2_data == 1) {
amccartney 0:b12e0784b4b4 45 led_green = 1;
amccartney 0:b12e0784b4b4 46 led_blue = 1;
amccartney 0:b12e0784b4b4 47 led_red = 0;
amccartney 0:b12e0784b4b4 48 calculate_squarewave();
amccartney 0:b12e0784b4b4 49 pc.printf("SQUARE - Red\n");
amccartney 0:b12e0784b4b4 50 sw2_data = 2;
amccartney 0:b12e0784b4b4 51 }
amccartney 0:b12e0784b4b4 52 else if (sw2_data == 2) {
amccartney 0:b12e0784b4b4 53 led_green = 0;
amccartney 0:b12e0784b4b4 54 led_blue = 1;
amccartney 0:b12e0784b4b4 55 led_red = 1;
amccartney 0:b12e0784b4b4 56 calculate_sinewave();
amccartney 0:b12e0784b4b4 57 pc.printf("SINE - Green\n");
amccartney 0:b12e0784b4b4 58 sw2_data = 0;
amccartney 0:b12e0784b4b4 59 }
amccartney 0:b12e0784b4b4 60 wait_us(1000000);
amccartney 0:b12e0784b4b4 61 }
amccartney 0:b12e0784b4b4 62 }
amccartney 0:b12e0784b4b4 63
amccartney 0:b12e0784b4b4 64 void check_sw3(void)
amccartney 0:b12e0784b4b4 65 {
amccartney 0:b12e0784b4b4 66 if (sw3 == 0) {
amccartney 0:b12e0784b4b4 67 //pc.printf("SW3 button pressed. \n");
amccartney 0:b12e0784b4b4 68 led_green = 1;
amccartney 0:b12e0784b4b4 69 led_red = 1;
amccartney 0:b12e0784b4b4 70 led_blue = 0;
amccartney 0:b12e0784b4b4 71 pc.printf("Enter a 3 digit frequency. Start typing. \n");
amccartney 0:b12e0784b4b4 72 for (uint32_t i = 0; i < 3; i++) {
amccartney 0:b12e0784b4b4 73 newFreq[i] = pc.putc(pc.getc());
amccartney 0:b12e0784b4b4 74 }
amccartney 0:b12e0784b4b4 75 pc.putc(13); /* CR */
amccartney 0:b12e0784b4b4 76 pc.putc(10); /* LF */
amccartney 0:b12e0784b4b4 77 // pc.printf("Freq: %s\n",newFreq);
amccartney 0:b12e0784b4b4 78 sscanf(newFreq, "%d", &Freq);
amccartney 0:b12e0784b4b4 79 pc.printf("Freq: %d Hz\n",Freq);
amccartney 0:b12e0784b4b4 80 bufferSize = ( (int) ( 1 / ( Freq * STEP )));
amccartney 0:b12e0784b4b4 81 pc.printf("Buffer: %d\n",bufferSize);
amccartney 0:b12e0784b4b4 82 uint16_t *buffer = new uint16_t[bufferSize];
amccartney 0:b12e0784b4b4 83 calculate_sinewave();
amccartney 0:b12e0784b4b4 84 sw2_data = 0;
amccartney 0:b12e0784b4b4 85 }
amccartney 0:b12e0784b4b4 86 }
amccartney 0:b12e0784b4b4 87
amccartney 0:b12e0784b4b4 88 uint16_t *buffer = new uint16_t[bufferSize];
amccartney 0:b12e0784b4b4 89
amccartney 0:b12e0784b4b4 90 int main() {
amccartney 0:b12e0784b4b4 91 led_green = 1;
amccartney 0:b12e0784b4b4 92 led_red = 1;
amccartney 0:b12e0784b4b4 93 led_blue = 0;
amccartney 0:b12e0784b4b4 94 pc.baud(115200);
amccartney 0:b12e0784b4b4 95 pc.printf("\nNXP FRDM-K22F board.\n");
amccartney 0:b12e0784b4b4 96 pc.printf("Frequency Generator\n");
amccartney 0:b12e0784b4b4 97 pc.printf("Freq: %d Hz\n",FREQ_HZ);
amccartney 0:b12e0784b4b4 98 pc.printf("Buffer: %d\n",bufferSize);
amccartney 0:b12e0784b4b4 99 pc.printf("\n");
amccartney 0:b12e0784b4b4 100 calculate_sinewave();
amccartney 0:b12e0784b4b4 101
amccartney 0:b12e0784b4b4 102 while(1) {
amccartney 0:b12e0784b4b4 103 // sinewave output
amccartney 0:b12e0784b4b4 104 for (int i = 0; i < bufferSize; i++) {
amccartney 0:b12e0784b4b4 105 my_output.write_u16(buffer[i]);
amccartney 0:b12e0784b4b4 106 wait_us(STEP_US);
amccartney 0:b12e0784b4b4 107 }
amccartney 0:b12e0784b4b4 108 check_sw3();
amccartney 0:b12e0784b4b4 109 check_sw2();
amccartney 0:b12e0784b4b4 110 }
amccartney 0:b12e0784b4b4 111 }
amccartney 0:b12e0784b4b4 112
amccartney 0:b12e0784b4b4 113 // Create the sinewave buffer
amccartney 0:b12e0784b4b4 114 void calculate_sinewave(void){
amccartney 0:b12e0784b4b4 115 for (int i = 0; i < bufferSize; i++) {
amccartney 0:b12e0784b4b4 116 double rads = (PI * i)/(bufferSize / 2); // Convert degree in radian
amccartney 0:b12e0784b4b4 117 buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (cos(rads + PHASE))) + OFFSET);
amccartney 0:b12e0784b4b4 118 }
amccartney 0:b12e0784b4b4 119 }
amccartney 0:b12e0784b4b4 120
amccartney 0:b12e0784b4b4 121 // Create the squarewave buffer
amccartney 0:b12e0784b4b4 122 void calculate_squarewave(void){
amccartney 0:b12e0784b4b4 123 for (int i = 0; i < (bufferSize / 2); i++) {
amccartney 0:b12e0784b4b4 124 buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (1)) + OFFSET);
amccartney 0:b12e0784b4b4 125 }
amccartney 0:b12e0784b4b4 126 for (int i = (bufferSize / 2); i < (bufferSize); i++) {
amccartney 0:b12e0784b4b4 127 buffer[i] = 0; //(uint16_t)(AMPLITUDE * (RANGE * (0.0)) + OFFSET);
amccartney 0:b12e0784b4b4 128 }
amccartney 0:b12e0784b4b4 129 }
amccartney 0:b12e0784b4b4 130
amccartney 0:b12e0784b4b4 131 // Create the trianglewave buffer
amccartney 0:b12e0784b4b4 132 void calculate_triwave(void){
amccartney 0:b12e0784b4b4 133 for (int i = 0; i < (bufferSize/2); i++) {
amccartney 0:b12e0784b4b4 134 double triPlus = (double) i / (bufferSize/2);
amccartney 0:b12e0784b4b4 135 double triMinus = (double) (1.0 - (triPlus));
amccartney 0:b12e0784b4b4 136 buffer[i] = (uint16_t)(AMPLITUDE * ((RANGE*2) * (triPlus)));
amccartney 0:b12e0784b4b4 137 buffer[(i + ((bufferSize / 2)))] = (uint16_t)(AMPLITUDE * ((RANGE*2) * (triMinus)));
amccartney 0:b12e0784b4b4 138 //pc.printf("Buffer: %E\n",triPlus);
amccartney 0:b12e0784b4b4 139 //pc.printf("Buffer: %E\n",triMinus);
amccartney 0:b12e0784b4b4 140 }
amccartney 0:b12e0784b4b4 141 buffer[bufferSize - 1] = 0;
amccartney 0:b12e0784b4b4 142 }