Chris ZL2CCO / Mbed 2 deprecated PSK31Generator

Dependencies:   mbed

Committer:
zl2cco
Date:
Tue Jan 15 17:27:09 2013 +0000
Revision:
0:780646889745
StIl DRAFT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zl2cco 0:780646889745 1 #include "mbed.h"
zl2cco 0:780646889745 2 #include "sin_table.hpp"
zl2cco 0:780646889745 3 #include "varicode_table.hpp"
zl2cco 0:780646889745 4
zl2cco 0:780646889745 5 DigitalOut myled(LED2);
zl2cco 0:780646889745 6 DigitalOut port21(p21);
zl2cco 0:780646889745 7 AnalogOut signal(p18);
zl2cco 0:780646889745 8
zl2cco 0:780646889745 9 Ticker lifepulse;
zl2cco 0:780646889745 10 //Serial pc(USBTX, USBRX); // tx, rx
zl2cco 0:780646889745 11
zl2cco 0:780646889745 12
zl2cco 0:780646889745 13 int deltaPhase;
zl2cco 0:780646889745 14 double Ic, Qc, I, Q, bpsk;
zl2cco 0:780646889745 15 double Ai = 1.0; // Next symbol phase
zl2cco 0:780646889745 16 double Aq = 1.0;
zl2cco 0:780646889745 17
zl2cco 0:780646889745 18 //const float Fc = 400.0; // Carrier frequency in Hertz
zl2cco 0:780646889745 19 //const float Fs = 31.25; // Symbol frequency in Hertz
zl2cco 0:780646889745 20 const float Tick_us = 100.0; // Tick period in microseconds
zl2cco 0:780646889745 21 //const float Tc = (1/Fc); // Carrier signal period in seconds
zl2cco 0:780646889745 22 //const float Ts = (1/Fs); // Symbol signal period in seconds
zl2cco 0:780646889745 23
zl2cco 0:780646889745 24 double As = 0.001;
zl2cco 0:780646889745 25
zl2cco 0:780646889745 26 int SymbolCycles = 320;
zl2cco 0:780646889745 27 int HalfSymbolCycles = 160;
zl2cco 0:780646889745 28 int Cycles = 0; // Keep track of cycles for symbol coding
zl2cco 0:780646889745 29 int SymbolTick = 0;
zl2cco 0:780646889745 30 int SymbolDeltaPhase = 0;
zl2cco 0:780646889745 31
zl2cco 0:780646889745 32 char Message[] = " Welcome to mbed PSK31 beacon! ";
zl2cco 0:780646889745 33 int MsgPtr = 0;
zl2cco 0:780646889745 34 int SymbolBitPos = 0; // 15 positions
zl2cco 0:780646889745 35 int Zeros = 0;
zl2cco 0:780646889745 36 int ChangePhase = 0;
zl2cco 0:780646889745 37 int SendZeros = 60;
zl2cco 0:780646889745 38
zl2cco 0:780646889745 39 void get_next_symbol (void)
zl2cco 0:780646889745 40 {
zl2cco 0:780646889745 41 if (Message[MsgPtr] == NULL) {
zl2cco 0:780646889745 42 MsgPtr = 0;
zl2cco 0:780646889745 43 Zeros = 0;
zl2cco 0:780646889745 44 SymbolBitPos = 0;
zl2cco 0:780646889745 45 }
zl2cco 0:780646889745 46 if (SymbolBitPos == 16) {
zl2cco 0:780646889745 47 SymbolBitPos = 0;
zl2cco 0:780646889745 48 }
zl2cco 0:780646889745 49
zl2cco 0:780646889745 50 if (((varicode[Message[MsgPtr]] << SymbolBitPos)&0x8000) == 0) {
zl2cco 0:780646889745 51 if (Ai > 0) {
zl2cco 0:780646889745 52 Ai = -1.0;
zl2cco 0:780646889745 53 Aq = -1.0;
zl2cco 0:780646889745 54 }
zl2cco 0:780646889745 55 else {
zl2cco 0:780646889745 56 Ai = 1.0;
zl2cco 0:780646889745 57 Aq = 1.0;
zl2cco 0:780646889745 58 }
zl2cco 0:780646889745 59
zl2cco 0:780646889745 60 ChangePhase = 1;
zl2cco 0:780646889745 61 Zeros++;
zl2cco 0:780646889745 62 if (Zeros == 2) {
zl2cco 0:780646889745 63 MsgPtr++;
zl2cco 0:780646889745 64 Zeros = 0;
zl2cco 0:780646889745 65 SymbolBitPos = 0;
zl2cco 0:780646889745 66 }
zl2cco 0:780646889745 67 else
zl2cco 0:780646889745 68 SymbolBitPos++;
zl2cco 0:780646889745 69 }
zl2cco 0:780646889745 70 else {
zl2cco 0:780646889745 71 ChangePhase = 0;
zl2cco 0:780646889745 72 Zeros = 0;
zl2cco 0:780646889745 73 SymbolBitPos++;
zl2cco 0:780646889745 74 }
zl2cco 0:780646889745 75 }
zl2cco 0:780646889745 76
zl2cco 0:780646889745 77 void genpsk31() {
zl2cco 0:780646889745 78
zl2cco 0:780646889745 79 signal = bpsk;
zl2cco 0:780646889745 80
zl2cco 0:780646889745 81 // ==============================================================================
zl2cco 0:780646889745 82 // Carrier Frequency Part
zl2cco 0:780646889745 83 // ==============================================================================
zl2cco 0:780646889745 84 Ic = SIN[deltaPhase];
zl2cco 0:780646889745 85 Qc = COS[deltaPhase];
zl2cco 0:780646889745 86
zl2cco 0:780646889745 87 deltaPhase++;
zl2cco 0:780646889745 88 if (deltaPhase == SIN_TABLE_SIZE) {
zl2cco 0:780646889745 89 deltaPhase = 0;
zl2cco 0:780646889745 90 }
zl2cco 0:780646889745 91
zl2cco 0:780646889745 92 // ==============================================================================
zl2cco 0:780646889745 93 // Symbol Part
zl2cco 0:780646889745 94 // ==============================================================================
zl2cco 0:780646889745 95
zl2cco 0:780646889745 96 // Is this end of BPSK period?
zl2cco 0:780646889745 97 if (Cycles == 0) { // Start of symbol period
zl2cco 0:780646889745 98 if (SendZeros) {
zl2cco 0:780646889745 99 SendZeros--;
zl2cco 0:780646889745 100 if (I < 0) {
zl2cco 0:780646889745 101 Ai = -1.0;
zl2cco 0:780646889745 102 Aq = -1.0;
zl2cco 0:780646889745 103 }
zl2cco 0:780646889745 104 else {
zl2cco 0:780646889745 105 Ai = 1.0;
zl2cco 0:780646889745 106 Aq = 1.0;
zl2cco 0:780646889745 107 }
zl2cco 0:780646889745 108 ChangePhase = 1;
zl2cco 0:780646889745 109 }
zl2cco 0:780646889745 110 else
zl2cco 0:780646889745 111 get_next_symbol();
zl2cco 0:780646889745 112 }
zl2cco 0:780646889745 113
zl2cco 0:780646889745 114 if ((Cycles < HalfSymbolCycles)&&(ChangePhase==1)) { // Transition to next phase
zl2cco 0:780646889745 115 I = Ai*SIN[SymbolDeltaPhase];
zl2cco 0:780646889745 116 Q = Aq*SIN[SymbolDeltaPhase];
zl2cco 0:780646889745 117 }
zl2cco 0:780646889745 118 else {
zl2cco 0:780646889745 119 if (I<0) I = Q = -1;
zl2cco 0:780646889745 120 else I = Q = 1;
zl2cco 0:780646889745 121 }
zl2cco 0:780646889745 122
zl2cco 0:780646889745 123
zl2cco 0:780646889745 124 SymbolTick++;
zl2cco 0:780646889745 125 if (SymbolTick == 13) {
zl2cco 0:780646889745 126 SymbolTick = 0;
zl2cco 0:780646889745 127 SymbolDeltaPhase++;
zl2cco 0:780646889745 128 if (SymbolDeltaPhase == 20) SymbolDeltaPhase = 6;
zl2cco 0:780646889745 129 }
zl2cco 0:780646889745 130
zl2cco 0:780646889745 131 Cycles++;
zl2cco 0:780646889745 132 if (Cycles == SymbolCycles) {
zl2cco 0:780646889745 133 if (port21) port21=0; else port21=1;
zl2cco 0:780646889745 134 //port21 = 1;
zl2cco 0:780646889745 135 Cycles = 0;
zl2cco 0:780646889745 136 SymbolTick = 0;
zl2cco 0:780646889745 137 SymbolDeltaPhase = 6;
zl2cco 0:780646889745 138 }
zl2cco 0:780646889745 139
zl2cco 0:780646889745 140 // ==============================================================================
zl2cco 0:780646889745 141 // Calculate BPSK
zl2cco 0:780646889745 142 // ==============================================================================
zl2cco 0:780646889745 143 bpsk = As*(I*Ic + Q*Qc) + 0.5;
zl2cco 0:780646889745 144
zl2cco 0:780646889745 145 //port21 = 0;
zl2cco 0:780646889745 146 }
zl2cco 0:780646889745 147
zl2cco 0:780646889745 148
zl2cco 0:780646889745 149
zl2cco 0:780646889745 150 int main() {
zl2cco 0:780646889745 151 deltaPhase = 0;
zl2cco 0:780646889745 152 Cycles = 0;
zl2cco 0:780646889745 153 I = 1.0;
zl2cco 0:780646889745 154 Q = 1.0;
zl2cco 0:780646889745 155 Ic = 1.0;
zl2cco 0:780646889745 156 Qc = 1.0;
zl2cco 0:780646889745 157 port21 = 0;
zl2cco 0:780646889745 158 lifepulse.attach_us(&genpsk31,Tick_us);
zl2cco 0:780646889745 159
zl2cco 0:780646889745 160 while(1) {
zl2cco 0:780646889745 161 myled = 1;
zl2cco 0:780646889745 162 wait(0.2);
zl2cco 0:780646889745 163 myled = 0;
zl2cco 0:780646889745 164 wait(0.2);
zl2cco 0:780646889745 165 //pc.printf("Hello World!\n\r");
zl2cco 0:780646889745 166
zl2cco 0:780646889745 167 }
zl2cco 0:780646889745 168 }
zl2cco 0:780646889745 169
zl2cco 0:780646889745 170