CQ出版社セミナ "実習・Armマイコン内蔵ペリフェラルを活用するためのC++プログラミング" で使う外付け回路のテスト

Dependencies:   mbed UIT_SetOutputPortType UIT_AQM1602 UIT_ADT7410

Committer:
MikamiUitOpen
Date:
Thu Apr 02 03:47:14 2020 +0000
Revision:
2:3f2be675f975
Parent:
1:0a21041026c7
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:8c850cf6285d 1 //----------------------------------------------------------------------
MikamiUitOpen 0:8c850cf6285d 2 // セミナ "実習・Armマイコンで学ぶインターフェース回路とプログラミング"
MikamiUitOpen 0:8c850cf6285d 3 // で使う外付け回路のテスト
MikamiUitOpen 0:8c850cf6285d 4 // RGB LED D2: 赤, D3: 緑, D4: 青
MikamiUitOpen 0:8c850cf6285d 5 // タクトスイッチ D6
MikamiUitOpen 0:8c850cf6285d 6 // 温度センサ(ADT7410) D14: SDA, D15: SCL
MikamiUitOpen 0:8c850cf6285d 7 // 液晶表示器(AQM1602) D14: SDA, D15: SCL
MikamiUitOpen 0:8c850cf6285d 8 // ADC A0
MikamiUitOpen 0:8c850cf6285d 9 // ステッピング・モータ D10: LSB, D13: MSB
MikamiUitOpen 0:8c850cf6285d 10 // ADC A1
MikamiUitOpen 0:8c850cf6285d 11 // DAC A2
MikamiUitOpen 0:8c850cf6285d 12 //
MikamiUitOpen 0:8c850cf6285d 13 // 1. タクトスイッチと RGB LED のテスト
MikamiUitOpen 0:8c850cf6285d 14 // 起動時は1秒ごとに発光状態が切り替わる
MikamiUitOpen 0:8c850cf6285d 15 // タクトスイッチを押すごとに,切替が On/Off する
MikamiUitOpen 0:8c850cf6285d 16 // 2. 温度センサと液晶表示器のテスト
MikamiUitOpen 0:8c850cf6285d 17 // 起動直後から気温が液晶表示器に表示される
MikamiUitOpen 0:8c850cf6285d 18 // 3. ADC(A1), DAC
MikamiUitOpen 1:0a21041026c7 19 // ファンクションジェネレータを AIN につなぐと A2 から同じ信号が出力される
MikamiUitOpen 0:8c850cf6285d 20 // 4. ステッピング・モータ
MikamiUitOpen 0:8c850cf6285d 21 // A0 に接続されている VR で回転スピードをコントロールする
MikamiUitOpen 0:8c850cf6285d 22 //
MikamiUitOpen 1:0a21041026c7 23 // オフィシャル・ライブラリのドキュメントは下記の URL
MikamiUitOpen 0:8c850cf6285d 24 // https://os.mbed.com/docs/mbed-os/ で APIs => Drivers
MikamiUitOpen 0:8c850cf6285d 25 //
MikamiUitOpen 2:3f2be675f975 26 // 2020/04/02, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:8c850cf6285d 27 //------------------------------------------------------------
MikamiUitOpen 0:8c850cf6285d 28
MikamiUitOpen 0:8c850cf6285d 29 #include "mbed.h"
MikamiUitOpen 0:8c850cf6285d 30 #include "SetOutputPortType.hpp"
MikamiUitOpen 0:8c850cf6285d 31 #include "ADT7410.hpp"
MikamiUitOpen 0:8c850cf6285d 32 #include "AQM1602.hpp"
MikamiUitOpen 0:8c850cf6285d 33 #include "MyTicker13.hpp"
MikamiUitOpen 0:8c850cf6285d 34 #include "MyTicker14.hpp"
MikamiUitOpen 0:8c850cf6285d 35 #include "F446_AdcIntr.hpp"
MikamiUitOpen 0:8c850cf6285d 36 #include "F446_Dac.hpp"
MikamiUitOpen 0:8c850cf6285d 37 #include "PushButton.hpp"
MikamiUitOpen 0:8c850cf6285d 38 using namespace Mikami;
MikamiUitOpen 0:8c850cf6285d 39 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:8c850cf6285d 40
MikamiUitOpen 0:8c850cf6285d 41 MyTicker14 steppingMotor_; // ステッピング・モータ駆動用
MikamiUitOpen 0:8c850cf6285d 42 AnalogIn adcA0_(A0); // 回転速度の制御のための AD 変換器として使用
MikamiUitOpen 0:8c850cf6285d 43 AdcF446_Intr adc_(100, A1); // 標本化周波数: 100 kHz
MikamiUitOpen 0:8c850cf6285d 44 DacF446 dac_; // DA 変換器
MikamiUitOpen 0:8c850cf6285d 45
MikamiUitOpen 0:8c850cf6285d 46 __IO bool ledOnOff_ = true; // LED の発光色切換えの ON/OFF で使用
MikamiUitOpen 0:8c850cf6285d 47
MikamiUitOpen 0:8c850cf6285d 48 // ステッピング・モータ駆動用タイマ割込み間隔を取得する
MikamiUitOpen 0:8c850cf6285d 49 int GetMotorController(float adc)
MikamiUitOpen 0:8c850cf6285d 50 {
MikamiUitOpen 0:8c850cf6285d 51 // SPG27-1101 の場合
MikamiUitOpen 0:8c850cf6285d 52 static const int INTVL1 = 6000;
MikamiUitOpen 0:8c850cf6285d 53 static const int INTVL2 = 3500;
MikamiUitOpen 0:8c850cf6285d 54
MikamiUitOpen 0:8c850cf6285d 55 return INTVL1 - (uint16_t)(adc*INTVL2);
MikamiUitOpen 0:8c850cf6285d 56 }
MikamiUitOpen 0:8c850cf6285d 57
MikamiUitOpen 0:8c850cf6285d 58 //------------------------------------------------------------------------------
MikamiUitOpen 0:8c850cf6285d 59 // 以下:割込みサービス・ルーチン
MikamiUitOpen 0:8c850cf6285d 60
MikamiUitOpen 0:8c850cf6285d 61 // LED の発光色切換えの ON/OFF
MikamiUitOpen 0:8c850cf6285d 62 void SwIsr()
MikamiUitOpen 0:8c850cf6285d 63 {
MikamiUitOpen 0:8c850cf6285d 64 ledOnOff_ = !ledOnOff_;
MikamiUitOpen 0:8c850cf6285d 65 if (ledOnOff_) printf("LED の発光色の切替が有効になりました.\r\n\n");
MikamiUitOpen 0:8c850cf6285d 66 else printf("LED の発光色の切替が無効になりました.\r\n");
MikamiUitOpen 0:8c850cf6285d 67 }
MikamiUitOpen 0:8c850cf6285d 68
MikamiUitOpen 0:8c850cf6285d 69 // ステッピング・モータを駆動するための割込みサービス・ルーチン
MikamiUitOpen 0:8c850cf6285d 70 void TimerIsr()
MikamiUitOpen 0:8c850cf6285d 71 {
MikamiUitOpen 0:8c850cf6285d 72 static BusOut motor(D10, D11, D12, D13); // D10: LSB, D13: MSB
MikamiUitOpen 0:8c850cf6285d 73 static const uint8_t CW[4] = { 0x03, 0x06, 0x0C, 0x09 };
MikamiUitOpen 0:8c850cf6285d 74 static int index = 0;
MikamiUitOpen 0:8c850cf6285d 75
MikamiUitOpen 0:8c850cf6285d 76 motor = CW[index++]; // CW
MikamiUitOpen 0:8c850cf6285d 77 index &= 0x03;
MikamiUitOpen 0:8c850cf6285d 78 }
MikamiUitOpen 0:8c850cf6285d 79
MikamiUitOpen 0:8c850cf6285d 80 // モータのスピードをコントロールするための割込みサービス・ルーチン
MikamiUitOpen 0:8c850cf6285d 81 void MotorSpeedIsr()
MikamiUitOpen 0:8c850cf6285d 82 {
MikamiUitOpen 0:8c850cf6285d 83 float value = adcA0_.read();
MikamiUitOpen 0:8c850cf6285d 84 // ステッピング・モータのスピード調整
MikamiUitOpen 0:8c850cf6285d 85 steppingMotor_.SetPeriod_us(GetMotorController(value));
MikamiUitOpen 0:8c850cf6285d 86 }
MikamiUitOpen 0:8c850cf6285d 87
MikamiUitOpen 0:8c850cf6285d 88 // AD 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:8c850cf6285d 89 void AdcIsr()
MikamiUitOpen 0:8c850cf6285d 90 {
MikamiUitOpen 0:8c850cf6285d 91 dac_.Write(adc_.Read());
MikamiUitOpen 0:8c850cf6285d 92 }
MikamiUitOpen 0:8c850cf6285d 93
MikamiUitOpen 0:8c850cf6285d 94 // 割込みサービス・ルーチン:ここまで
MikamiUitOpen 0:8c850cf6285d 95 //------------------------------------------------------------------------------
MikamiUitOpen 0:8c850cf6285d 96
MikamiUitOpen 0:8c850cf6285d 97 int main()
MikamiUitOpen 0:8c850cf6285d 98 {
MikamiUitOpen 0:8c850cf6285d 99 BusOut led(D2, D3, D4); // 赤, 緑, 青
MikamiUitOpen 0:8c850cf6285d 100 SetOpenDrain(D2); // D2 をオープンドレインに設定
MikamiUitOpen 0:8c850cf6285d 101 led = 0x07; // 全消灯
MikamiUitOpen 0:8c850cf6285d 102 Aqm1602 lcd; // LCD 表示器,D14: SDA, D15: SCL
MikamiUitOpen 0:8c850cf6285d 103 ADT7410 tempr; // 温度センサ,D14: SDA, D15: SCL
MikamiUitOpen 0:8c850cf6285d 104
MikamiUitOpen 0:8c850cf6285d 105 // チャタリング防止付き入力
MikamiUitOpen 0:8c850cf6285d 106 // D6: PB_10
MikamiUitOpen 0:8c850cf6285d 107 PushButton sw(D6, PullDown, PushButton::RISE, &SwIsr, 0.2);
MikamiUitOpen 0:8c850cf6285d 108
MikamiUitOpen 0:8c850cf6285d 109 printf("\r\n外付け回路のテスト\r\n");
MikamiUitOpen 0:8c850cf6285d 110
MikamiUitOpen 0:8c850cf6285d 111 // LED の準備
MikamiUitOpen 0:8c850cf6285d 112 uint8_t ledSw = 0;
MikamiUitOpen 0:8c850cf6285d 113
MikamiUitOpen 0:8c850cf6285d 114 // LCD 表示器の準備
MikamiUitOpen 0:8c850cf6285d 115 if (lcd.IsConnected()) printf("LCD は接続されています\r\n");
MikamiUitOpen 0:8c850cf6285d 116 bool dotOn = true;
MikamiUitOpen 0:8c850cf6285d 117 lcd.WriteStringXY("ADT7410", 0, 0);
MikamiUitOpen 0:8c850cf6285d 118
MikamiUitOpen 0:8c850cf6285d 119 // ステッピング・モータの準備
MikamiUitOpen 0:8c850cf6285d 120 float value = adcA0_.read();
MikamiUitOpen 0:8c850cf6285d 121 steppingMotor_.Attach_us(&TimerIsr, GetMotorController(value));
MikamiUitOpen 0:8c850cf6285d 122 MyTicker13 motorSpeed; // モータのスピードを決める値の読取りで使用
MikamiUitOpen 0:8c850cf6285d 123 motorSpeed.Attach_ms(&MotorSpeedIsr, 10); // 10 ms ごと
MikamiUitOpen 0:8c850cf6285d 124
MikamiUitOpen 0:8c850cf6285d 125 // AD 変換器の準備
MikamiUitOpen 0:8c850cf6285d 126 adc_.SetIntrVec(&AdcIsr); // 割り込みサービス・ルーチンの設定
MikamiUitOpen 0:8c850cf6285d 127
MikamiUitOpen 0:8c850cf6285d 128 // 割込み優先順位設定
MikamiUitOpen 0:8c850cf6285d 129 NVIC_SetPriority(ADC_IRQn, 0); // AdcF446_Intr, 最優先
MikamiUitOpen 0:8c850cf6285d 130 NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 1); // MyTicker14
MikamiUitOpen 0:8c850cf6285d 131 NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 2); // MyTicker13
MikamiUitOpen 0:8c850cf6285d 132 NVIC_SetPriority(EXTI15_10_IRQn, 3); // PushButton
MikamiUitOpen 0:8c850cf6285d 133
MikamiUitOpen 0:8c850cf6285d 134 while (true)
MikamiUitOpen 0:8c850cf6285d 135 {
MikamiUitOpen 0:8c850cf6285d 136 // LED の点灯/消灯制御
MikamiUitOpen 0:8c850cf6285d 137 if (ledOnOff_)
MikamiUitOpen 0:8c850cf6285d 138 {
MikamiUitOpen 0:8c850cf6285d 139 led = ~ledSw++;
MikamiUitOpen 0:8c850cf6285d 140 ledSw &= 0x07;
MikamiUitOpen 0:8c850cf6285d 141 }
MikamiUitOpen 0:8c850cf6285d 142
MikamiUitOpen 0:8c850cf6285d 143 // 温度センサと LCD への表示
MikamiUitOpen 0:8c850cf6285d 144 float value = tempr.Read(); // 温度読み取り
MikamiUitOpen 0:8c850cf6285d 145 lcd.WriteValueXY("%5.1f \xDF""C", value, 0, 1);
MikamiUitOpen 0:8c850cf6285d 146 if (dotOn) lcd.WriteStringXY("#", 15, 1);
MikamiUitOpen 0:8c850cf6285d 147 else lcd.WriteStringXY(" ", 15, 1);
MikamiUitOpen 0:8c850cf6285d 148 dotOn = !dotOn;
MikamiUitOpen 0:8c850cf6285d 149
MikamiUitOpen 0:8c850cf6285d 150 wait(1);
MikamiUitOpen 0:8c850cf6285d 151 }
MikamiUitOpen 2:3f2be675f975 152 }