Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MBed_Adafruit-GPS-Library SDFileSystem mbed
Revision 3:0cc40383d016, committed 2015-01-17
- Comitter:
- ncfronk
- Date:
- Sat Jan 17 19:12:28 2015 +0000
- Parent:
- 2:abcf77d0e77d
- Commit message:
- publishing;
Changed in this revision
| QAM.h | Show annotated file Show diff for this revision Revisions of this file |
| realtimeQAM.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/QAM.h Thu Dec 11 01:23:24 2014 +0000
+++ b/QAM.h Sat Jan 17 19:12:28 2015 +0000
@@ -28,7 +28,7 @@
int i, j;
float out[SAMPLE_LENGTH] = {};
- for( i = 0; i < SAMPLE_LENGTH; i++ )
+ for( i = NUM_TAPS; i < SAMPLE_LENGTH; i++ )
{
out[ i ] = 0.0;
for( j = 0; j < NUM_TAPS; j++ ){
@@ -57,12 +57,7 @@
return total/denom;
}
-float qam_in(float *samples, float *sI, float *sQ, Serial *pc){
- //print_array_serial(samples, SAMPLE_LENGTH, pc);
- for(int i = 0; i < SAMPLE_LENGTH; i++){
- sI[i] = samples[i]*cos(2*PI*CARRIER_FREQ*i*TIME_CONST);
- sQ[i] = -samples[i]*sin(2*PI*CARRIER_FREQ*i*TIME_CONST);
- }
+float qam_in(float *sI, float *sQ, Serial *pc){
filter(sI, pc);
filter(sQ, pc);
return avg_QAM(sI, sQ, SAMPLE_LENGTH);
--- a/realtimeQAM.cpp Thu Dec 11 01:23:24 2014 +0000
+++ b/realtimeQAM.cpp Sat Jan 17 19:12:28 2015 +0000
@@ -7,10 +7,12 @@
#include "QAM.h"
#include "dataPoint.h"
-#define SAMPLE_LENGTH 2000
+#define SAMPLE_LENGTH 1000
#define SAMPLE_RATE 10000
#define SIN_LENGTH 500
#define OUTAVG_LENGTH 100
+#define CARRIER_FREQ 220
+#define TIME_CONST 0.0001
#define PI 3.14159265
SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
@@ -35,14 +37,24 @@
float sinWave[SIN_LENGTH] = {};
int sinIndex = 0;
-float samplesLong[SAMPLE_LENGTH] = {};
-float samplesShort[SAMPLE_LENGTH] = {};
-float samplesRefLong[SAMPLE_LENGTH] = {};
-float samplesRefShort[SAMPLE_LENGTH] = {};
+float sLQ[SAMPLE_LENGTH] = {};
+float sLI[SAMPLE_LENGTH] = {};
+float sSQ[SAMPLE_LENGTH] = {};
+float sSI[SAMPLE_LENGTH] = {};
+float sRefLQ[SAMPLE_LENGTH] = {};
+float sRefLI[SAMPLE_LENGTH] = {};
+float sRefSQ[SAMPLE_LENGTH] = {};
+float sRefSI[SAMPLE_LENGTH] = {};
+
+float Iarray[SAMPLE_LENGTH] = {};
+float Qarray[SAMPLE_LENGTH] = {};
int sampleIndex = 0;
-
-float sI[SAMPLE_LENGTH] = {};
-float sQ[SAMPLE_LENGTH] = {};
+float I = 0;
+float Q = 0;
+float lon = 0;
+float lonRef = 0;
+float shor = 0;
+float shorRef = 0;
float decimateLong[4] = {};
float decimateShort[4] = {};
@@ -53,6 +65,8 @@
bool isSampling = true;
int avgIndex = 0;
+char * timeDatestamp = "";
+
void print_array(float *bar,int length, FILE *file){
int i =0;
@@ -77,23 +91,43 @@
return total/length;
}
+void buildIQ(){
+ for(int i = 0; i < SAMPLE_LENGTH; i++){
+ Iarray[i] = cos(2*PI*CARRIER_FREQ*i*TIME_CONST);
+ Qarray[i] = -sin(2*PI*CARRIER_FREQ*i*TIME_CONST);
+ }
+}
+
void tick_out(){
if(isSampling){
- samplesLong[sampleIndex] = AnLong.read();
- samplesShort[sampleIndex] = AnShort.read();
- samplesRefLong[sampleIndex] = AnRefLong.read();
- samplesRefShort[sampleIndex] = AnRefShort.read();
- sampleIndex++;
- if(sampleIndex+1 > SAMPLE_LENGTH){
- sampleIndex--;
- }
- //write
dac0 = sinWave[sinIndex];
sinIndex++;
if((sinIndex+1) > sinRes){
sinIndex = 0;
}
+ lon = AnLong.read();
+ lonRef = AnRefLong.read();
+ shor = AnShort.read();
+ shorRef = AnRefShort.read();
+
+ I = Iarray[sampleIndex];
+ Q = Qarray[sampleIndex];
+ sLI[sampleIndex] = lon*I;
+ sLQ[sampleIndex] = lon*Q;
+ sSI[sampleIndex] = shor*I;
+ sSQ[sampleIndex] = shor*Q;
+ sRefLI[sampleIndex] = lonRef*I;
+ sRefLQ[sampleIndex] = lonRef*Q;
+ sRefSI[sampleIndex] = shorRef*I;
+ sRefSQ[sampleIndex] = shorRef*Q;
+
+ sampleIndex++;
+ if(sampleIndex+1 > SAMPLE_LENGTH){
+ sampleIndex--;
+ }
+
+
}
}
@@ -111,7 +145,7 @@
}
void print_values(){
- fp = fopen("/sd/hello.txt", "r");
+ fp = fopen("/sd/data.txt", "r");
if (fp != NULL) {
fclose(fp);
remove("/sd/hello.txt");
@@ -126,33 +160,23 @@
fclose(fp);
}
-//does not work right now
-bool run_gps(int refresh_Timer, Adafruit_GPS myGPS, int refresh_Time, char c){
- c = myGPS.read(); //queries the GPS
-
- //if (c) { pc.printf("%c", c); } //this line will echo the GPS data if not paused
-
- //check if we recieved a new message from GPS, if so, attempt to parse it,
- if ( myGPS.newNMEAreceived() ) {
- if ( !myGPS.parse(myGPS.lastNMEA()) ) {
- //continue;
- }
- }
-
- //check if enough time has passed to warrant printing GPS info to screen
- //note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
- if (refresh_Timer >= refresh_Time) {
- //refresh_Timer.reset();
- pc.printf("Time: %d:%d:%d.%u\n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
- pc.printf("Date: %d/%d/20%d\n", myGPS.day, myGPS.month, myGPS.year);
- //pc.printf("Fix: %d\n", (int) myGPS.fix);
- //pc.printf("Quality: %d\n", (int) myGPS.fixquality);
- if (myGPS.fix) {
- pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
- }
- return 1;
- }
- return 0;
+void save_point(char * c){
+ fp = fopen("/sd/data.txt", "r");
+ if (fp != NULL) {
+ fclose(fp);
+ remove("/sd/data.txt");
+ pc.printf("Remove an existing file with the same name \n");
+ }
+
+ printf("\nWriting data to the sd card \n");
+ fp = fopen("/sd/data.txt", "w");
+ if (fp == NULL) {
+ pc.printf("Unable to write the file \n");
+ } else {
+ fprintf(fp, c);
+ fprintf(fp, "\n");
+ fclose(fp);
+ }
}
int main(){
@@ -164,8 +188,9 @@
Timer refresh_Timer; //sets up a timer for use in loop; how often do we print GPS info?
Timer sampling_Toggle;
Timer t;
- const int refresh_Time = 700; //refresh time in ms
- const int toggle_Time = 1000;
+ const int refresh_Time = 1000; //refresh time in ms
+ const int sample_Time = 250;
+ const int filter_Time = 2000;
myGPS.begin(9600); //sets baud rate for GPS communication; note this may be changed via Adafruit_GPS::sendCommand(char *)
//a list of GPS commands is available at http://www.adafruit.com/datasheets/PMTK_A08.pdf
@@ -174,6 +199,8 @@
myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
myGPS.sendCommand(PGCMD_ANTENNA);
+ buildIQ();
+
tick1.attach(&tick_out, 0.0001); // below 0.00005 the board can no longer output and read
//tick2.attach(&print_values, 20);
@@ -189,23 +216,33 @@
sampling_Toggle.start();
while(1){
- if (sampling_Toggle.read_ms() >= toggle_Time) {
- if(isSampling){
- t.start();
- filteredLongTemp = qam_in(samplesLong, sI, sQ, &pc);
- filteredRefLongTemp = qam_in(samplesRefLong, sI, sQ, &pc);
- filteredShortTemp = qam_in(samplesShort, sI, sQ, &pc);
- filteredRefShortTemp = qam_in(samplesRefShort, sI, sQ, &pc);
- t.stop();
- pc.printf("Long = %f, longref = %f, Short = %f, shortref = %f in time = %f \n",filteredLongTemp, filteredRefLongTemp, filteredShortTemp, filteredRefShortTemp, t.read());
- t.reset();
- }else{
- sampleIndex = 0;
+ if(isSampling){
+ if (sampling_Toggle.read_ms() >= sample_Time) {
+ isSampling = false;
+ sampling_Toggle.reset();
+
+ filteredLongTemp = qam_in(sLI, sLQ, &pc);
+ filteredRefLongTemp = qam_in(sRefLI, sRefLQ, &pc);
+ filteredShortTemp = qam_in(sSI, sSQ, &pc);
+ filteredRefShortTemp = qam_in(sRefSI, sRefSQ, &pc);
+ pc.printf("Long = %f, Short = %f ",filteredLongTemp, filteredShortTemp);
+
+ fp = fopen("/sd/data.txt", "w");
+ if (fp == NULL) {
+ pc.printf("Unable to write the file \n");
+ } else {
+ fprintf(fp,"Long = %f, Short = %f ",filteredLongTemp/filteredRefShortTemp, filteredShortTemp/filteredRefShortTemp);
+ fclose(fp);
+ }
}
- isSampling = !isSampling;
- sampling_Toggle.reset();
- }
-
+ }else{
+ if (sampling_Toggle.read_ms() >= filter_Time) {
+ isSampling = true;
+ sampling_Toggle.reset();
+
+ sampleIndex = 0;
+ }
+ }
if(!isSampling){
c = myGPS.read();
@@ -219,11 +256,25 @@
//note if refresh_Time is too low or pc.baud is too low, GPS data may be lost during printing
if (refresh_Timer.read_ms() >= refresh_Time) {
refresh_Timer.reset();
- //pc.printf("Time: %d:%d:%d.%u----", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
+ pc.printf("Time: %d:%d:%d.%u \n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
+ fp = fopen("/sd/data.txt", "w");
+ if (fp == NULL) {
+ pc.printf("Unable to write the file \n");
+ } else {
+ fprintf(fp,"Time: %d:%d:%d.%u \n", myGPS.hour, myGPS.minute, myGPS.seconds, myGPS.milliseconds);
+ fclose(fp);
+ }
if (myGPS.fix) {
- //pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
+ pc.printf("Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
+ fp = fopen("/sd/data.txt", "w");
+ if (fp == NULL) {
+ pc.printf("Unable to write the file \n");
+ } else {
+ fprintf(fp,"Location: %5.2f%c, %5.2f%c\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon);
+ fclose(fp);
+ }
}
}
- }
+ }
}
}
\ No newline at end of file