NUCLEOのキットを使った秒針

Dependencies:   mbed-src

Committer:
motomiya
Date:
Tue Mar 22 22:52:08 2016 +0000
Revision:
0:a1180efb20e0
?????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
motomiya 0:a1180efb20e0 1 /*************************************************
motomiya 0:a1180efb20e0 2 "Nucleo_motor_control"
motomiya 0:a1180efb20e0 3 Nucleo Pack
motomiya 0:a1180efb20e0 4 マイコンボード NUCLEO-F302R8
motomiya 0:a1180efb20e0 5 拡張ボード X-NUCLEO-IHM07M1
motomiya 0:a1180efb20e0 6 モーター BR2804-1700KV-1
motomiya 0:a1180efb20e0 7 を使ったモーター制御の実験
motomiya 0:a1180efb20e0 8
motomiya 0:a1180efb20e0 9 アナログPWM版 秒針仕様
motomiya 0:a1180efb20e0 10 Copyright(C) 2016 Columbus-seiki
motomiya 0:a1180efb20e0 11
motomiya 0:a1180efb20e0 12 2016-02-22 Rev0
motomiya 0:a1180efb20e0 13
motomiya 0:a1180efb20e0 14 ***************************************************/
motomiya 0:a1180efb20e0 15 #include "mbed.h"
motomiya 0:a1180efb20e0 16 #include "main.h"
motomiya 0:a1180efb20e0 17
motomiya 0:a1180efb20e0 18 #define POLE_PAIR 7//モーターの磁極対数
motomiya 0:a1180efb20e0 19 #define PERIOD_TIMER 0.005 //タイマー周期(S)
motomiya 0:a1180efb20e0 20 #define SINTBL_LENGTH 512 //sinTbl[]要素数
motomiya 0:a1180efb20e0 21 #define PERIOD_PWM 0.0002 //PWM周期(S) これ以下では ヒゲ がでる
motomiya 0:a1180efb20e0 22 #define HALF_PWM (PERIOD_PWM / 2) //PWM周期の真ん中 PERIOD_PWM÷2
motomiya 0:a1180efb20e0 23 #define DEG360 1024 //360°相当
motomiya 0:a1180efb20e0 24 #define DEG120 341 //120°
motomiya 0:a1180efb20e0 25 #define DEG240 682 //240°
motomiya 0:a1180efb20e0 26
motomiya 0:a1180efb20e0 27 //入出力ピンを定義
motomiya 0:a1180efb20e0 28 DigitalIn mybutton(USER_BUTTON);
motomiya 0:a1180efb20e0 29 //Serial pc(PA_2, PA_3); //USB/COM パソコンの仮想シリアルポートへ。ここでは使いません
motomiya 0:a1180efb20e0 30 DigitalOut ld2(PB_13); //LD2 グリーンLED
motomiya 0:a1180efb20e0 31 DigitalOut d11(PB_2); //D11 パワボード赤LED
motomiya 0:a1180efb20e0 32
motomiya 0:a1180efb20e0 33 //pwm出力の定義
motomiya 0:a1180efb20e0 34 PwmOut pwmU(PA_8), pwmV(PA_9), pwmW(PA_10);//それぞれUH_PWM, VH_PWM, WH_PWM
motomiya 0:a1180efb20e0 35
motomiya 0:a1180efb20e0 36 //IOの定義
motomiya 0:a1180efb20e0 37 DigitalOut enableU(PC_10), enableV(PC_11), enableW(PC_12);//それぞれEnable_CH1-L6230, _CH2-, _CH3-
motomiya 0:a1180efb20e0 38
motomiya 0:a1180efb20e0 39 //アナログ入力の定義
motomiya 0:a1180efb20e0 40 AnalogIn ain(PB_1);//R42 POTENTIOPOTENTIOMETER
motomiya 0:a1180efb20e0 41
motomiya 0:a1180efb20e0 42 //タイマーの定義
motomiya 0:a1180efb20e0 43 Ticker myTimer;//繰返しタイマー
motomiya 0:a1180efb20e0 44
motomiya 0:a1180efb20e0 45 //変数
motomiya 0:a1180efb20e0 46 int preMybutton; //記憶
motomiya 0:a1180efb20e0 47 int enablePWM=0;//PWM開始と停止フラグ
motomiya 0:a1180efb20e0 48 //int scope[100];//モニター用バッファ
motomiya 0:a1180efb20e0 49 int count, loopCount=0; //カウンター
motomiya 0:a1180efb20e0 50 double outDuty=0 ,outU, outV, outW; //PWM出力デューティー
motomiya 0:a1180efb20e0 51 float theta, omega; //角度と角速度
motomiya 0:a1180efb20e0 52 int timePerRound=60; //1回転時間(S)
motomiya 0:a1180efb20e0 53
motomiya 0:a1180efb20e0 54 /**********************************
motomiya 0:a1180efb20e0 55 sin関数
motomiya 0:a1180efb20e0 56 引数:最大1024=360°
motomiya 0:a1180efb20e0 57 出力:最大512=1.0
motomiya 0:a1180efb20e0 58 ***********************************/
motomiya 0:a1180efb20e0 59 int mySin(int angleNum)
motomiya 0:a1180efb20e0 60 {
motomiya 0:a1180efb20e0 61
motomiya 0:a1180efb20e0 62 angleNum &= 0x3ff; //0x3ff=1023 でマスク
motomiya 0:a1180efb20e0 63 if(angleNum >= 512) //180~360°
motomiya 0:a1180efb20e0 64 return -sinTbl[angleNum - 512];
motomiya 0:a1180efb20e0 65 else //0~180°
motomiya 0:a1180efb20e0 66 return sinTbl[angleNum];
motomiya 0:a1180efb20e0 67 }
motomiya 0:a1180efb20e0 68
motomiya 0:a1180efb20e0 69
motomiya 0:a1180efb20e0 70 /**********************************
motomiya 0:a1180efb20e0 71 タイマー割込み関数 5mS
motomiya 0:a1180efb20e0 72 ***********************************/
motomiya 0:a1180efb20e0 73 void myTimerCallBack() //全相をONにする
motomiya 0:a1180efb20e0 74 {
motomiya 0:a1180efb20e0 75 outDuty = 0.2; //最大1.0 出力電圧を調整します
motomiya 0:a1180efb20e0 76
motomiya 0:a1180efb20e0 77 theta += omega; //増加分
motomiya 0:a1180efb20e0 78 if(theta >= 1024) //360°オーバーフローを防止
motomiya 0:a1180efb20e0 79 theta -= 1024;
motomiya 0:a1180efb20e0 80 else if(theta <= -1024)
motomiya 0:a1180efb20e0 81 theta += 1024;
motomiya 0:a1180efb20e0 82
motomiya 0:a1180efb20e0 83 pwmU.pulsewidth(HALF_PWM + outDuty * mySin((int)theta & 0x3ff) / 512.0 * HALF_PWM);
motomiya 0:a1180efb20e0 84 pwmV.pulsewidth(HALF_PWM + outDuty * mySin(((int)theta - DEG120) & 0x3ff) / 512.0 * HALF_PWM);
motomiya 0:a1180efb20e0 85 pwmW.pulsewidth(HALF_PWM + outDuty * mySin(((int)theta - DEG240) & 0x3ff) / 512.0 * HALF_PWM);
motomiya 0:a1180efb20e0 86
motomiya 0:a1180efb20e0 87 //サイクルカウンター処理(同期)
motomiya 0:a1180efb20e0 88 count++;
motomiya 0:a1180efb20e0 89 if( count == 100) {
motomiya 0:a1180efb20e0 90 count = 0;
motomiya 0:a1180efb20e0 91 loopCount = 1; //loopの同期用 5mS X 100 = 0.5S
motomiya 0:a1180efb20e0 92 }
motomiya 0:a1180efb20e0 93
motomiya 0:a1180efb20e0 94 }
motomiya 0:a1180efb20e0 95 /***********************************
motomiya 0:a1180efb20e0 96
motomiya 0:a1180efb20e0 97 ************************************/
motomiya 0:a1180efb20e0 98 int main()
motomiya 0:a1180efb20e0 99 {
motomiya 0:a1180efb20e0 100
motomiya 0:a1180efb20e0 101 //pwmデューティー 初期値
motomiya 0:a1180efb20e0 102 outU = 0;
motomiya 0:a1180efb20e0 103 outV = 0;
motomiya 0:a1180efb20e0 104 outW = 0;
motomiya 0:a1180efb20e0 105
motomiya 0:a1180efb20e0 106 //PWM設定
motomiya 0:a1180efb20e0 107 pwmU.period(PERIOD_PWM);//0.2mS 5KHz
motomiya 0:a1180efb20e0 108 pwmV.period(PERIOD_PWM);
motomiya 0:a1180efb20e0 109 pwmW.period(PERIOD_PWM);
motomiya 0:a1180efb20e0 110
motomiya 0:a1180efb20e0 111 //タイマー設定
motomiya 0:a1180efb20e0 112 myTimer.attach(&myTimerCallBack, PERIOD_TIMER);//5mS毎にmyTimerCallBack()がコールされます
motomiya 0:a1180efb20e0 113
motomiya 0:a1180efb20e0 114
motomiya 0:a1180efb20e0 115 while(1) {
motomiya 0:a1180efb20e0 116 //------ およそ一定周期の処理 -------
motomiya 0:a1180efb20e0 117 if(loopCount != 0) {//5x100=0.5S
motomiya 0:a1180efb20e0 118 loopCount = 0;
motomiya 0:a1180efb20e0 119
motomiya 0:a1180efb20e0 120 ld2 = !ld2; //点滅
motomiya 0:a1180efb20e0 121 d11 = !d11; //パワボード
motomiya 0:a1180efb20e0 122 }
motomiya 0:a1180efb20e0 123
motomiya 0:a1180efb20e0 124 //-------- 時間に関係しない処理 --------
motomiya 0:a1180efb20e0 125 //PWM開始と停止
motomiya 0:a1180efb20e0 126 if((int)mybutton != preMybutton) {//ボタンが押された。チャタリングを考慮していません
motomiya 0:a1180efb20e0 127 preMybutton = (int)mybutton;//次に押されたときのために記憶
motomiya 0:a1180efb20e0 128
motomiya 0:a1180efb20e0 129 if(mybutton == 0)//押されたときだけ。 
motomiya 0:a1180efb20e0 130 enablePWM = ~enablePWM;//オルタネート
motomiya 0:a1180efb20e0 131
motomiya 0:a1180efb20e0 132 //PWM開始
motomiya 0:a1180efb20e0 133 if(enablePWM) {
motomiya 0:a1180efb20e0 134 enableU = 1;//PWM出力ON. L6230PのENable端子です
motomiya 0:a1180efb20e0 135 enableV = 1;
motomiya 0:a1180efb20e0 136 enableW = 1;
motomiya 0:a1180efb20e0 137 } else {
motomiya 0:a1180efb20e0 138 enableU = 0;//PWM出力OFF. L6230PのENable端子です. PWM出力は止まりません
motomiya 0:a1180efb20e0 139 enableV = 0;
motomiya 0:a1180efb20e0 140 enableW = 0;
motomiya 0:a1180efb20e0 141 }
motomiya 0:a1180efb20e0 142 } //ボタンが押された の終わり
motomiya 0:a1180efb20e0 143
motomiya 0:a1180efb20e0 144 //速度指定 ポテンショメータをディップスイッチのように処理
motomiya 0:a1180efb20e0 145 if(ain < 0.3L) //ain=0~1.0
motomiya 0:a1180efb20e0 146 timePerRound = 60 * 5; //5分時計 ボリューム左一杯
motomiya 0:a1180efb20e0 147 else if( ain < 0.6L)
motomiya 0:a1180efb20e0 148 timePerRound = 60 * 3; //3分時計 ボリューム中央
motomiya 0:a1180efb20e0 149 else
motomiya 0:a1180efb20e0 150 timePerRound = 60; //1分時計 ボリューム右一杯
motomiya 0:a1180efb20e0 151
motomiya 0:a1180efb20e0 152 //指定の周期を角速度に変換
motomiya 0:a1180efb20e0 153 omega = PERIOD_TIMER * DEG360 * POLE_PAIR / timePerRound;
motomiya 0:a1180efb20e0 154
motomiya 0:a1180efb20e0 155
motomiya 0:a1180efb20e0 156 }//END while(1)
motomiya 0:a1180efb20e0 157
motomiya 0:a1180efb20e0 158
motomiya 0:a1180efb20e0 159 }
motomiya 0:a1180efb20e0 160