realtime process control with RTOS

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
ykuroda
Date:
Thu Oct 18 07:14:46 2018 +0000
Revision:
24:e414c7234bcc
Parent:
23:bc5ad77d56bb
???;

Who changed what in which revision?

UserRevisionLine numberNew 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 }