Yet another implementation of wave function generator

Dependencies:   mbed vt100

A function generator implemented using DAC of KL25Z on FRDM-KL25Z
On 13-Dec-2015 Support for FRDM-K64F added.

Kinetis の DAC を使用したファンクションジェネレータ(以下funcgen)です。
13-Dec-2015 FRDM-K64F のサポートも追加しました。

/media/uploads/Rhyme/funcgen_top.jpg

Generates a 1KHz sin wave of 3.0V (p-p) when started.

The analog signal output is analogOut (PTE30), for the GND I was using GND of J2.

起動直後には 1KHz 3V(p-p) のサイン波を生成しています。

アナログ信号は PTE30 から、 GNDについては、J2 の GNDを使用しています。

This funcgen can generate multiple sin, saw, sqr, tri waves in different freq, amp simultaneously.
All the waves are summed to form the output.

この funcgen では 複数の異なる周期、振幅の正弦波、のこぎり波、矩形波、三角波を同時に生成することが可能です。
生成された波形はすべて加算される形で出力波形となります。

For example following wave form was generated with
sin amp = 0.5V freq = 1000 Hz
sin amp = 0.5V freq = 123 Hz
sqr amp = 0.5V freq = 20 Hz
saw amp = 1.0V freq = 3Hz

たとえば下図の波形は
サイン波 0.5V 1000Hz
サイン波 0.5V 123 Hz
矩形波 0.5V 20Hz
のこぎり波 1.0V 3Hz
を合成して得られたものです。

/media/uploads/Rhyme/summed_output.jpg

Some tutorial (簡単な使い方)

When you connect a terminal program with 115200 baud, 8bit, no parity,
after reset command menu will be presented.
You may also want to enable local echo, so that you can see what you are typing.

ターミナルプログラムで 115200 baud 8bit ノーパリティで接続していると、
リセット後に下記のようなコマンドメニューが表示されます。
入力している文字が表示されるように Local Echo を有効にしておきます。

/media/uploads/Rhyme/startup_menus.jpg

If you type "list" to the prompt, list of current wave(s) will be shown.

プロンプトに list と入力すると、現在の波形リストが表示されます。

/media/uploads/Rhyme/list_cmds.jpg

So we can tell that 1 wave of sine whose amplitude is 3.0V
and Frequency is 1000Hz is currently running.
Please ignore duty for sin and saw waves ;-) 
The "*" letter in the left shows that this signal is currently selected for operation.

これから、1KHz 3V(p-p)の正弦波が生成されていることがわかります。
デューティー比も表示されていますが、正弦波(sin)とのごきり波(saw)に関しては、
これは無視してください。 
また、左側についている“*”マークが、現在この信号がコマンドの対象になっていることを示しています。

At this time the wave form would look like

この時点で波形は下記のようになっています

/media/uploads/Rhyme/sin_3v_1khz.jpg

If you type "amp 1" the wave form will be

ここで amp 1 と入力すると波形は下記のようになります

/media/uploads/Rhyme/sin_1v_1khz.jpg

Next let's play with a square wave!
To remove current wave type "delete", then type "sqr 3 1000 50"
which means first delete the sin wave then add a square wave of 3V, 1KHz and duty 50%.

それでは矩形波で遊んでみましょう!
まず正弦波を消すのに“delete”とタイプして、次に“sqr 3 1000 50” とタイプしてください。
これは3V 1KHz デューティ50%の正弦波の追加することになります。

/media/uploads/Rhyme/add_sqr.jpg

The wave form of Oscilloscope will be something like

オシロの波形は下記のような感じになります

/media/uploads/Rhyme/sqr_3v_1khz_50.jpg

Now if you type "duty 0" you will get

ここで “duty 0” と入力すると

/media/uploads/Rhyme/sqr_3v_1khz_0.jpg

For "duty 20" you will get

“duty 20”では

/media/uploads/Rhyme/sqr_3v_1khz_20.jpg

For "duty 80" you will get

"duty 80" では

/media/uploads/Rhyme/sqr_3v_1khz_80.jpg

And finally if you specify "duty 100", you will get

最後に“duty 100”を指定すると

/media/uploads/Rhyme/sqr_3v_1khz_100.jpg

