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
- Committer:
- amccartney
- Date:
- 2016-10-21
- Revision:
- 0:b12e0784b4b4
File content as of revision 0:b12e0784b4b4:
#include "mbed.h" DigitalOut led_red(LED_RED); DigitalOut led_green(LED_GREEN); DigitalOut led_blue(LED_BLUE); DigitalIn sw2(SW2); DigitalIn sw3(SW3); Serial pc(USBTX, USBRX); AnalogOut my_output(DAC0_OUT); char newFreq[3]; int Freq = 60; //int bufferSize = 0; #define PI (3.141592653589793238462) #define AMPLITUDE (1.0) // x * 3.3V #define PHASE (PI * 1) // 2*pi is one period #define RANGE (0x7FFF) #define OFFSET (0x7FFF) #define STEP_US (49) #define FREQ_HZ (60) #define STEP (0.00005) #define BUFFER_SIZE ( (int) ( 1 / ( FREQ_HZ * STEP ))) int bufferSize = ( (int) ( 1 / ( Freq * STEP ))); int sw2_data = 0; void calculate_sinewave(void); void calculate_squarewave(void); void calculate_triwave(void); void check_sw2(void) { if (sw2 == 0) { //sw2_data++; //pc.printf("SW2 button pressed. \n"); if (sw2_data == 0) { led_green = 1; led_blue = 0; led_red = 1; calculate_triwave(); pc.printf("TRIANGLE - Blue\n"); sw2_data = 1; } else if (sw2_data == 1) { led_green = 1; led_blue = 1; led_red = 0; calculate_squarewave(); pc.printf("SQUARE - Red\n"); sw2_data = 2; } else if (sw2_data == 2) { led_green = 0; led_blue = 1; led_red = 1; calculate_sinewave(); pc.printf("SINE - Green\n"); sw2_data = 0; } wait_us(1000000); } } void check_sw3(void) { if (sw3 == 0) { //pc.printf("SW3 button pressed. \n"); led_green = 1; led_red = 1; led_blue = 0; pc.printf("Enter a 3 digit frequency. Start typing. \n"); for (uint32_t i = 0; i < 3; i++) { newFreq[i] = pc.putc(pc.getc()); } pc.putc(13); /* CR */ pc.putc(10); /* LF */ // pc.printf("Freq: %s\n",newFreq); sscanf(newFreq, "%d", &Freq); pc.printf("Freq: %d Hz\n",Freq); bufferSize = ( (int) ( 1 / ( Freq * STEP ))); pc.printf("Buffer: %d\n",bufferSize); uint16_t *buffer = new uint16_t[bufferSize]; calculate_sinewave(); sw2_data = 0; } } uint16_t *buffer = new uint16_t[bufferSize]; int main() { led_green = 1; led_red = 1; led_blue = 0; pc.baud(115200); pc.printf("\nNXP FRDM-K22F board.\n"); pc.printf("Frequency Generator\n"); pc.printf("Freq: %d Hz\n",FREQ_HZ); pc.printf("Buffer: %d\n",bufferSize); pc.printf("\n"); calculate_sinewave(); while(1) { // sinewave output for (int i = 0; i < bufferSize; i++) { my_output.write_u16(buffer[i]); wait_us(STEP_US); } check_sw3(); check_sw2(); } } // Create the sinewave buffer void calculate_sinewave(void){ for (int i = 0; i < bufferSize; i++) { double rads = (PI * i)/(bufferSize / 2); // Convert degree in radian buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (cos(rads + PHASE))) + OFFSET); } } // Create the squarewave buffer void calculate_squarewave(void){ for (int i = 0; i < (bufferSize / 2); i++) { buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (1)) + OFFSET); } for (int i = (bufferSize / 2); i < (bufferSize); i++) { buffer[i] = 0; //(uint16_t)(AMPLITUDE * (RANGE * (0.0)) + OFFSET); } } // Create the trianglewave buffer void calculate_triwave(void){ for (int i = 0; i < (bufferSize/2); i++) { double triPlus = (double) i / (bufferSize/2); double triMinus = (double) (1.0 - (triPlus)); buffer[i] = (uint16_t)(AMPLITUDE * ((RANGE*2) * (triPlus))); buffer[(i + ((bufferSize / 2)))] = (uint16_t)(AMPLITUDE * ((RANGE*2) * (triMinus))); //pc.printf("Buffer: %E\n",triPlus); //pc.printf("Buffer: %E\n",triMinus); } buffer[bufferSize - 1] = 0; }