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