This way, you can also get DC bias of this sqr wave's amplitude.

この方法で、この矩形波の振幅に等しいDC入力とすることもできます。

Next, let's try "tri wave", again type "delete" and "tri 3 1000 50", you will get

次に三角波行ってみましょう、再び“delete”、“tri 3 1000 50”と入力しますと

/media/uploads/Rhyme/tri_3_1khz_50.jpg

Again if we try, "duty 0", we will get

“duty 0”とすると

/media/uploads/Rhyme/tri_3_1khz_0.jpg

For "duty 20"

"duty 20" では

/media/uploads/Rhyme/tri_3_1khz_20.jpg

For "duty 80"

"duty 80" では

/media/uploads/Rhyme/tri_3_1khz_80.jpg

And finally "duty 100"

最後に "duty 100"

/media/uploads/Rhyme/tri_3_1khz_100.jpg

Please note that for the "duty 100",
the triangle wave is identical with "saw" wave,
which I noticed after implementing both of them orz

“duty 100”の三角波はのこぎり波と同じものになります。 
気が付いたのは両方の波形をプログラムしちゃってからでした・・・ orz

Multiple waves sample  複数波形の合成例

Now let's try multiple wave composition!

それでは複数波形の合成を試してみましょう!

First let's delete the previous wave, by "delete"

最初に先の信号を"delete" で消しておきます。

Then type, "sqr 1 100 50", "sin 1 700", you will get

次に "sqr 1 100 50", "sin 1 700" とすると

/media/uploads/Rhyme/sqr_1_sin_1.jpg

/media/uploads/Rhyme/sqr_1_sin_1_wave.jpg

And adding a saw wave by "saw 1 10" will give us

最後にのこぎり波を "saw 1 10" で追加すると

/media/uploads/Rhyme/sqr_1_sin_1_saw_1_wave.jpg

If we enter "list" command we will see

ここで list コマンドを入力すると

/media/uploads/Rhyme/list_waves.jpg

Note the "*" letter specify the selected wave,
so if you enter "amp", "freq", "duty", "delete" command,
it will be applied to this wave.
If you want to manipulate other wave,
use "select #" command to specify the wave you'd like to modify.
For example, if you enter "select 0" then the sqr wave at No.0 will be selected.

左側の"*"マークが現在選択されている波形を示しています、
現在"amp", "freq", "duty", "delete" などのコマンドを入力した場合、
その操作はこの波形に対して行われます。
他の波形をモディファイしたい場合には"select #" コマンドを使用してその波形を選択してください。
たとえば "select 0" と入力すると 矩形波(sqr)が選択されることになります。

/media/uploads/Rhyme/ojizo_and.jpg

Committer:
Rhyme
Date:
Sun Dec 13 07:27:43 2015 +0000
Revision:
1:b4f26ccaf417
Parent:
0:46a79748aa81
Support for FRDM-K64F added;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:46a79748aa81 1 /** mbed funcgen my implementation of a function generator
Rhyme 0:46a79748aa81 2 * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
Rhyme 0:46a79748aa81 3 *
Rhyme 0:46a79748aa81 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Rhyme 0:46a79748aa81 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Rhyme 0:46a79748aa81 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Rhyme 0:46a79748aa81 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Rhyme 0:46a79748aa81 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Rhyme 0:46a79748aa81 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Rhyme 0:46a79748aa81 10 * THE SOFTWARE.
Rhyme 0:46a79748aa81 11 */
Rhyme 0:46a79748aa81 12
Rhyme 0:46a79748aa81 13 #include "mbed.h"
Rhyme 0:46a79748aa81 14 #include "math.h"
Rhyme 0:46a79748aa81 15 #include "vt100.h"
Rhyme 0:46a79748aa81 16
Rhyme 1:b4f26ccaf417 17 #if defined (TARGET_KL25Z)
Rhyme 1:b4f26ccaf417 18 #define PIN_SCLK PTD1
Rhyme 1:b4f26ccaf417 19 #define PIN_MISO PTD3
Rhyme 1:b4f26ccaf417 20 #define PIN_MOSI PTD2
Rhyme 1:b4f26ccaf417 21 #define PIN_CS_TFT PTD0
Rhyme 1:b4f26ccaf417 22 #define PIN_DC_TFT PTD5
Rhyme 1:b4f26ccaf417 23 #define PIN_CS_TSC PTA13
Rhyme 1:b4f26ccaf417 24 #define PIN_BL_TFT PTC9
Rhyme 1:b4f26ccaf417 25 #define PIN_CS_SD PTA4
Rhyme 1:b4f26ccaf417 26 #define PIN_TSC_INTR PTC6 /* place holder */
Rhyme 1:b4f26ccaf417 27 #define PIN_RESET_TFT PTC5 /* place holder */
Rhyme 1:b4f26ccaf417 28 #define PIN_ADC_CH0 PTB0
Rhyme 1:b4f26ccaf417 29 #define PIN_ADC_CH1 PTB2
Rhyme 1:b4f26ccaf417 30 #define PIN_DAC_OUT PTE30
Rhyme 1:b4f26ccaf417 31
Rhyme 1:b4f26ccaf417 32 #elif defined (TARGET_KL46Z)
Rhyme 1:b4f26ccaf417 33 #define PIN_SCLK PTD5
Rhyme 1:b4f26ccaf417 34 #define PIN_MISO PTD7
Rhyme 1:b4f26ccaf417 35 #define PIN_MOSI PTD6
Rhyme 1:b4f26ccaf417 36 #define PIN_CS_TFT PTD4
Rhyme 1:b4f26ccaf417 37 #define PIN_DC_TFT PTD2
Rhyme 1:b4f26ccaf417 38 #define PIN_CS_TSC PTA13
Rhyme 1:b4f26ccaf417 39 #define PIN_BL_TFT PTC9
Rhyme 1:b4f26ccaf417 40 #define PIN_CS_SD PTA4
Rhyme 1:b4f26ccaf417 41 #define PIN_TSC_INTR PTC7 /* place holder */
Rhyme 1:b4f26ccaf417 42 #define PIN_RESET_TFT PTC6 /* place holder */
Rhyme 1:b4f26ccaf417 43 #define PIN_ADC_CH0 PTB0
Rhyme 1:b4f26ccaf417 44 #define PIN_ADC_CH1 PTB2
Rhyme 1:b4f26ccaf417 45 #define PIN_DAC_OUT PTE30
Rhyme 1:b4f26ccaf417 46
Rhyme 1:b4f26ccaf417 47 #elif defined (TARGET_K64F)
Rhyme 1:b4f26ccaf417 48 #define PIN_SCLK PTD1
Rhyme 1:b4f26ccaf417 49 #define PIN_MISO PTD3
Rhyme 1:b4f26ccaf417 50 #define PIN_MOSI PTD2
Rhyme 1:b4f26ccaf417 51 #define PIN_CS_TFT PTD0
Rhyme 1:b4f26ccaf417 52 #define PIN_DC_TFT PTC4
Rhyme 1:b4f26ccaf417 53 // for board rev E or later
Rhyme 1:b4f26ccaf417 54 #define PIN_CS_TSC PTC12
Rhyme 1:b4f26ccaf417 55 // for earlier boards use following line
Rhyme 1:b4f26ccaf417 56 // #define PIN_CS_TSC PTA0
Rhyme 1:b4f26ccaf417 57 #define PIN_BL_TFT PTC3
Rhyme 1:b4f26ccaf417 58 #define PIN_CS_SD PTB23
Rhyme 1:b4f26ccaf417 59 #define PIN_TSC_INTR PTC0 /* place holder */
Rhyme 1:b4f26ccaf417 60 #define PIN_RESET_TFT PTC9 /* place holder */
Rhyme 1:b4f26ccaf417 61 #define PIN_ADC_CH0 PTB2
Rhyme 1:b4f26ccaf417 62 #define PIN_ADC_CH1 PTB10
Rhyme 1:b4f26ccaf417 63 #define PIN_DAC_OUT DAC0_OUT
Rhyme 1:b4f26ccaf417 64
Rhyme 1:b4f26ccaf417 65 #elif defined (TARGET_K22F)
Rhyme 1:b4f26ccaf417 66 #define PIN_SCLK PTD5
Rhyme 1:b4f26ccaf417 67 #define PIN_MISO PTD7
Rhyme 1:b4f26ccaf417 68 #define PIN_MOSI PTD6
Rhyme 1:b4f26ccaf417 69 #define PIN_CS_TFT PTD4
Rhyme 1:b4f26ccaf417 70 #define PIN_DC_TFT PTA1
Rhyme 1:b4f26ccaf417 71 #define PIN_CS_TSC PTB19
Rhyme 1:b4f26ccaf417 72 #define PIN_BL_TFT PTC6
Rhyme 1:b4f26ccaf417 73 #define PIN_CS_SD PTA4
Rhyme 1:b4f26ccaf417 74 #define PIN_TSC_INTR PTC7 /* place holder */
Rhyme 1:b4f26ccaf417 75 #define PIN_RESET_TFT PTC9 /* place holder */
Rhyme 1:b4f26ccaf417 76 #define PIN_ADC_CH0 PTB0
Rhyme 1:b4f26ccaf417 77 #define PIN_ADC_CH1 PTC1
Rhyme 1:b4f26ccaf417 78 #define PIN_DAC_OUT DAC0_OUT
Rhyme 1:b4f26ccaf417 79
Rhyme 1:b4f26ccaf417 80 #elif defined (TARGET_NUCLEO_F411RE)
Rhyme 1:b4f26ccaf417 81 #define PIN_SCLK PA_5
Rhyme 1:b4f26ccaf417 82 #define PIN_MISO PA_6
Rhyme 1:b4f26ccaf417 83 #define PIN_MOSI PA_7
Rhyme 1:b4f26ccaf417 84 #define PIN_CS_TFT PB_6
Rhyme 1:b4f26ccaf417 85 #define PIN_DC_TFT PC_7
Rhyme 1:b4f26ccaf417 86 #define PIN_CS_TSC PA_9
Rhyme 1:b4f26ccaf417 87 #define PIN_BL_TFT PA_8
Rhyme 1:b4f26ccaf417 88 #define PIN_CS_SD PB_5
Rhyme 1:b4f26ccaf417 89 #define PIN_TSC_INTR PA_8 /* place holder */
Rhyme 1:b4f26ccaf417 90 #define PIN_RESET_TFT PA_13 /* place holder */
Rhyme 1:b4f26ccaf417 91 #define PIN_ADC_CH0 PA_0
Rhyme 1:b4f26ccaf417 92 #define PIN_ADC_CH1 PA_4
Rhyme 1:b4f26ccaf417 93
Rhyme 1:b4f26ccaf417 94 #else
Rhyme 1:b4f26ccaf417 95 #error TARGET NOT DEFINED
Rhyme 1:b4f26ccaf417 96 #define PIN_SCLK D13
Rhyme 1:b4f26ccaf417 97 #define PIN_MISO D12
Rhyme 1:b4f26ccaf417 98 #define PIN_MOSI D11
Rhyme 1:b4f26ccaf417 99 #define PIN_CS_TFT D10
Rhyme 1:b4f26ccaf417 100 #define PIN_DC_TFT D9
Rhyme 1:b4f26ccaf417 101 #define PIN_CS_TSC D8
Rhyme 1:b4f26ccaf417 102 #define PIN_BL_TFT D7
Rhyme 1:b4f26ccaf417 103 #define PIN_CS_SD D4
Rhyme 1:b4f26ccaf417 104 #define PIN_TSC_INTR NC
Rhyme 1:b4f26ccaf417 105 #define PIN_RESET_TFT NC
Rhyme 1:b4f26ccaf417 106 #define PIN_ADC_CH0 A0
Rhyme 1:b4f26ccaf417 107 #define PIN_ADC_CH1 A2
Rhyme 1:b4f26ccaf417 108
Rhyme 1:b4f26ccaf417 109 #endif
Rhyme 1:b4f26ccaf417 110
Rhyme 0:46a79748aa81 111 #include "wave.h"
Rhyme 0:46a79748aa81 112 #include "sinwave.h"
Rhyme 0:46a79748aa81 113 #include "sqrwave.h"
Rhyme 0:46a79748aa81 114 #include "sawwave.h"
Rhyme 0:46a79748aa81 115 #include "triwave.h"
Rhyme 0:46a79748aa81 116
Rhyme 0:46a79748aa81 117 #define MODE_PAUSE 0x00
Rhyme 0:46a79748aa81 118 #define MODE_RUN 0x01
Rhyme 0:46a79748aa81 119
Rhyme 0:46a79748aa81 120 #define MAX_WAVE 10
Rhyme 0:46a79748aa81 121
Rhyme 1:b4f26ccaf417 122
Rhyme 1:b4f26ccaf417 123
Rhyme 1:b4f26ccaf417 124 DigitalOut myled(LED1) ;
Rhyme 1:b4f26ccaf417 125 AnalogOut aout(PIN_DAC_OUT) ; // SignalOut
Rhyme 0:46a79748aa81 126
Rhyme 0:46a79748aa81 127 Ticker *timer ;
Rhyme 0:46a79748aa81 128 wave *wave_list[MAX_WAVE] ;
Rhyme 0:46a79748aa81 129 wave *w = 0 ;
Rhyme 0:46a79748aa81 130 int num_wave = 0 ;
Rhyme 0:46a79748aa81 131 int wave_index = 0 ;
Rhyme 0:46a79748aa81 132 bool ticked = false ;
Rhyme 0:46a79748aa81 133 int vdout = 0 ;
Rhyme 0:46a79748aa81 134 int avalue = 0 ;
Rhyme 0:46a79748aa81 135 int aindex = 0 ;
Rhyme 0:46a79748aa81 136 int mode = MODE_RUN ;
Rhyme 0:46a79748aa81 137 vt100 *tty = 0 ;
Rhyme 0:46a79748aa81 138
Rhyme 0:46a79748aa81 139 /** usage display list of available commands
Rhyme 0:46a79748aa81 140 */
Rhyme 0:46a79748aa81 141 void usage(void)
Rhyme 0:46a79748aa81 142 {
Rhyme 0:46a79748aa81 143 printf("=== funcgen (%s) ===\n\r", __DATE__) ;
Rhyme 0:46a79748aa81 144 printf("run : start wave generation\n\r") ;
Rhyme 0:46a79748aa81 145 printf("stop : stop wave generation\n\r") ;
Rhyme 0:46a79748aa81 146 printf("help : print this help\n\r") ;
Rhyme 0:46a79748aa81 147 printf("sin <amp> <freq> add a sine wave\n\r") ;
Rhyme 0:46a79748aa81 148 printf("sqr <amp> <freq> <duty> add a square wave\n\r") ;
Rhyme 0:46a79748aa81 149 printf("saw <amp> <freq> add a saw wave\n\r") ;
Rhyme 0:46a79748aa81 150 printf("tri <amp> <freq> <duty> add a triangle wave\n\r") ;
Rhyme 0:46a79748aa81 151 printf("------------------\n\r") ;
Rhyme 0:46a79748aa81 152 printf("list (print list of waves)\n\r") ;
Rhyme 0:46a79748aa81 153 printf("select <num> (select a target wave)\n\r") ;
Rhyme 0:46a79748aa81 154 printf("delete (delete selected wave)\n\r") ;
Rhyme 0:46a79748aa81 155 printf("amp <amp> (0 ~ 3.28 V)\n\r") ;
Rhyme 0:46a79748aa81 156 printf("freq <freq> (0 ~ 12000 Hz)\n\r") ;
Rhyme 0:46a79748aa81 157 printf("duty <duty> (0 ~ 100 %%)\n\r") ;
Rhyme 0:46a79748aa81 158 printf("sample <time> (25~100 us(?))\n\r") ;
Rhyme 0:46a79748aa81 159 printf("------------------\n\r") ;
Rhyme 0:46a79748aa81 160 }
Rhyme 0:46a79748aa81 161
Rhyme 0:46a79748aa81 162 /** tick_time advance wave position(s)
Rhyme 0:46a79748aa81 163 */
Rhyme 0:46a79748aa81 164 void tick_time(void)
Rhyme 0:46a79748aa81 165 {
Rhyme 0:46a79748aa81 166 int i ;
Rhyme 0:46a79748aa81 167 int value = 0 ;
Rhyme 0:46a79748aa81 168 for (i = 0 ; i < num_wave ; i++ ) {
Rhyme 0:46a79748aa81 169 if (wave_list[i]) {
Rhyme 0:46a79748aa81 170 value += wave_list[i]->value() ;
Rhyme 0:46a79748aa81 171 wave_list[i]->advance() ;
Rhyme 0:46a79748aa81 172 }
Rhyme 0:46a79748aa81 173 }
Rhyme 0:46a79748aa81 174 if (value > 0xFFFF) { // clip
Rhyme 0:46a79748aa81 175 value = 0xFFFF ;
Rhyme 0:46a79748aa81 176 }
Rhyme 0:46a79748aa81 177 aout.write_u16(value) ;
Rhyme 0:46a79748aa81 178 }
Rhyme 0:46a79748aa81 179
Rhyme 0:46a79748aa81 180 /** adjust sample time
Rhyme 0:46a79748aa81 181 * For a single wave 25us seems to be sufficient
Rhyme 0:46a79748aa81 182 * but adding more wave seems to require additional
Rhyme 0:46a79748aa81 183 * 8us for each wave function.
Rhyme 0:46a79748aa81 184 * These values are only from my experiments
Rhyme 0:46a79748aa81 185 * so may be there is/are better numbers/solutions.
Rhyme 0:46a79748aa81 186 */
Rhyme 0:46a79748aa81 187 void adjust_sample_time(int newvalue = 0)
Rhyme 0:46a79748aa81 188 {
Rhyme 0:46a79748aa81 189 int i ;
Rhyme 0:46a79748aa81 190 if (timer) {
Rhyme 0:46a79748aa81 191 timer->detach() ;
Rhyme 0:46a79748aa81 192 }
Rhyme 0:46a79748aa81 193 if (newvalue != 0) {
Rhyme 0:46a79748aa81 194 sample_time = newvalue ;
Rhyme 0:46a79748aa81 195 } else {
Rhyme 0:46a79748aa81 196 sample_time = 17 + 8 * num_wave ;
Rhyme 0:46a79748aa81 197 }
Rhyme 0:46a79748aa81 198 for (i = 0 ; i < num_wave ; i++ ) {
Rhyme 0:46a79748aa81 199 if (wave_list[i] != 0) {
Rhyme 0:46a79748aa81 200 wave_list[i]->update() ;
Rhyme 0:46a79748aa81 201 }
Rhyme 0:46a79748aa81 202 }
Rhyme 0:46a79748aa81 203 if (timer && (mode & MODE_RUN)) {
Rhyme 0:46a79748aa81 204 timer->attach_us(&tick_time, sample_time) ;
Rhyme 0:46a79748aa81 205 }
Rhyme 0:46a79748aa81 206 }
Rhyme 0:46a79748aa81 207
Rhyme 0:46a79748aa81 208 void add_wave(wave *w)
Rhyme 0:46a79748aa81 209 {
Rhyme 0:46a79748aa81 210 if (num_wave < MAX_WAVE) {
Rhyme 0:46a79748aa81 211 timer->detach() ;
Rhyme 0:46a79748aa81 212 wave_index = num_wave ;
Rhyme 0:46a79748aa81 213 wave_list[wave_index] = w ;
Rhyme 0:46a79748aa81 214 num_wave++ ;
Rhyme 0:46a79748aa81 215 adjust_sample_time() ;
Rhyme 0:46a79748aa81 216 } else {
Rhyme 0:46a79748aa81 217 printf("Maximum number of waves exceeded\n\r") ;
Rhyme 0:46a79748aa81 218 }
Rhyme 0:46a79748aa81 219 }
Rhyme 0:46a79748aa81 220
Rhyme 0:46a79748aa81 221 void delete_current_wave(void)
Rhyme 0:46a79748aa81 222 {
Rhyme 0:46a79748aa81 223 int i ;
Rhyme 0:46a79748aa81 224 if (wave_list[wave_index] != 0) {
Rhyme 0:46a79748aa81 225 timer->detach() ;
Rhyme 0:46a79748aa81 226 delete wave_list[wave_index] ;
Rhyme 0:46a79748aa81 227 for (i = wave_index ; i < num_wave ; i++ ) {
Rhyme 0:46a79748aa81 228 wave_list[i] = wave_list[i+1] ;
Rhyme 0:46a79748aa81 229 }
Rhyme 0:46a79748aa81 230 num_wave-- ;
Rhyme 0:46a79748aa81 231 wave_list[num_wave] = 0 ;
Rhyme 0:46a79748aa81 232 if (wave_index >= num_wave) {
Rhyme 0:46a79748aa81 233 wave_index = num_wave - 1 ;
Rhyme 0:46a79748aa81 234 }
Rhyme 0:46a79748aa81 235 w = wave_list[wave_index] ;
Rhyme 0:46a79748aa81 236 adjust_sample_time() ;
Rhyme 0:46a79748aa81 237 }
Rhyme 0:46a79748aa81 238 }
Rhyme 0:46a79748aa81 239
Rhyme 0:46a79748aa81 240 void list_waves(void)
Rhyme 0:46a79748aa81 241 {
Rhyme 0:46a79748aa81 242 int i ;
Rhyme 0:46a79748aa81 243 printf("sample time = %d(us) %d wave(s)\n\r", sample_time, num_wave) ;
Rhyme 0:46a79748aa81 244 for (i = 0 ; i < num_wave ; i++ ) {
Rhyme 0:46a79748aa81 245 if (i == wave_index) {
Rhyme 0:46a79748aa81 246 printf("* ") ;
Rhyme 0:46a79748aa81 247 } else {
Rhyme 0:46a79748aa81 248 printf(" ") ;
Rhyme 0:46a79748aa81 249 }
Rhyme 0:46a79748aa81 250 printf("%d: ", i) ;
Rhyme 0:46a79748aa81 251 if (wave_list[i]) {
Rhyme 0:46a79748aa81 252 w = wave_list[i] ;
Rhyme 0:46a79748aa81 253 printf("[ %s ] amp = %.2f V, freq = %d Hz, duty = %d %%",
Rhyme 0:46a79748aa81 254 w->name(), w->volt(), w->freq(), w->duty()) ;
Rhyme 0:46a79748aa81 255 }
Rhyme 0:46a79748aa81 256 printf("\n\r") ;
Rhyme 0:46a79748aa81 257 }
Rhyme 0:46a79748aa81 258 w = wave_list[wave_index] ;
Rhyme 0:46a79748aa81 259 }
Rhyme 0:46a79748aa81 260
Rhyme 0:46a79748aa81 261 /** main funcgen main program
Rhyme 0:46a79748aa81 262 */
Rhyme 0:46a79748aa81 263 int main() {
Rhyme 0:46a79748aa81 264 char cmd[32] ;
Rhyme 0:46a79748aa81 265 int freq, duty ;
Rhyme 0:46a79748aa81 266 float volt ;
Rhyme 0:46a79748aa81 267
Rhyme 0:46a79748aa81 268 tty = new vt100() ;
Rhyme 0:46a79748aa81 269 tty->cls() ;
Rhyme 0:46a79748aa81 270 usage() ;
Rhyme 0:46a79748aa81 271
Rhyme 0:46a79748aa81 272 timer = new Ticker() ;
Rhyme 0:46a79748aa81 273 w = new sinwave(3.0, 1000, 0) ;
Rhyme 0:46a79748aa81 274 add_wave(w) ;
Rhyme 0:46a79748aa81 275
Rhyme 0:46a79748aa81 276 timer->attach_us(&tick_time, sample_time) ;
Rhyme 0:46a79748aa81 277 myled = 1 ; // turn the LED off
Rhyme 0:46a79748aa81 278
Rhyme 0:46a79748aa81 279 while(1) {
Rhyme 0:46a79748aa81 280 printf("> ") ;
Rhyme 0:46a79748aa81 281 scanf("%s", cmd) ;
Rhyme 0:46a79748aa81 282 if (strcmp(cmd, "run") == 0) { // start timer
Rhyme 0:46a79748aa81 283 mode |= MODE_RUN ;
Rhyme 0:46a79748aa81 284 timer->attach_us(&tick_time, sample_time) ;
Rhyme 0:46a79748aa81 285 } else if (strcmp(cmd, "stop") == 0) { // stop timer
Rhyme 0:46a79748aa81 286 mode ^= MODE_RUN ;
Rhyme 0:46a79748aa81 287 timer->detach() ;
Rhyme 0:46a79748aa81 288 } else if (strcmp(cmd, "delete") == 0) { // delete current wave
Rhyme 0:46a79748aa81 289 delete_current_wave() ;
Rhyme 0:46a79748aa81 290 } else if (strcmp(cmd, "select") == 0) { // select a wave to be handled
Rhyme 0:46a79748aa81 291 scanf("%d", &wave_index) ;
Rhyme 0:46a79748aa81 292 if (wave_index >= num_wave) {
Rhyme 0:46a79748aa81 293 wave_index = num_wave - 1;
Rhyme 0:46a79748aa81 294 }
Rhyme 0:46a79748aa81 295 w = wave_list[wave_index] ;
Rhyme 0:46a79748aa81 296 } else if (strcmp(cmd, "sample") == 0) { // set time unit
Rhyme 0:46a79748aa81 297 scanf("%d", &sample_time) ;
Rhyme 0:46a79748aa81 298 adjust_sample_time(sample_time) ;
Rhyme 0:46a79748aa81 299 } else if (strcmp(cmd, "sin") == 0) { // new sin wave
Rhyme 0:46a79748aa81 300 scanf("%f %d", &volt, &freq) ;
Rhyme 0:46a79748aa81 301 w = new sinwave(volt, freq) ;
Rhyme 0:46a79748aa81 302 add_wave(w) ;
Rhyme 0:46a79748aa81 303 } else if (strcmp(cmd, "sqr") == 0) { // new sqr wave
Rhyme 0:46a79748aa81 304 scanf("%f %d %d", &volt, &freq, &duty) ;
Rhyme 0:46a79748aa81 305 w = new sqrwave(volt, freq, duty) ;
Rhyme 0:46a79748aa81 306 add_wave(w) ;
Rhyme 0:46a79748aa81 307 } else if (strcmp(cmd, "saw") == 0) { // new saw wave
Rhyme 0:46a79748aa81 308 scanf("%f %d", &volt, &freq) ;
Rhyme 0:46a79748aa81 309 w = new sawwave(volt, freq) ;
Rhyme 0:46a79748aa81 310 add_wave(w) ;
Rhyme 0:46a79748aa81 311 } else if (strcmp(cmd, "tri") == 0) { // new tri wave
Rhyme 0:46a79748aa81 312 scanf("%f %d %d", &volt, &freq, &duty) ;
Rhyme 0:46a79748aa81 313 w = new triwave(volt, freq, duty) ;
Rhyme 0:46a79748aa81 314 add_wave(w) ;
Rhyme 0:46a79748aa81 315 } else if (strcmp(cmd, "amp") == 0) {
Rhyme 0:46a79748aa81 316 scanf("%f", &volt) ;
Rhyme 0:46a79748aa81 317 if (w != 0) {
Rhyme 0:46a79748aa81 318 w->volt(volt) ;
Rhyme 0:46a79748aa81 319 }
Rhyme 0:46a79748aa81 320 } else if (strcmp(cmd, "freq") == 0) {
Rhyme 0:46a79748aa81 321 scanf("%d", &freq) ;
Rhyme 0:46a79748aa81 322 if (w != 0) {
Rhyme 0:46a79748aa81 323 w->freq(freq) ;
Rhyme 0:46a79748aa81 324 }
Rhyme 0:46a79748aa81 325 } else if (strcmp(cmd, "duty") == 0) {
Rhyme 0:46a79748aa81 326 scanf("%d", &duty) ;
Rhyme 0:46a79748aa81 327 if (w != 0) {
Rhyme 0:46a79748aa81 328 w->duty(duty) ;
Rhyme 0:46a79748aa81 329 }
Rhyme 0:46a79748aa81 330 } else if (strcmp(cmd, "list") == 0) {
Rhyme 0:46a79748aa81 331 list_waves() ;
Rhyme 0:46a79748aa81 332 } else if (strcmp(cmd, "help") == 0) {
Rhyme 0:46a79748aa81 333 usage() ;
Rhyme 0:46a79748aa81 334 } else {
Rhyme 0:46a79748aa81 335 usage() ;
Rhyme 0:46a79748aa81 336 }
Rhyme 0:46a79748aa81 337 }
Rhyme 0:46a79748aa81 338 }