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

Dependencies:   mbed UIT_SetOutputPortType UIT_AQM1602 UIT_ADT7410

Committer:
MikamiUitOpen
Date:
Tue Mar 03 03:30:50 2020 +0000
Revision:
0:8c850cf6285d
Child:
1:0a21041026c7
1

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