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.
main.cpp@0:780646889745, 2013-01-15 (annotated)
- Committer:
- zl2cco
- Date:
- Tue Jan 15 17:27:09 2013 +0000
- Revision:
- 0:780646889745
StIl DRAFT
Who changed what in which revision?
| User | Revision | Line number | New 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 |