3rd lab

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }