Transistor Gijutsu, October 2014, Special Features Chapter 9, Software of the Function Generator トランジスタ技術2014年10月号 特集第9章のソフトウェア わがまま波形発生器のソフトウェア
Information
tg_201410s8_AD7714 トランジスタ技術 2014年 10月号 第9章のソフトウェア
Program for Section 9 in October. 2014 issue of the Transistor Gijutsu
(Japanese electronics magazine)
概要
このプログラムは、ソフトウエアDDSにより、任意の波形を出力(2ch)します。 特徴は次のとおりです。
- PWM出力をDAコンバータとして利用します。
- 周波数や波形、バースト条件などを個別に設定できる独立した出力を2チャネル持っています。
- 周波数分解能0.023mHz
- 周波数範囲0.023mHz~10kHz
- 各チャネルにそれぞれ、波形の先頭で出力されるトリガ出力があります。
- 出力波形を関数で定義できます。
- 休止波数、出力波数、を設定することでバースト波形が出力できます。
ファイル
このソフトウエアは、次のファイルから構成されています。
- DDS.cpp - DDSによる波形発生
- main.cpp - main()関数
詳細については、10月号の記事および上記ファイル中のコメントを参照してください。
main.cpp
- Committer:
- Dance
- Date:
- 2014-08-29
- Revision:
- 0:f1ecca559ec3
File content as of revision 0:f1ecca559ec3:
#include "mbed.h" #include "USBSerial.h" #include "DDS.h" USBSerial pc; // sin()関数で合成された方形波 float square13(float x) { return (4*(sin(x) + sin(3*x)/3. + sin(5*x)/5. + sin(7*x)/7. + sin(9*x)/9. + sin(11*x)/11. + sin(13*x)/13.))/PI; } // 円の方程式から作られる半円波形 float circle(float x) { return sqrt(1 - (x - PI)*(x - PI)/PI/PI); } // 高調波を含んだsin()関数 float sin2(float x) { return (sin(x) + sin(5*x)/3)/1.3; } // float x を引数としてfloatを返す関数へのポインタの配列 float (*ftbl[])(float x) = {sin, triangle, square, circle, sin2}; // 簡単な操作説明 void help(void) { pc.printf("o1 freq phase level offset func\r\n"); pc.printf("b1 begin end length DcLevel\r\n"); pc.printf("o2 freq phase level offset func\r\n"); pc.printf("b2 begin end length DcLevel\r\n"); pc.printf("h ... help\r\n"); } int main(){ // インスタンスの生成 DDS dds; // 出力1の波形設定 dds.osc1(1000, 0, 0.5, 1, sin); dds.burst1(2, 2, 2, 1); dds.osc2(1000, 0, 0.5, 2, sin); dds.burst2(1, 1, 2, 2); dds.reset(); dds.start(); pc.printf("\r\n>"); while(1){ switch(pc.getc()){ case 'h': help(); break; case 'o': float a, b, c, o; int n; if(pc.getc() == '1'){ pc.printf(" osc1: "); pc.scanf("%f %f %f %f %d", &a, &b, &c, &o, &n); dds.osc1(a, b, c, o, ftbl[n]); }else{ pc.printf(" osc2: "); pc.scanf("%f %f %f %f %d", &a, &b, &c, &o, &n); dds.osc2(a, b, c, o, ftbl[n]); } dds.reset(); break; case 'b': int bg, en, ln; float dc; if(pc.getc() == '1'){ pc.printf(" bust1: "); pc.scanf("%d %d %d %f", &bg, &en, &ln, &dc); dds.burst1(bg, en, ln, dc); }else{ pc.printf(" bust2: "); pc.scanf("%d %d %d %f", &bg, &en, &ln, &dc); dds.burst2(bg, en, ln, dc); } dds.reset(); break; default: continue; } pc.printf("\r\n>"); } }