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との接続は以下の通りです:

AQM1248KL46
Vcc3.3v
CSD10
RESETD9
RSD8
SCLKD13
SDID11
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?

UserRevisionLine numberNew 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