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 / とりあえず写真など
外観
アプリ画面
more ...
AD9850/AD9850.cpp@0:cc32f8c167de, 2015-06-18 (annotated)
- Committer:
- ohneta
- Date:
- Thu Jun 18 03:58:23 2015 +0000
- Revision:
- 0:cc32f8c167de
1st commit
Who changed what in which revision?
User | Revision | Line number | New 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 | */ |