mbed HRM1017によるAD9850の操作

Dependencies:   BLE_API mbed nRF51822

what's this ? / 概要

あとで、ちゃんと書く(とおもう)

detail / 詳細

あとで、ちゃんと書く(とおもう)

BEL command format / BLEコマンドフォーマット

あとで、ちゃんと書く(とおもう)

BLE App for iPhone

iOS用アプリソースコード App source codes for iOS

https://github.com/ohneta/AD9850BLE

pictures / とりあえず写真など

外観

/media/uploads/ohneta/img_5653.jpg

アプリ画面

/media/uploads/ohneta/img_0101.png

more ...

Committer:
ohneta
Date:
Thu Jun 18 03:58:23 2015 +0000
Revision:
0:cc32f8c167de
1st commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohneta 0:cc32f8c167de 1 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 2 /**
ohneta 0:cc32f8c167de 3 * 中華DDS AD9850のコントロール
ohneta 0:cc32f8c167de 4 *
ohneta 0:cc32f8c167de 5 * mbed LPC1768では SPIを操作することで40bitの出力ができるが、
ohneta 0:cc32f8c167de 6 * mbed HRM1017等ではSPIの動作が違うためソフトウェアでシリアルデータを出力する
ohneta 0:cc32f8c167de 7 *
ohneta 0:cc32f8c167de 8 * 参考資料
ohneta 0:cc32f8c167de 9 * AD9850データシート
ohneta 0:cc32f8c167de 10 * http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf
ohneta 0:cc32f8c167de 11 * mbed LPC1768 SPIでの実装例
ohneta 0:cc32f8c167de 12 * http://developer.mbed.org/users/liamg/code/AD9850-function-generator-SPI-driver/
ohneta 0:cc32f8c167de 13 */
ohneta 0:cc32f8c167de 14 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 15
ohneta 0:cc32f8c167de 16 #include "AD9850.h"
ohneta 0:cc32f8c167de 17
ohneta 0:cc32f8c167de 18 #define AD9850_FREQ_CONST 34.359738368
ohneta 0:cc32f8c167de 19 /*
ohneta 0:cc32f8c167de 20 * AD9850/clock=125MHz
ohneta 0:cc32f8c167de 21 * 2の32乗=4294967296、DDSクロック==125MHzを前提とすると...
ohneta 0:cc32f8c167de 22 * 1Hz設定時の値 = 4294967296/125000000 = 34.359738368 となる
ohneta 0:cc32f8c167de 23 */
ohneta 0:cc32f8c167de 24
ohneta 0:cc32f8c167de 25 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 26 /**
ohneta 0:cc32f8c167de 27 * コンストラクタ
ohneta 0:cc32f8c167de 28 *
ohneta 0:cc32f8c167de 29 * @param PinName data データ転送ピン
ohneta 0:cc32f8c167de 30 * @param PinName w_clk クロックピン
ohneta 0:cc32f8c167de 31 * @param PinName fu_ud モジュール選択
ohneta 0:cc32f8c167de 32 * @param PinName reset リセット
ohneta 0:cc32f8c167de 33 */
ohneta 0:cc32f8c167de 34 AD9850::AD9850(PinName data, PinName w_clk, PinName fu_ud, PinName reset)
ohneta 0:cc32f8c167de 35 : _outBit(data), _w_clk(w_clk), _fu_ud(fu_ud), _reset(reset)
ohneta 0:cc32f8c167de 36 {
ohneta 0:cc32f8c167de 37 init();
ohneta 0:cc32f8c167de 38 }
ohneta 0:cc32f8c167de 39
ohneta 0:cc32f8c167de 40 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 41 /**
ohneta 0:cc32f8c167de 42 * デストラクタ
ohneta 0:cc32f8c167de 43 */
ohneta 0:cc32f8c167de 44 AD9850::~AD9850()
ohneta 0:cc32f8c167de 45 {
ohneta 0:cc32f8c167de 46 }
ohneta 0:cc32f8c167de 47
ohneta 0:cc32f8c167de 48 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 49 /**
ohneta 0:cc32f8c167de 50 * 初期化
ohneta 0:cc32f8c167de 51 */
ohneta 0:cc32f8c167de 52 void AD9850::init()
ohneta 0:cc32f8c167de 53 {
ohneta 0:cc32f8c167de 54 reset();
ohneta 0:cc32f8c167de 55 }
ohneta 0:cc32f8c167de 56
ohneta 0:cc32f8c167de 57 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 58 /**
ohneta 0:cc32f8c167de 59 * リセット
ohneta 0:cc32f8c167de 60 */
ohneta 0:cc32f8c167de 61 void AD9850::reset()
ohneta 0:cc32f8c167de 62 {
ohneta 0:cc32f8c167de 63 _reset = 0; wait_ms(5);
ohneta 0:cc32f8c167de 64 _reset = 1; wait_ms(5);
ohneta 0:cc32f8c167de 65 _reset = 0; wait_ms(5);
ohneta 0:cc32f8c167de 66 }
ohneta 0:cc32f8c167de 67
ohneta 0:cc32f8c167de 68 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 69 /**
ohneta 0:cc32f8c167de 70 * 周波数設定
ohneta 0:cc32f8c167de 71 *
ohneta 0:cc32f8c167de 72 * @param int freq 設定する周波数(Hz)
ohneta 0:cc32f8c167de 73 * AD9850ボードに依存するがクロック125MHzで概ね 1〜40000000(1Hz〜40MHz)程度まで安定して動作する模様
ohneta 0:cc32f8c167de 74 * @param int pdwon パワーダウンビット (W34)
ohneta 0:cc32f8c167de 75 * @param int phase コントロール/フェーズ等データ (W32〜W39)
ohneta 0:cc32f8c167de 76 *
ohneta 0:cc32f8c167de 77 * AD9850へ送信する40bit
ohneta 0:cc32f8c167de 78 * W0〜W31:
ohneta 0:cc32f8c167de 79 * freqにAD9850_FREQ_CONSTを乗算した32bit値
ohneta 0:cc32f8c167de 80 * W32, W33:
ohneta 0:cc32f8c167de 81 * コントロールビット。常に0
ohneta 0:cc32f8c167de 82 * W34:
ohneta 0:cc32f8c167de 83 * 1でパワーダウン(通常は0)
ohneta 0:cc32f8c167de 84 * W35〜W39:
ohneta 0:cc32f8c167de 85 * 位相オフセット調整値 (11.25度単位)
ohneta 0:cc32f8c167de 86 */
ohneta 0:cc32f8c167de 87 void AD9850::setFrequency(int freq, int pdwon, int phase)
ohneta 0:cc32f8c167de 88 {
ohneta 0:cc32f8c167de 89 int freqParam = (int)((double)freq * AD9850_FREQ_CONST); // 周波数に対応した32bitデータ(W0〜W31)
ohneta 0:cc32f8c167de 90
ohneta 0:cc32f8c167de 91 _w_clk = 0;
ohneta 0:cc32f8c167de 92 _fu_ud = 0; wait_ms(5);
ohneta 0:cc32f8c167de 93 _fu_ud = 1; wait_ms(5);
ohneta 0:cc32f8c167de 94 _fu_ud = 0;
ohneta 0:cc32f8c167de 95
ohneta 0:cc32f8c167de 96 for (int i = 0; i < 32; i++) {
ohneta 0:cc32f8c167de 97 int bit = ((freqParam >> i) & 0x01); // LSBから送信
ohneta 0:cc32f8c167de 98 _w_clk = 0;
ohneta 0:cc32f8c167de 99 _outBit = bit;
ohneta 0:cc32f8c167de 100 wait_ms(0.1);
ohneta 0:cc32f8c167de 101 _w_clk = 1; wait_ms(2);
ohneta 0:cc32f8c167de 102 _w_clk = 0; wait_ms(2);
ohneta 0:cc32f8c167de 103 }
ohneta 0:cc32f8c167de 104
ohneta 0:cc32f8c167de 105 for (int i = 0; i < 8; i++) {
ohneta 0:cc32f8c167de 106 int bit = ((phase >> (7 - i)) & 0x01);
ohneta 0:cc32f8c167de 107 _w_clk = 0;
ohneta 0:cc32f8c167de 108 _outBit = bit;
ohneta 0:cc32f8c167de 109 wait_ms(0.1);
ohneta 0:cc32f8c167de 110 _w_clk = 1; wait_ms(2);
ohneta 0:cc32f8c167de 111 _w_clk = 0; wait_ms(2);
ohneta 0:cc32f8c167de 112 }
ohneta 0:cc32f8c167de 113
ohneta 0:cc32f8c167de 114 _fu_ud = 0; wait_ms(5);
ohneta 0:cc32f8c167de 115 _fu_ud = 1; wait_ms(5);
ohneta 0:cc32f8c167de 116 _fu_ud = 0;
ohneta 0:cc32f8c167de 117 }
ohneta 0:cc32f8c167de 118
ohneta 0:cc32f8c167de 119 //----------------------------------------------------------------
ohneta 0:cc32f8c167de 120 /*
ohneta 0:cc32f8c167de 121
ohneta 0:cc32f8c167de 122 // mbed HRM1017の場合
ohneta 0:cc32f8c167de 123 AD9850 dds(P0_20, P0_25, P0_24, P0_23);
ohneta 0:cc32f8c167de 124
ohneta 0:cc32f8c167de 125 int main()
ohneta 0:cc32f8c167de 126 {
ohneta 0:cc32f8c167de 127 int frq = 10 * 1000 * 1000; // 10MHz
ohneta 0:cc32f8c167de 128 int phase = 0;
ohneta 0:cc32f8c167de 129
ohneta 0:cc32f8c167de 130 dds.setFrequency(frq, phase);
ohneta 0:cc32f8c167de 131 while(1) {
ohneta 0:cc32f8c167de 132 //
ohneta 0:cc32f8c167de 133 }
ohneta 0:cc32f8c167de 134 }
ohneta 0:cc32f8c167de 135 */