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

Dependencies:   mbed

Revision:
3:5cae780fe61e
Parent:
2:47210a089f76
Child:
4:3f3d369ca0e3
--- a/main.cpp	Wed Jul 20 13:51:07 2016 +0000
+++ b/main.cpp	Wed Jul 20 14:47:00 2016 +0000
@@ -4,25 +4,44 @@
 PwmOut mypwm(PC_8);
 
 DigitalOut myled(LED1);
-int data;
+//int data;
 float data_sin;
+bool flip_flag;
+float keika_t;
+#define late  0.00001
+//100khz-1
+#define freq_out 3000
 
-void flip(){
-    if(data > 100)   data = 0;
-    else data++; 
-    data_sin = sin((data/100)*6.28) + 1;
-    }
+void flip()
+{
+    //if(data > 100)   data = 0;
+    //else data++;
+    //data_sin = sin((data/100)*6.28) + 1;
+    flip_flag = 1;
+}
 
 
-int main() {
-    
+int main()
+{
+
     mypwm.period_us(10);
-    flipper.attach_us(&flip, 20);
-    
-  
+    flipper.attach_us(&flip, 10);
+
+    float keika_t;
+
+
     //printf("pwm set to %.2f %%\n", mypwm.read() * 100);
-    
+
     while(1) {
-        mypwm.write( data_sin / 10 );
+        if(flip_flag == 1) {
+
+            data_sin = sin(6.28 * keika_t * freq_out) + 1;
+            mypwm.write( data_sin / 10 );
+
+            if(keika_t + late > 1) keika_t = keika_t + late - 1;
+            else keika_t += late;
+
+            flip_flag = 0;
+        }
     }
 }