Frequency generator example application for the FRDM_K22F. SW3 to enter a new frequency via terminal SW2 to change waveform type (sine, triangle, square)
main.cpp@0:b12e0784b4b4, 2016-10-21 (annotated)
- Committer:
- amccartney
- Date:
- Fri Oct 21 15:58:36 2016 +0000
- Revision:
- 0:b12e0784b4b4
FRDM_K22F Frequency Generator
Who changed what in which revision?
User | Revision | Line number | New 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 | } |