realtime process control with RTOS

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

Committer:
ykuroda
Date:
Thu Oct 04 02:05:55 2018 +0000
Revision:
21:967504024346
Parent:
20:13fcc82f4cab
Child:
22:f0164a2a09b0
use RtosTimer

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 21:967504024346 6 // 20181004 ... v2.1 ... RtosTimer
ykuroda 19:9381d775bfc5 7 //
Jonathan Austin 0:2757d7abb7d9 8 #include "mbed.h"
ykuroda 20:13fcc82f4cab 9
ykuroda 20:13fcc82f4cab 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 const int SIG_MYT = 0x1; // signal番号
ykuroda 20:13fcc82f4cab 14 DigitalOut led1(LED1);
ykuroda 20:13fcc82f4cab 15 DigitalOut led2(LED2);
ykuroda 20:13fcc82f4cab 16 DigitalOut led3(LED3);
ykuroda 20:13fcc82f4cab 17 DigitalOut led4(LED4);
ykuroda 20:13fcc82f4cab 18
ykuroda 20:13fcc82f4cab 19 // p11,12 サンプリング周期設定ピン(デフォルトは0)
ykuroda 20:13fcc82f4cab 20 // p11上位ビット,p12下位ビット.0:1kHz, 1: 100Hz, 2: 10Hz, 3: 1Hz
ykuroda 20:13fcc82f4cab 21 InterruptIn samplingtime_MSB(p11);
ykuroda 20:13fcc82f4cab 22 InterruptIn samplingtime_LSB(p12);
Jonathan Austin 0:2757d7abb7d9 23
ykuroda 20:13fcc82f4cab 24 // p13,14 量子化粒度設定ピン(デフォルトは0)
ykuroda 20:13fcc82f4cab 25 // p13上位ビット,p14下位ビット.0:10bit, 1:8bit, 2:6bit, 3:4bit
ykuroda 20:13fcc82f4cab 26 InterruptIn quantization_MSB(p13);
ykuroda 20:13fcc82f4cab 27 InterruptIn quantization_LSB(p14);
ykuroda 20:13fcc82f4cab 28
ykuroda 20:13fcc82f4cab 29 // アナログ入出力ピン(入出力共に0 - 3.3V)
ykuroda 20:13fcc82f4cab 30 AnalogOut aout(p18);
ykuroda 20:13fcc82f4cab 31 AnalogIn ain(p20);
Jonathan Austin 0:2757d7abb7d9 32
ykuroda 20:13fcc82f4cab 33 // デジタル入力ピン(割り込みにより実現)
ykuroda 20:13fcc82f4cab 34 InterruptIn din1(p21);
ykuroda 20:13fcc82f4cab 35 InterruptIn din2(p22);
ykuroda 20:13fcc82f4cab 36
ykuroda 20:13fcc82f4cab 37 // 方形波,パルス波出力ピン
ykuroda 20:13fcc82f4cab 38 PwmOut squarewave(p23);
ykuroda 20:13fcc82f4cab 39 PwmOut pulsewave(p24);
ykuroda 20:13fcc82f4cab 40
ykuroda 21:967504024346 41 RtosTimer* rt;
ykuroda 21:967504024346 42 Thread* thread_dt; // サンプリング処理スレッドを起動
ykuroda 21:967504024346 43
ykuroda 20:13fcc82f4cab 44 // サンプリング処理をするスレッド(時間管理された処理)
ykuroda 20:13fcc82f4cab 45 void sampling_thread(const void* arg) {
ykuroda 19:9381d775bfc5 46 while(true){
ykuroda 19:9381d775bfc5 47 Thread::signal_wait(SIG_MYT); // シグナルを待つ
ykuroda 20:13fcc82f4cab 48 unsigned short a_data = ain.read_u16(); // AD入力(ADは12ビット)
ykuroda 20:13fcc82f4cab 49 aout.write_u16((a_data>>qbits)<<qbits);// DA出力(量子化粒度はピンにより設定)
ykuroda 21:967504024346 50 led4=0;
Jonathan Austin 0:2757d7abb7d9 51 }
Jonathan Austin 0:2757d7abb7d9 52 }
Jonathan Austin 1:846c97078558 53
ykuroda 20:13fcc82f4cab 54 // 量子化粒度設定ハンドラ
ykuroda 20:13fcc82f4cab 55 void qsize_handler(void) {
ykuroda 20:13fcc82f4cab 56 // 量子化設定ピン(p13,14)の設定を読んで量子化粒度を決定する
ykuroda 20:13fcc82f4cab 57 // 設定ピンの状態を読み取り,2ビット値に変換
ykuroda 20:13fcc82f4cab 58 int quantization = (quantization_MSB<<1)&0x2|quantization_LSB&0x1;
ykuroda 20:13fcc82f4cab 59 qbits = 6+quantization*4; // 量子化サイズの決定
ykuroda 20:13fcc82f4cab 60 // (デジタル出力時の量子化サイズは 0:1024, 1:256, 2:64, 3:16 steps)
ykuroda 20:13fcc82f4cab 61 }
ykuroda 20:13fcc82f4cab 62
ykuroda 20:13fcc82f4cab 63 // サンプリングタイム設定割り込みハンドラ...時間設定ピンの状態が変化した時に呼び出される
ykuroda 20:13fcc82f4cab 64 void pinstate_handler(void) {
ykuroda 20:13fcc82f4cab 65 // ピンの状態を読み取り,2ビット値に変換
ykuroda 20:13fcc82f4cab 66 int samplingtime = (samplingtime_MSB<<1)&0x2|samplingtime_LSB&0x1;
ykuroda 20:13fcc82f4cab 67 // 制御周期を10^nとする(n=0:1s, n=1:0.1s, n=2:0.01s, n=3:0.001s)
ykuroda 20:13fcc82f4cab 68 delta_t = (int)pow(10.0,(double)samplingtime);
ykuroda 20:13fcc82f4cab 69 squarewave.period_ms(delta_t); // 方形波の周期の設定
ykuroda 20:13fcc82f4cab 70 pulsewave.period_ms(delta_t); // パルス波の周期の設定
ykuroda 20:13fcc82f4cab 71 squarewave.write(0.5F); // duty比
ykuroda 20:13fcc82f4cab 72 pulsewave.write(0.1F); // duty比
ykuroda 21:967504024346 73 rt->stop();
ykuroda 21:967504024346 74 rt->start(delta_t);
ykuroda 20:13fcc82f4cab 75 }
ykuroda 20:13fcc82f4cab 76
ykuroda 20:13fcc82f4cab 77 // デジタル入力割り込みハンドラ...デジタル入力信号の状態が変化した時に呼び出される
ykuroda 20:13fcc82f4cab 78 void din_handler(void) {
ykuroda 20:13fcc82f4cab 79 led1 = din1; // ピンの状態をそのままLEDの点灯状態にする
ykuroda 20:13fcc82f4cab 80 led2 = din2;
ykuroda 20:13fcc82f4cab 81 }
ykuroda 19:9381d775bfc5 82
ykuroda 21:967504024346 83 void rtos_catcher(void const* n) {
ykuroda 21:967504024346 84 led4=1;
ykuroda 21:967504024346 85 thread_dt->signal_set(SIG_MYT); // スレッドへ再開シグナルを送る
ykuroda 21:967504024346 86 }
ykuroda 21:967504024346 87
ykuroda 19:9381d775bfc5 88 int main() {
ykuroda 20:13fcc82f4cab 89 squarewave.period_ms(delta_t); // 初期周期の設定
ykuroda 20:13fcc82f4cab 90 pulsewave.period_ms(delta_t); // 初期周期の設定
ykuroda 20:13fcc82f4cab 91 squarewave.write(0.5F); // 初期duty比(方形波=50%)
ykuroda 20:13fcc82f4cab 92 pulsewave.write(0.1F); // 初期duty比(パルス波=10%)
ykuroda 20:13fcc82f4cab 93
ykuroda 21:967504024346 94 rt = new RtosTimer(rtos_catcher, osTimerPeriodic, (void*)0);
ykuroda 21:967504024346 95 rt->start(delta_t);
ykuroda 21:967504024346 96
ykuroda 20:13fcc82f4cab 97 samplingtime_MSB.rise(pinstate_handler);// 周期設定ハンドラの設定.
ykuroda 20:13fcc82f4cab 98 samplingtime_MSB.fall(pinstate_handler);// 設定ピンの状態変化で
ykuroda 20:13fcc82f4cab 99 samplingtime_LSB.rise(pinstate_handler);// ハンドラが呼び出される
ykuroda 20:13fcc82f4cab 100 samplingtime_LSB.fall(pinstate_handler);// ようにする
ykuroda 20:13fcc82f4cab 101 quantization_MSB.rise(qsize_handler); // 量子化粒度設定ハンドラの設定
ykuroda 20:13fcc82f4cab 102 quantization_MSB.fall(qsize_handler);
ykuroda 20:13fcc82f4cab 103 quantization_LSB.rise(qsize_handler);
ykuroda 20:13fcc82f4cab 104 quantization_LSB.fall(qsize_handler);
ykuroda 20:13fcc82f4cab 105 din1.rise(&din_handler); // デジタル入力ハンドラの設定
ykuroda 20:13fcc82f4cab 106 din1.fall(&din_handler); // din1,2の状態変化でハンドラ
ykuroda 20:13fcc82f4cab 107 din2.rise(&din_handler); // が呼ばれる
ykuroda 20:13fcc82f4cab 108 din2.fall(&din_handler);
ykuroda 20:13fcc82f4cab 109
ykuroda 21:967504024346 110 thread_dt = new Thread(sampling_thread); // サンプリング処理スレッドを起動
ykuroda 19:9381d775bfc5 111
ykuroda 19:9381d775bfc5 112 while(true){
ykuroda 20:13fcc82f4cab 113 Thread::wait(delta_t); // mainスレッドの時間間隔の設定[ms]
ykuroda 21:967504024346 114 // thread_dt.signal_set(SIG_MYT); // スレッドへ再開シグナルを送る
ykuroda 21:967504024346 115 // led4 = !led4; // 処理の先頭でLEDをを点滅
ykuroda 19:9381d775bfc5 116 }
ykuroda 20:13fcc82f4cab 117 }