間欠カオス計算と言うのがエレキジャックのLEDイルミネーションの連載にあったのを参考に、ほかのブログなども参考にしてでっち上げました。先駆者ブログの作者様に感謝します。
説明:
xはfloatです。
led_pwm(i)と言う関数を呼び、256階調(0は消灯、255が全点灯)の表現してます。TMR0(16MHzでシステムクロックをプリスケなし4MHz×80)で20μs単位で割り込みを1単位で256回回るので、5.12msが基本点灯単位となります。minと言うのは最小明るさ設定で、それ以上暗くはしない(消灯しない)ということにしてます。
xのスタート値やa計算時のオフセット値、係数値や明るさ初期値i
なんかをi2cキーで指定してEEPROMに入れる。i2cがつながってないときはEEPROM設定で立ち上がるという計画でしたが、i2c関連関数を入れる前にメモリーが95%を超えてしまいました。
PIC16F1827でとりあえずやるかと思ってます。そうなるとi2cキーでなくてもよいが、あとあと8ピンPICに持っていくならi2cだし、どうするかと逡巡中。
現在はPIC12F1822においてEEPROM定義値で動いています。
while(1) { if(x<0.5){x=x+2*x*x;} // caos calculating else {x=x-2*(1-x)*(1-x);} a=40+(int)(150*x); // a is quarter dimmer cycle for(k=0;k<a;k++) // go up { if(i<256){ i++;} led_pwm(i); } for(k=0;k<2*a;k++) // go down { if(i>0){i--;} if(i<min){i=min;} // MIN level led_pwm(i); } for(k=0;k<a;k++) // go up { if(i<256){ i++;} led_pwm(i); } }
それでですね。このプログラムで点灯した時のLED電圧をDSO QUADの周波数応答(内部発生の信号をFFTするのを、無理無理に内部信号無視して外部信号を与えた結果)で観測しました。黄緑が電圧のスペクトラムです。黄色は位相ですが、今回の観測では意味ありません。
文献ではパワースペクトラムでオクターブ-20dBです。100Hz以下直流成分が低いのも気にかかります。