Analog Filters and Oscilloscope

Dependencies:   mbed

Committer:
kmhatre
Date:
Sat Mar 03 02:53:19 2018 +0000
Revision:
0:0981765e0a06
Analog Filters

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kmhatre 0:0981765e0a06 1
kmhatre 0:0981765e0a06 2 /*
kmhatre 0:0981765e0a06 3 * ENGR E 210 - CYBER PHYSICAL SYSTEMS (DIGITAL SYSTEMS)
kmhatre 0:0981765e0a06 4 * LAB 3 - ANALOG FILTERS AND OSCILLOSCOPE
kmhatre 0:0981765e0a06 5 * CODE BY KRISH HEMANT MHATRE AND ETHAN ZHANG
kmhatre 0:0981765e0a06 6 */
kmhatre 0:0981765e0a06 7 #include "mbed.h"
kmhatre 0:0981765e0a06 8 #include <string.h>
kmhatre 0:0981765e0a06 9
kmhatre 0:0981765e0a06 10 #if !DEVICE_ANALOGOUT
kmhatre 0:0981765e0a06 11 #error You cannot use this example as the AnalogOut is not supported on this device.
kmhatre 0:0981765e0a06 12 #else
kmhatre 0:0981765e0a06 13 AnalogOut my_output(PA_4);
kmhatre 0:0981765e0a06 14 #endif
kmhatre 0:0981765e0a06 15
kmhatre 0:0981765e0a06 16 #define PI (3.141592653589793238462)
kmhatre 0:0981765e0a06 17 #define AMPLITUDE (1.0) // x * 3.3V
kmhatre 0:0981765e0a06 18 #define PHASE (PI * 1) // 2*pi is one period
kmhatre 0:0981765e0a06 19 #define RANGE (0x7FFF)
kmhatre 0:0981765e0a06 20 #define OFFSET (0x7FFF)
kmhatre 0:0981765e0a06 21
kmhatre 0:0981765e0a06 22 // Configuration for sinewave output
kmhatre 0:0981765e0a06 23 #define BUFFER_SIZE (360)
kmhatre 0:0981765e0a06 24 uint16_t buffer[BUFFER_SIZE];
kmhatre 0:0981765e0a06 25
kmhatre 0:0981765e0a06 26 Serial pc(USBTX, USBRX);
kmhatre 0:0981765e0a06 27 DigitalOut led1(LED1);
kmhatre 0:0981765e0a06 28 DigitalIn button(PC_13);
kmhatre 0:0981765e0a06 29
kmhatre 0:0981765e0a06 30 void Led(int a)
kmhatre 0:0981765e0a06 31 {
kmhatre 0:0981765e0a06 32 led1 = a;
kmhatre 0:0981765e0a06 33 }
kmhatre 0:0981765e0a06 34
kmhatre 0:0981765e0a06 35 void Blink(int n)
kmhatre 0:0981765e0a06 36 {
kmhatre 0:0981765e0a06 37 int i = 0;
kmhatre 0:0981765e0a06 38 for(i=0; i<n; i++)
kmhatre 0:0981765e0a06 39 {
kmhatre 0:0981765e0a06 40 led1 = 1;
kmhatre 0:0981765e0a06 41 wait(0.5);
kmhatre 0:0981765e0a06 42 led1= 0;
kmhatre 0:0981765e0a06 43 wait(0.5);
kmhatre 0:0981765e0a06 44 }
kmhatre 0:0981765e0a06 45 }
kmhatre 0:0981765e0a06 46
kmhatre 0:0981765e0a06 47
kmhatre 0:0981765e0a06 48 void Button()
kmhatre 0:0981765e0a06 49 {
kmhatre 0:0981765e0a06 50 if(button.read() == 1)
kmhatre 0:0981765e0a06 51 {
kmhatre 0:0981765e0a06 52 pc.printf("RELEASED\n\r");
kmhatre 0:0981765e0a06 53 }
kmhatre 0:0981765e0a06 54 else
kmhatre 0:0981765e0a06 55 {
kmhatre 0:0981765e0a06 56 pc.printf("PRESSED\n\r");
kmhatre 0:0981765e0a06 57 }
kmhatre 0:0981765e0a06 58 }
kmhatre 0:0981765e0a06 59
kmhatre 0:0981765e0a06 60 void calculate_sinewave(float amp){
kmhatre 0:0981765e0a06 61 for (int i = 0; i < BUFFER_SIZE; i++) {
kmhatre 0:0981765e0a06 62 double rads = (PI * i)/180.0; // Convert degree in radian
kmhatre 0:0981765e0a06 63 buffer[i] = (uint16_t)(amp * (RANGE * (cos(rads + PHASE))) + OFFSET);
kmhatre 0:0981765e0a06 64 }
kmhatre 0:0981765e0a06 65 }
kmhatre 0:0981765e0a06 66
kmhatre 0:0981765e0a06 67 int main()
kmhatre 0:0981765e0a06 68 {
kmhatre 0:0981765e0a06 69 pc.printf("Nucleo is running\n\r");
kmhatre 0:0981765e0a06 70 pc.printf("cps%\n\r");
kmhatre 0:0981765e0a06 71 int size = 32;
kmhatre 0:0981765e0a06 72 char str[size];
kmhatre 0:0981765e0a06 73 int i = 0;
kmhatre 0:0981765e0a06 74 while(1)
kmhatre 0:0981765e0a06 75 {
kmhatre 0:0981765e0a06 76 str[i] = pc.getc();
kmhatre 0:0981765e0a06 77 pc.putc(str[i]);
kmhatre 0:0981765e0a06 78
kmhatre 0:0981765e0a06 79 if (i >= size)
kmhatre 0:0981765e0a06 80 {
kmhatre 0:0981765e0a06 81 pc.printf("OVER BUFFER\n\r");
kmhatre 0:0981765e0a06 82 i = 0;
kmhatre 0:0981765e0a06 83 for(int j = 0; j < size; j++)
kmhatre 0:0981765e0a06 84 {
kmhatre 0:0981765e0a06 85 str[j] = 0;
kmhatre 0:0981765e0a06 86 }
kmhatre 0:0981765e0a06 87 pc.printf("cps%\n\r");
kmhatre 0:0981765e0a06 88 }
kmhatre 0:0981765e0a06 89 if(str[i] == 13)
kmhatre 0:0981765e0a06 90 {
kmhatre 0:0981765e0a06 91 pc.printf("\n\rOK\n\r");
kmhatre 0:0981765e0a06 92 str[i] = '\0';
kmhatre 0:0981765e0a06 93 pc.printf("Command Recieved: %s\n\r", str);
kmhatre 0:0981765e0a06 94 char s[5];
kmhatre 0:0981765e0a06 95 sscanf(str, "%s", s);
kmhatre 0:0981765e0a06 96 if(strcmp(str, "BUTTON") == 0)
kmhatre 0:0981765e0a06 97 {
kmhatre 0:0981765e0a06 98 Button();
kmhatre 0:0981765e0a06 99 pc.printf("Button checked.\n\r");
kmhatre 0:0981765e0a06 100 }
kmhatre 0:0981765e0a06 101 else if(strcmp("LED ON", str) == 0)
kmhatre 0:0981765e0a06 102 {
kmhatre 0:0981765e0a06 103 Led(1);
kmhatre 0:0981765e0a06 104 pc.printf("LED is on\n\r");
kmhatre 0:0981765e0a06 105 }
kmhatre 0:0981765e0a06 106 else if(strcmp("LED OFF", str) == 0)
kmhatre 0:0981765e0a06 107 {
kmhatre 0:0981765e0a06 108 Led(0);
kmhatre 0:0981765e0a06 109 pc.printf("LED is off\n\r");
kmhatre 0:0981765e0a06 110 }
kmhatre 0:0981765e0a06 111 else if(strcmp(s, "BLINK") == 0)
kmhatre 0:0981765e0a06 112 {
kmhatre 0:0981765e0a06 113 pc.printf("Reading a blink\n\r");
kmhatre 0:0981765e0a06 114 char *a = strtok(str, " ");
kmhatre 0:0981765e0a06 115 a = strtok(NULL, " ");
kmhatre 0:0981765e0a06 116 pc.printf("Start blink\n\r");
kmhatre 0:0981765e0a06 117 int n;
kmhatre 0:0981765e0a06 118 sscanf(a, " %d", &n);
kmhatre 0:0981765e0a06 119 if(n>=1 && n<=10)
kmhatre 0:0981765e0a06 120 {
kmhatre 0:0981765e0a06 121 Blink(n);
kmhatre 0:0981765e0a06 122 pc.printf("Blink complete\n\r");
kmhatre 0:0981765e0a06 123 }
kmhatre 0:0981765e0a06 124 else
kmhatre 0:0981765e0a06 125 {
kmhatre 0:0981765e0a06 126 pc.printf("ERROR: Blink cycle should be between 1 and 10\n\r");
kmhatre 0:0981765e0a06 127 }
kmhatre 0:0981765e0a06 128 }
kmhatre 0:0981765e0a06 129 else if(strncmp(str, "DC", 2) == 0)
kmhatre 0:0981765e0a06 130 {
kmhatre 0:0981765e0a06 131 pc.printf("Reading DC\n\r");
kmhatre 0:0981765e0a06 132 char *s1 = strtok(str, " ");
kmhatre 0:0981765e0a06 133 s1 = strtok(NULL, " ");
kmhatre 0:0981765e0a06 134 float volt;
kmhatre 0:0981765e0a06 135 sscanf(s1, " %f", &volt);
kmhatre 0:0981765e0a06 136
kmhatre 0:0981765e0a06 137 if((volt < (float)0.5) || (volt > (float)3.0))
kmhatre 0:0981765e0a06 138 {
kmhatre 0:0981765e0a06 139 pc.printf("Voltage out of range\n\r");
kmhatre 0:0981765e0a06 140 }
kmhatre 0:0981765e0a06 141 else
kmhatre 0:0981765e0a06 142 {
kmhatre 0:0981765e0a06 143 float adjust = 19720;
kmhatre 0:0981765e0a06 144
kmhatre 0:0981765e0a06 145 pc.printf("Voltage is %f\n\r", volt);
kmhatre 0:0981765e0a06 146 my_output.write_u16(volt*adjust);
kmhatre 0:0981765e0a06 147 pc.printf("Voltage changed\n\r");
kmhatre 0:0981765e0a06 148 }
kmhatre 0:0981765e0a06 149 }
kmhatre 0:0981765e0a06 150 else if(strncmp(str, "SINE", 4) == 0)
kmhatre 0:0981765e0a06 151 {
kmhatre 0:0981765e0a06 152 float x, amp, freq;
kmhatre 0:0981765e0a06 153 char tmp[5];
kmhatre 0:0981765e0a06 154
kmhatre 0:0981765e0a06 155 sscanf(str, "%s %f %f\n", tmp, &amp, &freq);
kmhatre 0:0981765e0a06 156 pc.printf("Reading data\n\r");
kmhatre 0:0981765e0a06 157 if((amp < (float)0.5) || (amp > (float)3.0) || (freq < (float)100) || (freq > (float)500))
kmhatre 0:0981765e0a06 158 {
kmhatre 0:0981765e0a06 159 pc.printf("Data out of range\n\r");
kmhatre 0:0981765e0a06 160 }
kmhatre 0:0981765e0a06 161 else
kmhatre 0:0981765e0a06 162 {
kmhatre 0:0981765e0a06 163 pc.printf("Generating sine wave of amplitude %fV and frequency %fHz\n\r", amp, freq);
kmhatre 0:0981765e0a06 164 x = (float)((float)amp/(float)3.3); //3.3V is the given voltage
kmhatre 0:0981765e0a06 165 calculate_sinewave(x);
kmhatre 0:0981765e0a06 166 while(1)
kmhatre 0:0981765e0a06 167 {
kmhatre 0:0981765e0a06 168 for (int i = 0; i < BUFFER_SIZE; i++)
kmhatre 0:0981765e0a06 169 {
kmhatre 0:0981765e0a06 170 my_output.write_u16(buffer[i]);
kmhatre 0:0981765e0a06 171 float delay;
kmhatre 0:0981765e0a06 172 if(freq <= 200)
kmhatre 0:0981765e0a06 173 {
kmhatre 0:0981765e0a06 174 delay = (float)((float)((float)4000-(float)((float)5*freq))/(float)(freq*(float)(PI/2)));
kmhatre 0:0981765e0a06 175 }
kmhatre 0:0981765e0a06 176 else
kmhatre 0:0981765e0a06 177 {
kmhatre 0:0981765e0a06 178 delay = (float)((float)((float)5000-(float)((float)12*(float)freq))/(float)(freq));
kmhatre 0:0981765e0a06 179 }
kmhatre 0:0981765e0a06 180 delay = ((float)(delay/1000000)); //converting microseconds to seconds
kmhatre 0:0981765e0a06 181 wait(delay);
kmhatre 0:0981765e0a06 182 }
kmhatre 0:0981765e0a06 183 }
kmhatre 0:0981765e0a06 184 }
kmhatre 0:0981765e0a06 185 }
kmhatre 0:0981765e0a06 186 else
kmhatre 0:0981765e0a06 187 {
kmhatre 0:0981765e0a06 188 pc.printf("ERR\n\r");
kmhatre 0:0981765e0a06 189 }
kmhatre 0:0981765e0a06 190 i = 0;
kmhatre 0:0981765e0a06 191 for(int j = 0; j < size; j++)
kmhatre 0:0981765e0a06 192 {
kmhatre 0:0981765e0a06 193 str[j] = '\0';
kmhatre 0:0981765e0a06 194 }
kmhatre 0:0981765e0a06 195 pc.printf("cps%\n\r");
kmhatre 0:0981765e0a06 196 }
kmhatre 0:0981765e0a06 197 i++;
kmhatre 0:0981765e0a06 198 }
kmhatre 0:0981765e0a06 199 }
kmhatre 0:0981765e0a06 200
kmhatre 0:0981765e0a06 201