realtime process control with RTOS
Fork of mbed-os-example-mbed5-blinky by
main.cpp@24:e414c7234bcc, 2018-10-18 (annotated)
- Committer:
- ykuroda
- Date:
- Thu Oct 18 07:14:46 2018 +0000
- Revision:
- 24:e414c7234bcc
- Parent:
- 23:bc5ad77d56bb
???;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ykuroda | 20:13fcc82f4cab | 1 | // mbed-os-io-control |
ykuroda | 20:13fcc82f4cab | 2 | // I/O制御プログラム(機械工学実験1) |
ykuroda | 19:9381d775bfc5 | 3 | // |
ykuroda | 20:13fcc82f4cab | 4 | // 20161027 ... v1.0 ... originally written by Y.Kuroda for Mechatronics |
ykuroda | 20:13fcc82f4cab | 5 | // 20180917 ... v2.0 ... customised for Jikken1(mbed LPC1768専用) |
ykuroda | 22:f0164a2a09b0 | 6 | // 20181004 ... v3.0 ... uses EventQueue |
ykuroda | 19:9381d775bfc5 | 7 | // |
Jonathan Austin |
0:2757d7abb7d9 | 8 | #include "mbed.h" |
ykuroda | 20:13fcc82f4cab | 9 | |
ykuroda | 23:bc5ad77d56bb | 10 | const int DELTA_T = 1; // mainスレッドの時間間隔の設定[ms](デフォルトは1ms) |
ykuroda | 20:13fcc82f4cab | 11 | int delta_t = DELTA_T; |
ykuroda | 20:13fcc82f4cab | 12 | int qbits = 6; // 量子化シフト値 |
ykuroda | 20:13fcc82f4cab | 13 | DigitalOut led1(LED1); |
ykuroda | 20:13fcc82f4cab | 14 | DigitalOut led2(LED2); |
ykuroda | 20:13fcc82f4cab | 15 | DigitalOut led4(LED4); |
ykuroda | 20:13fcc82f4cab | 16 | |
ykuroda | 20:13fcc82f4cab | 17 | // p11,12 サンプリング周期設定ピン(デフォルトは0) |
ykuroda | 22:f0164a2a09b0 | 18 | // p11上位ビット,p12下位ビット.0:1kHz, 1: 100Hz, 2: 10Hz, 3: 1Hz |
ykuroda | 20:13fcc82f4cab | 19 | InterruptIn samplingtime_MSB(p11); |
ykuroda | 20:13fcc82f4cab | 20 | InterruptIn samplingtime_LSB(p12); |
Jonathan Austin |
0:2757d7abb7d9 | 21 | |
ykuroda | 20:13fcc82f4cab | 22 | // p13,14 量子化粒度設定ピン(デフォルトは0) |
ykuroda | 20:13fcc82f4cab | 23 | // p13上位ビット,p14下位ビット.0:10bit, 1:8bit, 2:6bit, 3:4bit |
ykuroda | 20:13fcc82f4cab | 24 | InterruptIn quantization_MSB(p13); |
ykuroda | 20:13fcc82f4cab | 25 | InterruptIn quantization_LSB(p14); |
ykuroda | 20:13fcc82f4cab | 26 | |
ykuroda | 20:13fcc82f4cab | 27 | // アナログ入出力ピン(入出力共に0 - 3.3V) |
ykuroda | 20:13fcc82f4cab | 28 | AnalogOut aout(p18); |
ykuroda | 20:13fcc82f4cab | 29 | AnalogIn ain(p20); |
Jonathan Austin |
0:2757d7abb7d9 | 30 | |
ykuroda | 20:13fcc82f4cab | 31 | // デジタル入力ピン(割り込みにより実現) |
ykuroda | 20:13fcc82f4cab | 32 | InterruptIn din1(p21); |
ykuroda | 20:13fcc82f4cab | 33 | InterruptIn din2(p22); |
ykuroda | 20:13fcc82f4cab | 34 | |
ykuroda | 20:13fcc82f4cab | 35 | // 方形波,パルス波出力ピン |
ykuroda | 20:13fcc82f4cab | 36 | PwmOut squarewave(p23); |
ykuroda | 20:13fcc82f4cab | 37 | PwmOut pulsewave(p24); |
ykuroda | 20:13fcc82f4cab | 38 | |
ykuroda | 23:bc5ad77d56bb | 39 | const int SIG_ST = 0x1; // signal番号 |
ykuroda | 23:bc5ad77d56bb | 40 | Thread* sthread; |
ykuroda | 23:bc5ad77d56bb | 41 | EventQueue queue; |
ykuroda | 23:bc5ad77d56bb | 42 | int id = 0; |
ykuroda | 23:bc5ad77d56bb | 43 | |
ykuroda | 20:13fcc82f4cab | 44 | // サンプリング処理をするスレッド(時間管理された処理) |
ykuroda | 23:bc5ad77d56bb | 45 | void sampling_job(void* v) |
ykuroda | 23:bc5ad77d56bb | 46 | { |
ykuroda | 22:f0164a2a09b0 | 47 | unsigned short a_data = ain.read_u16(); // AD入力(ADは12ビット) |
ykuroda | 22:f0164a2a09b0 | 48 | aout.write_u16((a_data>>qbits)<<qbits);// DA出力(量子化粒度はピンにより設定) |
ykuroda | 23:bc5ad77d56bb | 49 | led4 = !led4; |
ykuroda | 23:bc5ad77d56bb | 50 | } |
ykuroda | 23:bc5ad77d56bb | 51 | |
ykuroda | 23:bc5ad77d56bb | 52 | void setup_thread(void const* arg) // 設定処理をするスレッド |
ykuroda | 23:bc5ad77d56bb | 53 | { |
ykuroda | 23:bc5ad77d56bb | 54 | while(true) { |
ykuroda | 23:bc5ad77d56bb | 55 | Thread::signal_wait(SIG_ST); // シグナルを待つ |
ykuroda | 23:bc5ad77d56bb | 56 | |
ykuroda | 23:bc5ad77d56bb | 57 | // ピンの状態を読み取り,2ビット値に変換 |
ykuroda | 24:e414c7234bcc | 58 | int s_msb = 10, s_lsb = 10; |
ykuroda | 24:e414c7234bcc | 59 | int q_msb = 10, q_lsb = 10; |
ykuroda | 24:e414c7234bcc | 60 | const int RETRY = 100; // 100回調べて9割以上1なら1,それ以下なら0とする. |
ykuroda | 23:bc5ad77d56bb | 61 | for(int i=0; i<RETRY; i++) { |
ykuroda | 23:bc5ad77d56bb | 62 | s_msb += samplingtime_MSB; |
ykuroda | 23:bc5ad77d56bb | 63 | s_lsb += samplingtime_LSB; |
ykuroda | 23:bc5ad77d56bb | 64 | q_msb += quantization_MSB; |
ykuroda | 23:bc5ad77d56bb | 65 | q_lsb += quantization_LSB; |
ykuroda | 23:bc5ad77d56bb | 66 | } |
ykuroda | 23:bc5ad77d56bb | 67 | s_msb /= RETRY; s_lsb /= RETRY; |
ykuroda | 23:bc5ad77d56bb | 68 | q_msb /= RETRY; q_lsb /= RETRY; |
ykuroda | 23:bc5ad77d56bb | 69 | |
ykuroda | 23:bc5ad77d56bb | 70 | int samplingtime = (s_msb<<1)&0x2 | s_lsb&0x1; |
ykuroda | 23:bc5ad77d56bb | 71 | |
ykuroda | 23:bc5ad77d56bb | 72 | // 制御周期を10^nとする(n=0:1s, n=1:0.1s, n=2:0.01s, n=3:0.001s) |
ykuroda | 23:bc5ad77d56bb | 73 | delta_t = (int)pow(10.0,(double)samplingtime); |
ykuroda | 23:bc5ad77d56bb | 74 | |
ykuroda | 23:bc5ad77d56bb | 75 | |
ykuroda | 23:bc5ad77d56bb | 76 | squarewave.period_ms(delta_t); // 方形波の周期の設定 |
ykuroda | 23:bc5ad77d56bb | 77 | pulsewave.period_ms(delta_t); // パルス波の周期の設定 |
ykuroda | 23:bc5ad77d56bb | 78 | squarewave.write(0.5F); // duty比 |
ykuroda | 23:bc5ad77d56bb | 79 | pulsewave.write(0.1F); // duty比 |
ykuroda | 23:bc5ad77d56bb | 80 | |
ykuroda | 23:bc5ad77d56bb | 81 | // 量子化設定ピン(p13,14)の設定を読んで量子化粒度を決定する |
ykuroda | 23:bc5ad77d56bb | 82 | // 設定ピンの状態を読み取り,2ビット値に変換 |
ykuroda | 23:bc5ad77d56bb | 83 | int quantization = (q_msb<<1)&0x2 | q_lsb&0x1; |
ykuroda | 23:bc5ad77d56bb | 84 | qbits = 6+quantization*4; // 量子化サイズの決定 |
ykuroda | 23:bc5ad77d56bb | 85 | // (デジタル出力時の量子化サイズは 0:1024, 1:256, 2:64, 3:16 steps) |
ykuroda | 23:bc5ad77d56bb | 86 | |
ykuroda | 24:e414c7234bcc | 87 | queue.cancel(id); // 前回のプロセスキューをキャンセル |
ykuroda | 23:bc5ad77d56bb | 88 | printf("delta_t = %d, qbits = %d\n", delta_t, qbits); |
ykuroda | 23:bc5ad77d56bb | 89 | id = queue.call_every(delta_t, sampling_job, (void*)0); |
ykuroda | 23:bc5ad77d56bb | 90 | } |
Jonathan Austin |
0:2757d7abb7d9 | 91 | } |
Jonathan Austin |
1:846c97078558 | 92 | |
ykuroda | 20:13fcc82f4cab | 93 | // 量子化粒度設定ハンドラ |
ykuroda | 23:bc5ad77d56bb | 94 | void qsize_handler(void) |
ykuroda | 23:bc5ad77d56bb | 95 | { |
ykuroda | 23:bc5ad77d56bb | 96 | sthread->signal_set(SIG_ST); // スレッドへ再開シグナルを送る |
ykuroda | 22:f0164a2a09b0 | 97 | } |
ykuroda | 20:13fcc82f4cab | 98 | |
ykuroda | 20:13fcc82f4cab | 99 | // サンプリングタイム設定割り込みハンドラ...時間設定ピンの状態が変化した時に呼び出される |
ykuroda | 23:bc5ad77d56bb | 100 | void pinstate_handler(void) |
ykuroda | 23:bc5ad77d56bb | 101 | { |
ykuroda | 23:bc5ad77d56bb | 102 | sthread->signal_set(SIG_ST); // スレッドへ再開シグナルを送る |
ykuroda | 20:13fcc82f4cab | 103 | } |
ykuroda | 20:13fcc82f4cab | 104 | |
ykuroda | 20:13fcc82f4cab | 105 | // デジタル入力割り込みハンドラ...デジタル入力信号の状態が変化した時に呼び出される |
ykuroda | 23:bc5ad77d56bb | 106 | void din_handler(void) |
ykuroda | 23:bc5ad77d56bb | 107 | { |
ykuroda | 20:13fcc82f4cab | 108 | led1 = din1; // ピンの状態をそのままLEDの点灯状態にする |
ykuroda | 20:13fcc82f4cab | 109 | led2 = din2; |
ykuroda | 21:967504024346 | 110 | } |
ykuroda | 21:967504024346 | 111 | |
ykuroda | 23:bc5ad77d56bb | 112 | int main() |
ykuroda | 23:bc5ad77d56bb | 113 | { |
ykuroda | 23:bc5ad77d56bb | 114 | sthread = new Thread(setup_thread); // 設定用スレッドを起動 |
ykuroda | 23:bc5ad77d56bb | 115 | |
ykuroda | 23:bc5ad77d56bb | 116 | |
ykuroda | 20:13fcc82f4cab | 117 | squarewave.period_ms(delta_t); // 初期周期の設定 |
ykuroda | 20:13fcc82f4cab | 118 | pulsewave.period_ms(delta_t); // 初期周期の設定 |
ykuroda | 20:13fcc82f4cab | 119 | squarewave.write(0.5F); // 初期duty比(方形波=50%) |
ykuroda | 20:13fcc82f4cab | 120 | pulsewave.write(0.1F); // 初期duty比(パルス波=10%) |
ykuroda | 20:13fcc82f4cab | 121 | |
ykuroda | 22:f0164a2a09b0 | 122 | samplingtime_MSB.disable_irq(); |
ykuroda | 22:f0164a2a09b0 | 123 | samplingtime_MSB.mode(PullDown); |
ykuroda | 20:13fcc82f4cab | 124 | samplingtime_MSB.rise(pinstate_handler);// 周期設定ハンドラの設定. |
ykuroda | 20:13fcc82f4cab | 125 | samplingtime_MSB.fall(pinstate_handler);// 設定ピンの状態変化で |
ykuroda | 22:f0164a2a09b0 | 126 | samplingtime_MSB.enable_irq(); |
ykuroda | 23:bc5ad77d56bb | 127 | |
ykuroda | 22:f0164a2a09b0 | 128 | samplingtime_LSB.disable_irq(); |
ykuroda | 22:f0164a2a09b0 | 129 | samplingtime_LSB.mode(PullDown); |
ykuroda | 20:13fcc82f4cab | 130 | samplingtime_LSB.rise(pinstate_handler);// ハンドラが呼び出される |
ykuroda | 20:13fcc82f4cab | 131 | samplingtime_LSB.fall(pinstate_handler);// ようにする |
ykuroda | 22:f0164a2a09b0 | 132 | samplingtime_LSB.enable_irq(); |
ykuroda | 23:bc5ad77d56bb | 133 | |
ykuroda | 23:bc5ad77d56bb | 134 | quantization_MSB.disable_irq(); |
ykuroda | 23:bc5ad77d56bb | 135 | quantization_MSB.mode(PullDown); |
ykuroda | 20:13fcc82f4cab | 136 | quantization_MSB.rise(qsize_handler); // 量子化粒度設定ハンドラの設定 |
ykuroda | 20:13fcc82f4cab | 137 | quantization_MSB.fall(qsize_handler); |
ykuroda | 23:bc5ad77d56bb | 138 | quantization_MSB.enable_irq(); |
ykuroda | 23:bc5ad77d56bb | 139 | |
ykuroda | 23:bc5ad77d56bb | 140 | quantization_LSB.disable_irq(); |
ykuroda | 23:bc5ad77d56bb | 141 | quantization_LSB.mode(PullDown); |
ykuroda | 20:13fcc82f4cab | 142 | quantization_LSB.rise(qsize_handler); |
ykuroda | 20:13fcc82f4cab | 143 | quantization_LSB.fall(qsize_handler); |
ykuroda | 23:bc5ad77d56bb | 144 | quantization_LSB.enable_irq(); |
ykuroda | 23:bc5ad77d56bb | 145 | |
ykuroda | 23:bc5ad77d56bb | 146 | din1.disable_irq(); |
ykuroda | 23:bc5ad77d56bb | 147 | din1.mode(PullDown); |
ykuroda | 20:13fcc82f4cab | 148 | din1.rise(&din_handler); // デジタル入力ハンドラの設定 |
ykuroda | 20:13fcc82f4cab | 149 | din1.fall(&din_handler); // din1,2の状態変化でハンドラ |
ykuroda | 23:bc5ad77d56bb | 150 | din1.enable_irq(); |
ykuroda | 23:bc5ad77d56bb | 151 | |
ykuroda | 23:bc5ad77d56bb | 152 | din2.disable_irq(); |
ykuroda | 23:bc5ad77d56bb | 153 | din2.mode(PullDown); |
ykuroda | 20:13fcc82f4cab | 154 | din2.rise(&din_handler); // が呼ばれる |
ykuroda | 20:13fcc82f4cab | 155 | din2.fall(&din_handler); |
ykuroda | 23:bc5ad77d56bb | 156 | din2.enable_irq(); |
ykuroda | 20:13fcc82f4cab | 157 | |
ykuroda | 23:bc5ad77d56bb | 158 | id = queue.call_every(delta_t, sampling_job, (void*)0); |
ykuroda | 22:f0164a2a09b0 | 159 | queue.dispatch(); |
ykuroda | 20:13fcc82f4cab | 160 | } |