Analog Filters and Oscilloscope
Dependencies: mbed
main.cpp@0:0981765e0a06, 2018-03-03 (annotated)
- Committer:
- kmhatre
- Date:
- Sat Mar 03 02:53:19 2018 +0000
- Revision:
- 0:0981765e0a06
Analog Filters
Who changed what in which revision?
User | Revision | Line number | New 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, &, &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 |