Здравейте, след дълго отлагане реших да довърша започнатото от тази тема:
viewtopic.php?p=149663#p149663Разучавам софта за РС , който събира данните от USB осцилоскопа. Писан е на Visual C# ( за първи път работя с него)
Декомпилирах програмата за да видя как обработва данните от USB осцилоскопа.
Всичко добре, обаче има една много странно за мен обработка на
данните.
Прочита буфер
IOBuf[i] от 512 байта ( това са данните които са записани във FIFO Паметта - проверени са със лог. анализатор ) и би следвало това да е реалния сигнал който се чете от АЦП-то.
Каквото излиза от FIFO Паметта , това и получава програмата за компютъра.
Обаче са много хаотични данни, варират от 0-255.
И тук във РС- софтура видях една обработка на тези данни, на която не мога да разбера смисъла защо се прави :
for (int i = 0; i < 511; i++)
{
this.IOBuf[i] = array[(int)this.IOBuf[i + 1]];
}Т.е разбирам какво прави: за стойноста на IOBuf[i + 1] взема готова данна от array.
Но защо се прави?
Някакъв филтър ли е, що ли ?
От къде е този масив
array с готови числа?
Ще съм много благодарен за всяка помощ
| | |
| Код: private void Read_USB_Timer_Tick_1(object sender, EventArgs e) { byte[] array = new byte[] {0 128 64 192 32 160 96 224 16 144 80 208 48 176 112 240 8 136 72 200 40 168 104 232 24 152 88 216 56 184 120 248 4 132 68 196 36 164 100 228 20 148 84 212 52 180 116 244 12 140 76 204 44 172 108 236 28 156 92 220 60 188 124 252 2 130 66 194 34 162 98 226 18 146 82 210 50 178 114 242 10 138 74 202 42 170 106 234 26 154 90 218 58 186 122 250 6 134 70 198 38 166 102 230 22 150 86 214 54 182 118 246 14 142 78 206 46 174 110 238 30 158 94 222 62 190 126 254 1 129 65 193 33 161 97 225 17 145 81 209 49 177 113 241 9 137 73 201 41 169 105 233 25 153 89 217 57 185 121 249 5 133 69 197 37 165 101 229 21 149 85 213 53 181 117 245 13 141 77 205 45 173 109 237 29 157 93 221 61 189 125 253 3 131 67 195 35 163 99 227 19 147 83 211 51 179 115 243 11 139 75 203 43 171 107 235 27 155 91 219 59 187 123 251 7 135 71 199 39 167 103 231 23 151 87 215 55 183 119 247 15 143 79 207 47 175 111 239 31 159 95 223 63 191 127 255 } int num = 0; byte b = 0; byte b2 = 0; int num2 = 512; num = 0; SLUSBXpressDLL.Status = SLUSBXpressDLL.SI_Read(SLUSBXpressDLL.hUSBDevice, ref this.IOBuf[0], num2, ref num, 0);
if (num != num2 || SLUSBXpressDLL.Status != 0) { MessageBox.Show(string.Concat(new string[] { "Error writing to USB. Read ", num.ToString(), " of ", num2.ToString(), " bytes. Application is aborting. Reset hardware and try again." })); Application.Exit(); } if (this.IOBuf[0] == 0) { int num3 = 0; for (int i = 0; i < 511; i++) { this.IOBuf[i] = array[(int)this.IOBuf[i + 1]]; } int num4 = (int)this.IOBuf[0]; int num5 = (int)this.IOBuf[0]; for (int j = 0; j < 510; j++) { if ((int)this.IOBuf[j] > num4) { num4 = (int)this.IOBuf[j]; } if ((int)this.IOBuf[j] < num5) { num5 = (int)this.IOBuf[j]; } } int num6 = (num4 + num5) / 2; if (this.first_null_A) { num3 = num6; this.first_null_A = false; } else if (num3 - num6 > 20 || num6 - num3 > 20) { this.first_null_A = true; } if (this.SynchronizationA(num4, num3)) { b = 1; } else { b = 0; } } if (this.IOBuf[0] == 1) { int num7 = 0; for (int i = 0; i < 510; i++) { //this.IOBuf[i] = array[(int)this.IOBuf[i + 1]]; } int num4 = (int)this.IOBuf[0]; int num5 = (int)this.IOBuf[0]; for (int j = 0; j < 510; j++) { if ((int)this.IOBuf[j] > num4) { num4 = (int)this.IOBuf[j]; } if ((int)this.IOBuf[j] < num5) { num5 = (int)this.IOBuf[j]; } } int num6 = (num4 + num5) / 2; if (this.first_null_B) { num7 = num6; this.first_null_B = false; } else if (num7 - num6 > 20 || num6 - num7 > 20) { this.first_null_B = true; } if (this.SynchronizationB(num4, num7)) { b2 = 1; } else { b2 = 0; } } if (b == 1 || b2 == 1) { this.pictureBox1.Refresh(); }
}
| |
| | |
Накратко : УСБ осцолоскоп от тук :
http://radiokot.ru/circuit/digital/measure/29/Като аз го преработвам да е с LCD дисплей и един ПИК 18F6722.
схемата е :
1. АЦП
2. ФиФо памет за данните от АЦП-то
3.Микроконтролер и ЛЦД
Много прилича на това, но е без XC9572