FFT power Spectrum on AQM1248 LCD. - FRDM-KL46Z - inner LCD - inner MAG3110 Magnetometer - AQM1248 micro graphical LCD - Dr.Ooura's very fast FFT library thanks.
Dependencies: MAG3110 SLCD aqm1248a_lcd mbed
FRDM-KL46Zに内蔵されているMAG3110で磁力を測定し、FFTでパワースペクトルを求めてグラフ表示しています。と言っても自分ではほとんどコードは書いておらず、すべては
- 内蔵LCD
- 内蔵MAG3110
- AQM1248
- 大浦先生のFFTライブラリ
以上のライブラリのおかげです。ありがとうございます。
プログラムとしては:
- Intervalを使ってバッファにMAG3110からのデータを詰め込む
- メインループではバッファを監視し、バッファが一杯になったらFFTかけてスペクトル表示
を繰り返しているだけです。せめてRTOSを使ってFFT〜スペクトル表示も別タスクにしないと…。
関連ブログ:http://jiwashin.blogspot.com/2015/05/fft.html
なお、AQM1248ライブラリのソースを拝見するとサポートしているのは「LPC1768とKL05」という感じです。KL46では動作確認しましたが、その他のプラットフォーム上で使用する場合には、ピンアサインなどを十分確認してください。その点に気をつければとても使い勝手の良いライブラリです。開発者の方に改めてお礼申し上げます。
なお、AQM1248とKL46との接続は以下の通りです:
AQM1248 | KL46 |
Vcc | 3.3v |
CS | D10 |
RESET | D9 |
RS | D8 |
SCLK | D13 |
SDI | D11 |
main.cpp@1:ad135c286d4d, 2015-05-04 (annotated)
- Committer:
- TareObjects
- Date:
- Mon May 04 08:53:50 2015 +0000
- Revision:
- 1:ad135c286d4d
- Parent:
- 0:47be4d9de4b9
Faster; ; - Less Sampling datas (256->128); - Wait for status, and fetch data; // I tried to use INT1, but I could not get interrupt....
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TareObjects | 0:47be4d9de4b9 | 1 | #include "mbed.h" |
TareObjects | 0:47be4d9de4b9 | 2 | #include "SLCD.h" |
TareObjects | 0:47be4d9de4b9 | 3 | #include "MAG3110.h" |
TareObjects | 0:47be4d9de4b9 | 4 | #include "fft4g.h" |
TareObjects | 0:47be4d9de4b9 | 5 | #include "aqm1248a_lcd.h" |
TareObjects | 0:47be4d9de4b9 | 6 | |
TareObjects | 1:ad135c286d4d | 7 | #define NMAX 64 |
TareObjects | 0:47be4d9de4b9 | 8 | #define NMAXSQRT 32 |
TareObjects | 0:47be4d9de4b9 | 9 | |
TareObjects | 0:47be4d9de4b9 | 10 | #define MAX(x,y) ((x) > (y) ? (x) : (y)) |
TareObjects | 0:47be4d9de4b9 | 11 | |
TareObjects | 0:47be4d9de4b9 | 12 | MAG3110 mag(PTE25, PTE24); |
TareObjects | 1:ad135c286d4d | 13 | InterruptIn magInt(PTD1); |
TareObjects | 1:ad135c286d4d | 14 | PwmOut Red(PTE29); |
TareObjects | 1:ad135c286d4d | 15 | |
TareObjects | 0:47be4d9de4b9 | 16 | SLCD slcd; |
TareObjects | 0:47be4d9de4b9 | 17 | aqm1248a_lcd lcd; |
TareObjects | 0:47be4d9de4b9 | 18 | |
TareObjects | 0:47be4d9de4b9 | 19 | Ticker reader; |
TareObjects | 0:47be4d9de4b9 | 20 | |
TareObjects | 0:47be4d9de4b9 | 21 | bool modeFilling = true; |
TareObjects | 0:47be4d9de4b9 | 22 | int nFilled = 0; |
TareObjects | 0:47be4d9de4b9 | 23 | double magBuffer[NMAX+1]; |
TareObjects | 0:47be4d9de4b9 | 24 | |
TareObjects | 0:47be4d9de4b9 | 25 | void readerFunction() { |
TareObjects | 1:ad135c286d4d | 26 | if ((mag.dataReady() & 1) == 0) return; // XDR:X-axis new Data Available. |
TareObjects | 1:ad135c286d4d | 27 | |
TareObjects | 1:ad135c286d4d | 28 | Red = (float)nFilled / (float)NMAX; |
TareObjects | 0:47be4d9de4b9 | 29 | if (modeFilling) { |
TareObjects | 0:47be4d9de4b9 | 30 | float x; |
TareObjects | 0:47be4d9de4b9 | 31 | mag.getX(&x); |
TareObjects | 0:47be4d9de4b9 | 32 | |
TareObjects | 0:47be4d9de4b9 | 33 | if (nFilled < NMAX) { |
TareObjects | 0:47be4d9de4b9 | 34 | magBuffer[nFilled++] = x; |
TareObjects | 0:47be4d9de4b9 | 35 | if (nFilled >= NMAX) { |
TareObjects | 0:47be4d9de4b9 | 36 | modeFilling = false; |
TareObjects | 0:47be4d9de4b9 | 37 | } |
TareObjects | 0:47be4d9de4b9 | 38 | } |
TareObjects | 0:47be4d9de4b9 | 39 | } |
TareObjects | 0:47be4d9de4b9 | 40 | } |
TareObjects | 0:47be4d9de4b9 | 41 | |
TareObjects | 0:47be4d9de4b9 | 42 | |
TareObjects | 0:47be4d9de4b9 | 43 | void putdata(int n, double *a) |
TareObjects | 0:47be4d9de4b9 | 44 | { |
TareObjects | 0:47be4d9de4b9 | 45 | int j; |
TareObjects | 0:47be4d9de4b9 | 46 | |
TareObjects | 0:47be4d9de4b9 | 47 | double pi2 = 3.14159265*2 / n; |
TareObjects | 0:47be4d9de4b9 | 48 | for (j = 0; j <n; j++) { |
TareObjects | 0:47be4d9de4b9 | 49 | a[j] = sin(j*pi2*10)*10 + sin(j*pi2*15)*5 + sin(j*pi2*20)*10; |
TareObjects | 0:47be4d9de4b9 | 50 | } |
TareObjects | 0:47be4d9de4b9 | 51 | } |
TareObjects | 0:47be4d9de4b9 | 52 | |
TareObjects | 0:47be4d9de4b9 | 53 | |
TareObjects | 0:47be4d9de4b9 | 54 | int main() |
TareObjects | 0:47be4d9de4b9 | 55 | { |
TareObjects | 0:47be4d9de4b9 | 56 | char buf[80]; |
TareObjects | 0:47be4d9de4b9 | 57 | int n, ip[NMAXSQRT + 2]; |
TareObjects | 0:47be4d9de4b9 | 58 | double w[NMAX * 5 / 4]; |
TareObjects | 0:47be4d9de4b9 | 59 | ip[0] = 0; |
TareObjects | 0:47be4d9de4b9 | 60 | n = NMAX; |
TareObjects | 0:47be4d9de4b9 | 61 | |
TareObjects | 0:47be4d9de4b9 | 62 | int cnt = 0; |
TareObjects | 0:47be4d9de4b9 | 63 | |
TareObjects | 1:ad135c286d4d | 64 | Red.period_ms(1); |
TareObjects | 1:ad135c286d4d | 65 | |
TareObjects | 1:ad135c286d4d | 66 | Red = 1; |
TareObjects | 1:ad135c286d4d | 67 | |
TareObjects | 0:47be4d9de4b9 | 68 | lcd.setmode(NORMAL); |
TareObjects | 0:47be4d9de4b9 | 69 | lcd.set_contrast(25); |
TareObjects | 0:47be4d9de4b9 | 70 | |
TareObjects | 1:ad135c286d4d | 71 | reader.attach(&readerFunction, 0.001); |
TareObjects | 1:ad135c286d4d | 72 | // magInt.mode(PullUp); |
TareObjects | 1:ad135c286d4d | 73 | // magInt.rise(readerFunction); |
TareObjects | 1:ad135c286d4d | 74 | |
TareObjects | 0:47be4d9de4b9 | 75 | mag.enable(); |
TareObjects | 0:47be4d9de4b9 | 76 | |
TareObjects | 1:ad135c286d4d | 77 | wait(0.1); |
TareObjects | 0:47be4d9de4b9 | 78 | |
TareObjects | 1:ad135c286d4d | 79 | int n2 = n/2; |
TareObjects | 1:ad135c286d4d | 80 | int height = lcd.height(); |
TareObjects | 1:ad135c286d4d | 81 | int width = lcd.width(); |
TareObjects | 1:ad135c286d4d | 82 | int barWidth = lcd.width() / n2; |
TareObjects | 1:ad135c286d4d | 83 | |
TareObjects | 0:47be4d9de4b9 | 84 | while (1) { |
TareObjects | 1:ad135c286d4d | 85 | while(modeFilling == true) wait(0.01); |
TareObjects | 0:47be4d9de4b9 | 86 | |
TareObjects | 0:47be4d9de4b9 | 87 | rdft(n, 1, magBuffer, ip, w); |
TareObjects | 0:47be4d9de4b9 | 88 | |
TareObjects | 0:47be4d9de4b9 | 89 | double max = 0; |
TareObjects | 0:47be4d9de4b9 | 90 | for (int i = 0; i < n2; i++) { |
TareObjects | 0:47be4d9de4b9 | 91 | int i2 = i*2; |
TareObjects | 0:47be4d9de4b9 | 92 | magBuffer[i] = magBuffer[i2]*magBuffer[i2] + magBuffer[i2+1]*magBuffer[i2+1]; |
TareObjects | 0:47be4d9de4b9 | 93 | if (i > 0 && magBuffer[i] > max) max = magBuffer[i]; |
TareObjects | 0:47be4d9de4b9 | 94 | } |
TareObjects | 0:47be4d9de4b9 | 95 | |
TareObjects | 0:47be4d9de4b9 | 96 | lcd.cls(); |
TareObjects | 0:47be4d9de4b9 | 97 | |
TareObjects | 0:47be4d9de4b9 | 98 | lcd.locate(0,0); |
TareObjects | 0:47be4d9de4b9 | 99 | lcd.printf("%lf", max); |
TareObjects | 0:47be4d9de4b9 | 100 | |
TareObjects | 0:47be4d9de4b9 | 101 | max = height / max; |
TareObjects | 0:47be4d9de4b9 | 102 | |
TareObjects | 0:47be4d9de4b9 | 103 | for (int i = 1; i < n2; i++) { |
TareObjects | 1:ad135c286d4d | 104 | lcd.fillrect((i-1)*barWidth, height-1, i*barWidth-1, height-1-max*magBuffer[i], 1); |
TareObjects | 0:47be4d9de4b9 | 105 | } |
TareObjects | 0:47be4d9de4b9 | 106 | |
TareObjects | 0:47be4d9de4b9 | 107 | sprintf(buf, "%4d", cnt++); |
TareObjects | 0:47be4d9de4b9 | 108 | slcd.printf(buf); |
TareObjects | 0:47be4d9de4b9 | 109 | if (cnt > 9999) cnt = 0; |
TareObjects | 0:47be4d9de4b9 | 110 | |
TareObjects | 0:47be4d9de4b9 | 111 | nFilled = 0; |
TareObjects | 0:47be4d9de4b9 | 112 | modeFilling = true; |
TareObjects | 0:47be4d9de4b9 | 113 | } |
TareObjects | 0:47be4d9de4b9 | 114 | } |
TareObjects | 0:47be4d9de4b9 | 115 | |
TareObjects | 0:47be4d9de4b9 | 116 |