David Rowe
/
Labthree
3rd lab
main.cpp@1:bafc6db426c3, 2018-02-02 (annotated)
- Committer:
- dprowe
- Date:
- Fri Feb 02 18:00:06 2018 +0000
- Revision:
- 1:bafc6db426c3
- Parent:
- 0:904d2d8522b1
tHE THIRD LAB
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dprowe | 0:904d2d8522b1 | 1 | #include <stdio.h> |
dprowe | 0:904d2d8522b1 | 2 | #include <stdlib.h> |
dprowe | 0:904d2d8522b1 | 3 | #include <string.h> |
dprowe | 0:904d2d8522b1 | 4 | #include "mbed.h" |
dprowe | 0:904d2d8522b1 | 5 | |
dprowe | 0:904d2d8522b1 | 6 | #define PI (3.141592653589793238462) |
dprowe | 0:904d2d8522b1 | 7 | #define AMPLITUDE (1.0) // x * 3.3V |
dprowe | 0:904d2d8522b1 | 8 | #define PHASE (PI * 1) // 2*pi is one period |
dprowe | 0:904d2d8522b1 | 9 | #define RANGE (0x7FFF) |
dprowe | 0:904d2d8522b1 | 10 | #define OFFSET (0x7FFF) |
dprowe | 0:904d2d8522b1 | 11 | |
dprowe | 0:904d2d8522b1 | 12 | // Configuration for sinewave output |
dprowe | 0:904d2d8522b1 | 13 | #define BUFFER_SIZE (120) |
dprowe | 0:904d2d8522b1 | 14 | uint16_t buffer[BUFFER_SIZE]; |
dprowe | 0:904d2d8522b1 | 15 | |
dprowe | 0:904d2d8522b1 | 16 | Serial pc(USBTX, USBRX); |
dprowe | 0:904d2d8522b1 | 17 | DigitalOut led1(LED1); |
dprowe | 0:904d2d8522b1 | 18 | DigitalIn button(PC_13); |
dprowe | 0:904d2d8522b1 | 19 | AnalogOut Vout(PA_4); |
dprowe | 0:904d2d8522b1 | 20 | |
dprowe | 0:904d2d8522b1 | 21 | // Create the sinewave buffer |
dprowe | 0:904d2d8522b1 | 22 | void calculate_sinewave(void){ |
dprowe | 0:904d2d8522b1 | 23 | for (int i = 0; i < BUFFER_SIZE; i++) { |
dprowe | 0:904d2d8522b1 | 24 | double rads = (PI * (i*3))/180.0; // Convert degree in radian |
dprowe | 0:904d2d8522b1 | 25 | buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (cos(rads + PHASE))) + OFFSET); |
dprowe | 0:904d2d8522b1 | 26 | } |
dprowe | 0:904d2d8522b1 | 27 | } |
dprowe | 0:904d2d8522b1 | 28 | |
dprowe | 0:904d2d8522b1 | 29 | |
dprowe | 0:904d2d8522b1 | 30 | void sinecom(char* inputstring) { |
dprowe | 0:904d2d8522b1 | 31 | |
dprowe | 0:904d2d8522b1 | 32 | calculate_sinewave(); |
dprowe | 0:904d2d8522b1 | 33 | char s[20]; |
dprowe | 0:904d2d8522b1 | 34 | char sV[20]; |
dprowe | 0:904d2d8522b1 | 35 | char sF[20]; |
dprowe | 0:904d2d8522b1 | 36 | int pos, len; |
dprowe | 0:904d2d8522b1 | 37 | int i = 1; |
dprowe | 0:904d2d8522b1 | 38 | strcpy(s, inputstring); |
dprowe | 0:904d2d8522b1 | 39 | len = strlen(s); |
dprowe | 0:904d2d8522b1 | 40 | |
dprowe | 0:904d2d8522b1 | 41 | |
dprowe | 0:904d2d8522b1 | 42 | for (; i < len; i++){ |
dprowe | 0:904d2d8522b1 | 43 | if (s[i] == ' '){ |
dprowe | 0:904d2d8522b1 | 44 | pos = i; |
dprowe | 0:904d2d8522b1 | 45 | break; |
dprowe | 0:904d2d8522b1 | 46 | } |
dprowe | 0:904d2d8522b1 | 47 | } |
dprowe | 0:904d2d8522b1 | 48 | |
dprowe | 0:904d2d8522b1 | 49 | memcpy(sF, &s[pos], len-pos); |
dprowe | 0:904d2d8522b1 | 50 | memcpy(sV, &s[0], pos); |
dprowe | 0:904d2d8522b1 | 51 | float inV = atof(sV); |
dprowe | 0:904d2d8522b1 | 52 | float input_f = atof(sF); |
dprowe | 0:904d2d8522b1 | 53 | pc.printf("Voltage: %f \n\r",inV); |
dprowe | 0:904d2d8522b1 | 54 | pc.printf("Frequency: %f \n\r",input_f); |
dprowe | 0:904d2d8522b1 | 55 | |
dprowe | 0:904d2d8522b1 | 56 | float wait_time = -9.955923 + (20817940 + 9.955923) / (1 + powf(input_f/0.0007111212, 1.049561)); //took data points and got this equation by estimating the graph with computer, results in 1-3% error |
dprowe | 1:bafc6db426c3 | 57 | |
dprowe | 1:bafc6db426c3 | 58 | while(!pc.readable()) { |
dprowe | 0:904d2d8522b1 | 59 | // sinewave output |
dprowe | 0:904d2d8522b1 | 60 | for (int i = 0; i < BUFFER_SIZE; i++) { |
dprowe | 0:904d2d8522b1 | 61 | Vout.write_u16(buffer[i]/(3.30 * (1.00/inV))); |
dprowe | 1:bafc6db426c3 | 62 | wait_us((int)wait_time); |
dprowe | 0:904d2d8522b1 | 63 | } |
dprowe | 0:904d2d8522b1 | 64 | } |
dprowe | 1:bafc6db426c3 | 65 | return; |
dprowe | 0:904d2d8522b1 | 66 | } |
dprowe | 0:904d2d8522b1 | 67 | |
dprowe | 0:904d2d8522b1 | 68 | void ledcom(char* onoff) |
dprowe | 0:904d2d8522b1 | 69 | { |
dprowe | 0:904d2d8522b1 | 70 | if(strstr(onoff, "ON") != NULL) |
dprowe | 0:904d2d8522b1 | 71 | led1 = 1; |
dprowe | 0:904d2d8522b1 | 72 | else |
dprowe | 0:904d2d8522b1 | 73 | led1 = 0; |
dprowe | 0:904d2d8522b1 | 74 | } |
dprowe | 0:904d2d8522b1 | 75 | |
dprowe | 0:904d2d8522b1 | 76 | void buttoncom(void) |
dprowe | 0:904d2d8522b1 | 77 | { |
dprowe | 0:904d2d8522b1 | 78 | if(button.read() == 0){ |
dprowe | 0:904d2d8522b1 | 79 | pc.printf("PRESSED \n\r"); |
dprowe | 0:904d2d8522b1 | 80 | } |
dprowe | 0:904d2d8522b1 | 81 | else if (button.read() != 0) { |
dprowe | 0:904d2d8522b1 | 82 | pc.printf("RELEASED \n\r"); |
dprowe | 0:904d2d8522b1 | 83 | } |
dprowe | 0:904d2d8522b1 | 84 | } |
dprowe | 0:904d2d8522b1 | 85 | |
dprowe | 0:904d2d8522b1 | 86 | void blinkcom(char* reps) |
dprowe | 0:904d2d8522b1 | 87 | { |
dprowe | 0:904d2d8522b1 | 88 | int x = atoi(reps); |
dprowe | 0:904d2d8522b1 | 89 | int i; |
dprowe | 0:904d2d8522b1 | 90 | for(i = 0; i < x; i++) |
dprowe | 0:904d2d8522b1 | 91 | { |
dprowe | 0:904d2d8522b1 | 92 | led1 = 1; |
dprowe | 0:904d2d8522b1 | 93 | wait(.5); |
dprowe | 0:904d2d8522b1 | 94 | led1 = 0; |
dprowe | 0:904d2d8522b1 | 95 | wait(.5); |
dprowe | 0:904d2d8522b1 | 96 | } |
dprowe | 0:904d2d8522b1 | 97 | } |
dprowe | 0:904d2d8522b1 | 98 | |
dprowe | 0:904d2d8522b1 | 99 | void dccom(char *volts) |
dprowe | 0:904d2d8522b1 | 100 | { |
dprowe | 0:904d2d8522b1 | 101 | float volt = atof(volts); |
dprowe | 0:904d2d8522b1 | 102 | pc.printf("voltage output: %4.2f \n\r", volt); |
dprowe | 0:904d2d8522b1 | 103 | Vout.write_u16((volt/3.317)*0xFFFF); |
dprowe | 0:904d2d8522b1 | 104 | } |
dprowe | 0:904d2d8522b1 | 105 | |
dprowe | 0:904d2d8522b1 | 106 | |
dprowe | 0:904d2d8522b1 | 107 | int main() { |
dprowe | 0:904d2d8522b1 | 108 | char s[20]; |
dprowe | 0:904d2d8522b1 | 109 | pc.printf("Enter command \n\r"); |
dprowe | 0:904d2d8522b1 | 110 | while (true) { |
dprowe | 0:904d2d8522b1 | 111 | int j = 0; |
dprowe | 0:904d2d8522b1 | 112 | char c; |
dprowe | 0:904d2d8522b1 | 113 | |
dprowe | 0:904d2d8522b1 | 114 | while(true){ |
dprowe | 0:904d2d8522b1 | 115 | c = pc.getc(); |
dprowe | 0:904d2d8522b1 | 116 | pc.putc(c); |
dprowe | 0:904d2d8522b1 | 117 | s[j]=c; |
dprowe | 0:904d2d8522b1 | 118 | j++; |
dprowe | 0:904d2d8522b1 | 119 | if(c == '\r'){ |
dprowe | 0:904d2d8522b1 | 120 | pc.printf("\n\r"); |
dprowe | 0:904d2d8522b1 | 121 | break; |
dprowe | 0:904d2d8522b1 | 122 | } |
dprowe | 0:904d2d8522b1 | 123 | } |
dprowe | 0:904d2d8522b1 | 124 | s[j] = '\0'; |
dprowe | 0:904d2d8522b1 | 125 | char s_one[20]; |
dprowe | 0:904d2d8522b1 | 126 | char s_two[20]; |
dprowe | 0:904d2d8522b1 | 127 | int len = strlen(s); |
dprowe | 0:904d2d8522b1 | 128 | int pos = 0; |
dprowe | 0:904d2d8522b1 | 129 | |
dprowe | 0:904d2d8522b1 | 130 | int i = 0; |
dprowe | 0:904d2d8522b1 | 131 | for (; i < len; i++){ |
dprowe | 0:904d2d8522b1 | 132 | |
dprowe | 0:904d2d8522b1 | 133 | if (s[i] == ' '){ |
dprowe | 0:904d2d8522b1 | 134 | pos = i; |
dprowe | 0:904d2d8522b1 | 135 | break; |
dprowe | 0:904d2d8522b1 | 136 | } |
dprowe | 0:904d2d8522b1 | 137 | else if (i == len) |
dprowe | 0:904d2d8522b1 | 138 | pos = len+1; |
dprowe | 0:904d2d8522b1 | 139 | } |
dprowe | 0:904d2d8522b1 | 140 | |
dprowe | 0:904d2d8522b1 | 141 | |
dprowe | 0:904d2d8522b1 | 142 | if (pos <= len){ |
dprowe | 0:904d2d8522b1 | 143 | memcpy(s_two, &s[pos], len-pos); |
dprowe | 0:904d2d8522b1 | 144 | s_two[len - pos] = '\0'; |
dprowe | 0:904d2d8522b1 | 145 | |
dprowe | 0:904d2d8522b1 | 146 | memcpy(s_one, &s[0], pos+1); |
dprowe | 0:904d2d8522b1 | 147 | s_one[pos] = '\0'; |
dprowe | 0:904d2d8522b1 | 148 | } |
dprowe | 0:904d2d8522b1 | 149 | |
dprowe | 0:904d2d8522b1 | 150 | else { |
dprowe | 0:904d2d8522b1 | 151 | memcpy(s_one, &s[0], len); |
dprowe | 0:904d2d8522b1 | 152 | s_one[len] = '\0'; |
dprowe | 0:904d2d8522b1 | 153 | pc.printf("%s \n\r", s_one); |
dprowe | 0:904d2d8522b1 | 154 | }//case where there is no space |
dprowe | 0:904d2d8522b1 | 155 | |
dprowe | 0:904d2d8522b1 | 156 | |
dprowe | 0:904d2d8522b1 | 157 | if (strstr(s_one, "LED") != NULL) { |
dprowe | 0:904d2d8522b1 | 158 | ledcom(s_two); |
dprowe | 0:904d2d8522b1 | 159 | } |
dprowe | 0:904d2d8522b1 | 160 | else if (strstr(s, "BUTTON") != NULL) { |
dprowe | 0:904d2d8522b1 | 161 | buttoncom(); |
dprowe | 0:904d2d8522b1 | 162 | } |
dprowe | 0:904d2d8522b1 | 163 | else if (strstr(s_one, "BLINK") != NULL) { |
dprowe | 0:904d2d8522b1 | 164 | blinkcom(s_two); |
dprowe | 0:904d2d8522b1 | 165 | } |
dprowe | 0:904d2d8522b1 | 166 | else if (strstr(s_one, "DC") != NULL) { |
dprowe | 0:904d2d8522b1 | 167 | dccom(s_two); |
dprowe | 0:904d2d8522b1 | 168 | } |
dprowe | 0:904d2d8522b1 | 169 | else if (strstr(s_one, "SINE") != NULL){ |
dprowe | 0:904d2d8522b1 | 170 | sinecom(s_two); |
dprowe | 0:904d2d8522b1 | 171 | } |
dprowe | 0:904d2d8522b1 | 172 | else pc.printf("Bad command, try again buddy \n\r"); |
dprowe | 0:904d2d8522b1 | 173 | } |
dprowe | 0:904d2d8522b1 | 174 | } |