F401REにてアナログモデリングシンセもどきを作ってみました。 リングモジュレーターっぽいことやってみてます。正弦波、三角波、矩形波の関数が用意してあります。sin(2pift)のftをサンプリングレートごとに積分したものをiftとしてます。iftのポインタを関数に与えるだけで特に計算は入りません。

Dependencies:   mbed

Committer:
gitakichi
Date:
Wed Jul 20 15:09:13 2016 +0000
Revision:
4:3f3d369ca0e3
Parent:
3:5cae780fe61e
Child:
5:f798a173eefa
???????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gitakichi 0:1b56cf88e38c 1 #include "mbed.h"
gitakichi 0:1b56cf88e38c 2
gitakichi 1:1b9ca25019a6 3 Ticker flipper;
gitakichi 0:1b56cf88e38c 4 PwmOut mypwm(PC_8);
gitakichi 4:3f3d369ca0e3 5 DigitalIn sw(USER_BUTTON);
gitakichi 4:3f3d369ca0e3 6
gitakichi 0:1b56cf88e38c 7
gitakichi 0:1b56cf88e38c 8 DigitalOut myled(LED1);
gitakichi 3:5cae780fe61e 9 //int data;
gitakichi 2:47210a089f76 10 float data_sin;
gitakichi 3:5cae780fe61e 11 bool flip_flag;
gitakichi 4:3f3d369ca0e3 12
gitakichi 3:5cae780fe61e 13 #define late 0.00001
gitakichi 3:5cae780fe61e 14 //100khz-1
gitakichi 1:1b9ca25019a6 15
gitakichi 3:5cae780fe61e 16 void flip()
gitakichi 3:5cae780fe61e 17 {
gitakichi 3:5cae780fe61e 18 //if(data > 100) data = 0;
gitakichi 3:5cae780fe61e 19 //else data++;
gitakichi 3:5cae780fe61e 20 //data_sin = sin((data/100)*6.28) + 1;
gitakichi 3:5cae780fe61e 21 flip_flag = 1;
gitakichi 3:5cae780fe61e 22 }
gitakichi 1:1b9ca25019a6 23
gitakichi 0:1b56cf88e38c 24
gitakichi 3:5cae780fe61e 25 int main()
gitakichi 3:5cae780fe61e 26 {
gitakichi 3:5cae780fe61e 27
gitakichi 1:1b9ca25019a6 28 mypwm.period_us(10);
gitakichi 3:5cae780fe61e 29 flipper.attach_us(&flip, 10);
gitakichi 3:5cae780fe61e 30
gitakichi 3:5cae780fe61e 31 float keika_t;
gitakichi 4:3f3d369ca0e3 32 int freq_out = 500;
gitakichi 3:5cae780fe61e 33
gitakichi 3:5cae780fe61e 34
gitakichi 1:1b9ca25019a6 35 //printf("pwm set to %.2f %%\n", mypwm.read() * 100);
gitakichi 3:5cae780fe61e 36
gitakichi 0:1b56cf88e38c 37 while(1) {
gitakichi 4:3f3d369ca0e3 38
gitakichi 4:3f3d369ca0e3 39 if(sw == 0) freq_out = 5000;
gitakichi 4:3f3d369ca0e3 40 else freq_out = 1000;
gitakichi 4:3f3d369ca0e3 41
gitakichi 3:5cae780fe61e 42 if(flip_flag == 1) {
gitakichi 3:5cae780fe61e 43
gitakichi 3:5cae780fe61e 44 data_sin = sin(6.28 * keika_t * freq_out) + 1;
gitakichi 3:5cae780fe61e 45 mypwm.write( data_sin / 10 );
gitakichi 3:5cae780fe61e 46
gitakichi 3:5cae780fe61e 47 if(keika_t + late > 1) keika_t = keika_t + late - 1;
gitakichi 3:5cae780fe61e 48 else keika_t += late;
gitakichi 3:5cae780fe61e 49
gitakichi 3:5cae780fe61e 50 flip_flag = 0;
gitakichi 3:5cae780fe61e 51 }
gitakichi 0:1b56cf88e38c 52 }
gitakichi 0:1b56cf88e38c 53 }