うごく

Dependencies:   mbed

Committer:
maxonK
Date:
Sat May 09 08:23:08 2015 +0000
Revision:
2:ad8fad576e79
Parent:
1:f50a49407c60
??????????????;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxonK 0:9a0a89ffaa43 1
maxonK 0:9a0a89ffaa43 2 #include <mbed.h>
maxonK 0:9a0a89ffaa43 3 #include <stdlib.h>
maxonK 0:9a0a89ffaa43 4 #include <stdio.h>
maxonK 0:9a0a89ffaa43 5 #include <string.h>
maxonK 0:9a0a89ffaa43 6
maxonK 0:9a0a89ffaa43 7 //文字列受信関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 8 int stringReceive();
maxonK 0:9a0a89ffaa43 9 //float cramp関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 10 int cramp(int,int,int);
maxonK 0:9a0a89ffaa43 11 //serialハードウェアバッファクリア関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 12 void bufferClear ();
maxonK 0:9a0a89ffaa43 13
maxonK 0:9a0a89ffaa43 14 //dp4pwm初期化関数プロトタイプ宣言
maxonK 0:9a0a89ffaa43 15 void CT32B0_MAT3_PWM_registerSet(unsigned int );
maxonK 0:9a0a89ffaa43 16 //グローバル変数宣言
maxonK 0:9a0a89ffaa43 17 //dp4pwmDuty
maxonK 0:9a0a89ffaa43 18 unsigned int dp4pwmDuty = 0;
maxonK 0:9a0a89ffaa43 19 //dp4pwmFrequency
maxonK 0:9a0a89ffaa43 20 unsigned int dp4pwmFrequency = 0;
maxonK 0:9a0a89ffaa43 21
maxonK 0:9a0a89ffaa43 22
maxonK 0:9a0a89ffaa43 23 DigitalOut myled(LED1);
maxonK 1:f50a49407c60 24 //タイムアウトタイマー初期化
maxonK 1:f50a49407c60 25 Timer timeOutTimer;
maxonK 0:9a0a89ffaa43 26
maxonK 0:9a0a89ffaa43 27 //シリアル初期化
maxonK 0:9a0a89ffaa43 28 Serial sensSerial (dp16, dp15);
maxonK 0:9a0a89ffaa43 29 /*
maxonK 0:9a0a89ffaa43 30 //I2C初期化
maxonK 0:9a0a89ffaa43 31 I2C i2c(dp5 , dp27 ); //sda scl
maxonK 0:9a0a89ffaa43 32 const int addr = 0x20 << 1; // I2C address
maxonK 0:9a0a89ffaa43 33 */
maxonK 0:9a0a89ffaa43 34
maxonK 0:9a0a89ffaa43 35 //割り込みハンドラ(PICでいうISRのこと)
maxonK 0:9a0a89ffaa43 36 void TIMER32_0_IRQHandler(void)
maxonK 0:9a0a89ffaa43 37 {
maxonK 0:9a0a89ffaa43 38 //タイマー操作
maxonK 0:9a0a89ffaa43 39 //タイマリセット→保持
maxonK 0:9a0a89ffaa43 40 //タイマ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 41 volatile unsigned int *TMR32B0TCRLocal = (unsigned int *)0x40014004;
maxonK 0:9a0a89ffaa43 42 //1ビット目を1にしてタイマリセット
maxonK 0:9a0a89ffaa43 43 unsigned int mask_TMR32B0TCR = 1 << 1;
maxonK 0:9a0a89ffaa43 44 //タイマ制御レジスタセット
maxonK 0:9a0a89ffaa43 45 *TMR32B0TCRLocal |= mask_TMR32B0TCR;
maxonK 0:9a0a89ffaa43 46 /***********************************************************************************/
maxonK 0:9a0a89ffaa43 47 //マッチレジスタセット
maxonK 0:9a0a89ffaa43 48 //新しくセットする値はグローバルで宣言しとく(割り込みハンドラは、引数、戻り値ともに意味を成さない)
maxonK 0:9a0a89ffaa43 49 //0~1023もらって0%~100%のpwm出力する
maxonK 0:9a0a89ffaa43 50 //CT32B0_MAT3に対応したマッチレジスタアドレス
maxonK 0:9a0a89ffaa43 51 volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024);
maxonK 0:9a0a89ffaa43 52 //デューティセット
maxonK 0:9a0a89ffaa43 53 *TMR32B0MR3 = ((((48000000 / dp4pwmFrequency)/20)*18)+((((48000000 / dp4pwmFrequency)/20)/1024) * (1024 - dp4pwmDuty)));//停波(18ms)+((1ms/1024)*(1024-Duty))
maxonK 0:9a0a89ffaa43 54 //*TMR32B0MR2 = (((48000000 / dp24pwmFrequency) / 1024)*(1024 - dp24pwmDuty));
maxonK 0:9a0a89ffaa43 55 /*******************************************************************************************/
maxonK 0:9a0a89ffaa43 56
maxonK 0:9a0a89ffaa43 57 //タイマリセット解除
maxonK 0:9a0a89ffaa43 58 //タイマ制御レジスタセット
maxonK 0:9a0a89ffaa43 59 *TMR32B0TCRLocal &= ~mask_TMR32B0TCR;
maxonK 0:9a0a89ffaa43 60 /*******************************************************************************************/
maxonK 0:9a0a89ffaa43 61
maxonK 0:9a0a89ffaa43 62 //マッチチャネル0 用の割り込みフラグリセット
maxonK 0:9a0a89ffaa43 63 //割り込みレジスタアドレス
maxonK 0:9a0a89ffaa43 64 volatile unsigned int *TMR32B0IRLocal = (unsigned int *)0x40014000;
maxonK 0:9a0a89ffaa43 65 //0ビット目を1にしてMR0の割り込みフラグをリセット
maxonK 0:9a0a89ffaa43 66 unsigned int mask_TMR32B0IR = 1;
maxonK 0:9a0a89ffaa43 67 //割り込みレジスタセット
maxonK 0:9a0a89ffaa43 68 *TMR32B0IRLocal |= mask_TMR32B0IR;
maxonK 0:9a0a89ffaa43 69
maxonK 0:9a0a89ffaa43 70 }
maxonK 0:9a0a89ffaa43 71
maxonK 0:9a0a89ffaa43 72
maxonK 0:9a0a89ffaa43 73 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
maxonK 0:9a0a89ffaa43 74 /*****************************************************************************************************************/
maxonK 0:9a0a89ffaa43 75
maxonK 0:9a0a89ffaa43 76 int main()
maxonK 0:9a0a89ffaa43 77 {
maxonK 0:9a0a89ffaa43 78 //setup
maxonK 0:9a0a89ffaa43 79 sensSerial.baud(9600);//シリアル通信開く
maxonK 0:9a0a89ffaa43 80 //(switchmbed基板でUSB通信するときは低速に抑えること)
maxonK 0:9a0a89ffaa43 81 myled = 0;
maxonK 0:9a0a89ffaa43 82
maxonK 0:9a0a89ffaa43 83 //割り込み設定
maxonK 0:9a0a89ffaa43 84 //Interrupt Service Routineが書いてある、割り込み時ジャンプ先アドレス設定?
maxonK 0:9a0a89ffaa43 85 NVIC_SetVector(TIMER_32_0_IRQn, (uint32_t)&TIMER32_0_IRQHandler);
maxonK 0:9a0a89ffaa43 86 //割り込みハンドライネーブル
maxonK 0:9a0a89ffaa43 87 NVIC_EnableIRQ(TIMER_32_0_IRQn);
maxonK 0:9a0a89ffaa43 88 //割り込み優先順位設定
maxonK 0:9a0a89ffaa43 89 NVIC_SetPriority(TIMER_32_0_IRQn, 1);
maxonK 0:9a0a89ffaa43 90 //PWM周波数
maxonK 0:9a0a89ffaa43 91 dp4pwmFrequency = 50;
maxonK 0:9a0a89ffaa43 92 //dp4pwm初期化
maxonK 0:9a0a89ffaa43 93 CT32B0_MAT3_PWM_registerSet(dp4pwmFrequency);
maxonK 0:9a0a89ffaa43 94
maxonK 0:9a0a89ffaa43 95 //ESCのセンター感知のため中立サーボ信号を5秒間出力
maxonK 0:9a0a89ffaa43 96 //pwm関係
maxonK 0:9a0a89ffaa43 97 //グローバルdp4pwmDutyセット
maxonK 0:9a0a89ffaa43 98 dp4pwmDuty = (1024 / 2);
maxonK 0:9a0a89ffaa43 99 //pwm周波数設定用マッチレジスタの動作をタイマークリアから割り込み発生へ変更
maxonK 0:9a0a89ffaa43 100 //マッチ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 101 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:9a0a89ffaa43 102 //マッチ制御レジスタマスク
maxonK 0:9a0a89ffaa43 103 //マッチレジスタMR0とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止される
maxonK 0:9a0a89ffaa43 104 unsigned int mask_TMR32B0MCR = 1;
maxonK 0:9a0a89ffaa43 105 //マッチ制御レジスタセット
maxonK 0:9a0a89ffaa43 106 *TMR32B0MCR = mask_TMR32B0MCR;
maxonK 0:9a0a89ffaa43 107 //待ち
maxonK 0:9a0a89ffaa43 108 wait(5);
maxonK 0:9a0a89ffaa43 109
maxonK 0:9a0a89ffaa43 110 /***************************************************************************/
maxonK 0:9a0a89ffaa43 111 //mainloop
maxonK 0:9a0a89ffaa43 112 while(1) {
maxonK 0:9a0a89ffaa43 113 int receiveVal = 0;
maxonK 0:9a0a89ffaa43 114 static int sReceiveVal = 0;
maxonK 0:9a0a89ffaa43 115 int gain = 10;
maxonK 0:9a0a89ffaa43 116 receiveVal = stringReceive();
maxonK 0:9a0a89ffaa43 117
maxonK 0:9a0a89ffaa43 118
maxonK 0:9a0a89ffaa43 119 if(receiveVal >= 0) {
maxonK 0:9a0a89ffaa43 120 myled = !myled;
maxonK 0:9a0a89ffaa43 121
maxonK 0:9a0a89ffaa43 122 //pwm関係
maxonK 0:9a0a89ffaa43 123 //グローバルdp4pwmDutyセット
maxonK 0:9a0a89ffaa43 124 dp4pwmDuty = cramp((( receiveVal*gain ) - (((1023*gain)/2)-(1023/2)) ),0,1023);
maxonK 0:9a0a89ffaa43 125 //dp24pwmDuty = cramp((( receiveVal*gain ) - (((1023*gain)/2)-(1023/2)) - (512 - 76) ),51,102);
maxonK 0:9a0a89ffaa43 126 //dp24pwmDuty = receiveVal;
maxonK 0:9a0a89ffaa43 127
maxonK 0:9a0a89ffaa43 128 if(receiveVal != sReceiveVal) {
maxonK 0:9a0a89ffaa43 129 sReceiveVal = receiveVal;
maxonK 0:9a0a89ffaa43 130 //pwm周波数設定用マッチレジスタの動作をタイマークリアから割り込み発生へ変更
maxonK 0:9a0a89ffaa43 131 //マッチ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 132 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:9a0a89ffaa43 133 //マッチ制御レジスタマスク
maxonK 0:9a0a89ffaa43 134 //マッチレジスタMR0とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止される
maxonK 0:9a0a89ffaa43 135 unsigned int mask_TMR32B0MCR = 1;
maxonK 0:9a0a89ffaa43 136 //マッチ制御レジスタセット
maxonK 0:9a0a89ffaa43 137 *TMR32B0MCR = mask_TMR32B0MCR;
maxonK 0:9a0a89ffaa43 138 }
maxonK 0:9a0a89ffaa43 139 /*
maxonK 0:9a0a89ffaa43 140 //I2C送信
maxonK 0:9a0a89ffaa43 141 char cmd[10] = {'\0'};//I2C送信バッファ
maxonK 0:9a0a89ffaa43 142 //int to asic2(sprintf関数)
maxonK 0:9a0a89ffaa43 143 sprintf(cmd ,"%4d",dp4pwmDuty);//格納する配列アドレス , 書式文字列
maxonK 0:9a0a89ffaa43 144 //null終端
maxonK 0:9a0a89ffaa43 145 cmd[sizeof(cmd) - 1] = '\0'; // NULL 終端する
maxonK 0:9a0a89ffaa43 146 //書き出し
maxonK 0:9a0a89ffaa43 147 i2c.write(addr, cmd, 7);
maxonK 0:9a0a89ffaa43 148 */
maxonK 0:9a0a89ffaa43 149 }
maxonK 0:9a0a89ffaa43 150
maxonK 0:9a0a89ffaa43 151 }
maxonK 0:9a0a89ffaa43 152 /****************************************************************************/
maxonK 0:9a0a89ffaa43 153
maxonK 0:9a0a89ffaa43 154 }
maxonK 0:9a0a89ffaa43 155
maxonK 0:9a0a89ffaa43 156 /*****************************************************************************************************************/
maxonK 0:9a0a89ffaa43 157 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
maxonK 0:9a0a89ffaa43 158
maxonK 0:9a0a89ffaa43 159
maxonK 0:9a0a89ffaa43 160 //受信関数
maxonK 0:9a0a89ffaa43 161 //受信完了時0~4095
maxonK 1:f50a49407c60 162 //タイムアウト検出用のタイマーをグローバルで初期化する必要あり
maxonK 1:f50a49407c60 163 //Timer timeOutTimer;
maxonK 0:9a0a89ffaa43 164 int stringReceive()
maxonK 0:9a0a89ffaa43 165 {
maxonK 0:9a0a89ffaa43 166 //各種定数
maxonK 0:9a0a89ffaa43 167 //正常なデータ長,書き込み位置大きくなりすぎていないかチェック用
maxonK 0:9a0a89ffaa43 168 const int dataLength = 7;//7個(6個のデータ+null終端)(添字は0~ 宣言時の大きさは1~)(添字の位置確認時は-1する)
maxonK 0:9a0a89ffaa43 169 //startbitに使用する文字
maxonK 0:9a0a89ffaa43 170 char startbitChar = '*';
maxonK 0:9a0a89ffaa43 171 //stopbitに使用する文字
maxonK 0:9a0a89ffaa43 172 char stopbitChar = '#';
maxonK 0:9a0a89ffaa43 173 //各種変数
maxonK 0:9a0a89ffaa43 174 //現在書き込むべきバッファの位置変数
maxonK 0:9a0a89ffaa43 175 static int stringPosition = 0;
maxonK 0:9a0a89ffaa43 176 //受信値一時格納変数
maxonK 0:9a0a89ffaa43 177 char receiveChar = '\0';
maxonK 0:9a0a89ffaa43 178 //受信データ格納バッファ文字列
maxonK 0:9a0a89ffaa43 179 static char receiveDataString [dataLength] = {'\0'};//7個
maxonK 1:f50a49407c60 180 //データ送信要求フラグ
maxonK 1:f50a49407c60 181 static bool Cflag = true;
maxonK 1:f50a49407c60 182 //関数内セットアップルーチン実行staticフラグ
maxonK 1:f50a49407c60 183 //はじめてこの関数が呼ばれたときだけ実行される
maxonK 1:f50a49407c60 184 static bool setup = false;
maxonK 1:f50a49407c60 185 if(!setup){
maxonK 1:f50a49407c60 186 timeOutTimer.start();
maxonK 2:ad8fad576e79 187 Cflag = true;
maxonK 1:f50a49407c60 188 setup = true;
maxonK 1:f50a49407c60 189 }
maxonK 0:9a0a89ffaa43 190
maxonK 1:f50a49407c60 191 //タイムアウトによるデータ送信要求フラグセット
maxonK 1:f50a49407c60 192 if(timeOutTimer.read() >= 1){
maxonK 1:f50a49407c60 193 Cflag = true;
maxonK 1:f50a49407c60 194 }
maxonK 0:9a0a89ffaa43 195
maxonK 0:9a0a89ffaa43 196 //データ送信要求
maxonK 1:f50a49407c60 197 //sensSerial.putc('C');
maxonK 1:f50a49407c60 198 if(Cflag){
maxonK 1:f50a49407c60 199 sensSerial.putc('C');
maxonK 1:f50a49407c60 200 Cflag = false;
maxonK 1:f50a49407c60 201 //タイマリセット
maxonK 1:f50a49407c60 202 timeOutTimer.stop();
maxonK 1:f50a49407c60 203 timeOutTimer.reset();
maxonK 1:f50a49407c60 204 timeOutTimer.start();
maxonK 1:f50a49407c60 205 }
maxonK 1:f50a49407c60 206
maxonK 1:f50a49407c60 207
maxonK 0:9a0a89ffaa43 208 //ハードウェアバッファに到着した情報があるか
maxonK 0:9a0a89ffaa43 209 //空ならリターン、あるなら受信値格納用変数にうつす
maxonK 0:9a0a89ffaa43 210 if(!sensSerial.readable()) {
maxonK 0:9a0a89ffaa43 211 //空のとき
maxonK 0:9a0a89ffaa43 212 return -1;
maxonK 0:9a0a89ffaa43 213 } else { //あるとき
maxonK 0:9a0a89ffaa43 214 receiveChar = sensSerial.getc();
maxonK 0:9a0a89ffaa43 215 }
maxonK 0:9a0a89ffaa43 216 //バッファ書き込み位置変数が大きくなりすぎている
maxonK 0:9a0a89ffaa43 217 //(ストップビットがくるはずがきてない)ときリターン
maxonK 0:9a0a89ffaa43 218 if(stringPosition > (dataLength - 2)) {
maxonK 0:9a0a89ffaa43 219 stringPosition = 0;
maxonK 0:9a0a89ffaa43 220 //ハードウェアバッファクリア
maxonK 0:9a0a89ffaa43 221 bufferClear();
maxonK 0:9a0a89ffaa43 222 return -2;
maxonK 0:9a0a89ffaa43 223 }
maxonK 0:9a0a89ffaa43 224
maxonK 0:9a0a89ffaa43 225 //到着していたデータがスタートビットだった場合
maxonK 0:9a0a89ffaa43 226 if(receiveChar == startbitChar) {
maxonK 0:9a0a89ffaa43 227
maxonK 0:9a0a89ffaa43 228 //バッファクリア
maxonK 0:9a0a89ffaa43 229 for (int i = 0; i < dataLength; i++) { //配列の要素は0~ 大きさは1~
maxonK 0:9a0a89ffaa43 230 receiveDataString[i] = '\0';
maxonK 0:9a0a89ffaa43 231 }
maxonK 0:9a0a89ffaa43 232 //書き込み位置変数クリア
maxonK 0:9a0a89ffaa43 233 stringPosition = 0;
maxonK 0:9a0a89ffaa43 234 //バッファへ書き込み
maxonK 0:9a0a89ffaa43 235 receiveDataString[stringPosition] = receiveChar ;
maxonK 0:9a0a89ffaa43 236
maxonK 0:9a0a89ffaa43 237
maxonK 0:9a0a89ffaa43 238 //書き込み位置進め
maxonK 0:9a0a89ffaa43 239 stringPosition ++;
maxonK 0:9a0a89ffaa43 240 //-1リターン
maxonK 0:9a0a89ffaa43 241 return -3;
maxonK 0:9a0a89ffaa43 242 }
maxonK 0:9a0a89ffaa43 243
maxonK 0:9a0a89ffaa43 244 //到着していたデータが数字だった場合
maxonK 0:9a0a89ffaa43 245 if(receiveChar=='0'||receiveChar=='1'||receiveChar=='2'||receiveChar=='3'||receiveChar=='4'||receiveChar=='5'||receiveChar=='6'||receiveChar=='7'||receiveChar=='8'||receiveChar=='9') {
maxonK 0:9a0a89ffaa43 246 //バッファへ書き込み
maxonK 0:9a0a89ffaa43 247 receiveDataString[stringPosition] = receiveChar ;
maxonK 0:9a0a89ffaa43 248
maxonK 0:9a0a89ffaa43 249 //書き込み位置進め
maxonK 0:9a0a89ffaa43 250 stringPosition++;
maxonK 0:9a0a89ffaa43 251 //-1リターン
maxonK 0:9a0a89ffaa43 252 return -4;
maxonK 0:9a0a89ffaa43 253 }
maxonK 0:9a0a89ffaa43 254
maxonK 0:9a0a89ffaa43 255 //到着していたデータがストップビットだった場合
maxonK 0:9a0a89ffaa43 256 if(receiveChar == stopbitChar) {
maxonK 0:9a0a89ffaa43 257 //使う変数宣言
maxonK 0:9a0a89ffaa43 258 //バッファ内容をコピーするための文字列
maxonK 0:9a0a89ffaa43 259 char copyString [dataLength] = {'\0'};
maxonK 0:9a0a89ffaa43 260 //スタート、ストップビットをトリムしたデータだけの文字列
maxonK 0:9a0a89ffaa43 261 char trimString [dataLength] = {'\0'};
maxonK 0:9a0a89ffaa43 262 //文字列→数値変換後の値を格納する変数
maxonK 0:9a0a89ffaa43 263 int intVal = 0;
maxonK 0:9a0a89ffaa43 264
maxonK 0:9a0a89ffaa43 265 //バッファへ書き込み
maxonK 0:9a0a89ffaa43 266 receiveDataString[stringPosition] = receiveChar ;
maxonK 0:9a0a89ffaa43 267 //null終端
maxonK 0:9a0a89ffaa43 268 copyString[sizeof(copyString) - 1] = '\0'; /* NULL 終端する */
maxonK 0:9a0a89ffaa43 269 receiveDataString[sizeof(receiveDataString) - 1] = '\0';//null終端
maxonK 0:9a0a89ffaa43 270
maxonK 0:9a0a89ffaa43 271
maxonK 0:9a0a89ffaa43 272 //バッファの内容をうつす
maxonK 0:9a0a89ffaa43 273 strlcpy(copyString,receiveDataString,sizeof(copyString));
maxonK 0:9a0a89ffaa43 274 //バッファクリア
maxonK 0:9a0a89ffaa43 275 for (int i = 0; i < dataLength; i++) { //配列の要素は0~ 大きさは1~
maxonK 0:9a0a89ffaa43 276 receiveDataString[i] = '\0';
maxonK 0:9a0a89ffaa43 277 }
maxonK 0:9a0a89ffaa43 278 //ハードウェアバッファクリア
maxonK 0:9a0a89ffaa43 279 bufferClear();
maxonK 0:9a0a89ffaa43 280 //書き込み位置クリア
maxonK 0:9a0a89ffaa43 281 stringPosition = 0;
maxonK 0:9a0a89ffaa43 282
maxonK 0:9a0a89ffaa43 283 //以下チェックとAtoI
maxonK 0:9a0a89ffaa43 284 //先頭がスタートビットになってるか
maxonK 0:9a0a89ffaa43 285 if(!(copyString[0] == startbitChar)) {
maxonK 0:9a0a89ffaa43 286 return -5;
maxonK 0:9a0a89ffaa43 287 }
maxonK 0:9a0a89ffaa43 288 //末尾がストップビットになっているか(配列の最後はnull)
maxonK 0:9a0a89ffaa43 289 if(!(copyString[(dataLength - 2)] == stopbitChar)) {
maxonK 0:9a0a89ffaa43 290 return -6;
maxonK 0:9a0a89ffaa43 291 }
maxonK 0:9a0a89ffaa43 292 //データだけをトリミング
maxonK 0:9a0a89ffaa43 293 //1個目から、後ろから2個目まで*xxxx#(\n)
maxonK 0:9a0a89ffaa43 294 for(int Idx = 1; Idx < (dataLength - 2) ; Idx++) {
maxonK 0:9a0a89ffaa43 295 trimString[(Idx - 1) ] = copyString[Idx];
maxonK 0:9a0a89ffaa43 296 }
maxonK 0:9a0a89ffaa43 297 //null終端
maxonK 0:9a0a89ffaa43 298 trimString[sizeof(trimString) - 1] = '\0'; /* NULL 終端する */
maxonK 0:9a0a89ffaa43 299 //文字列→数値
maxonK 0:9a0a89ffaa43 300 intVal = atoi(trimString);
maxonK 1:f50a49407c60 301 //送信要求フラグセット
maxonK 1:f50a49407c60 302 Cflag = true;
maxonK 0:9a0a89ffaa43 303 //数値リターン
maxonK 0:9a0a89ffaa43 304 return intVal;
maxonK 0:9a0a89ffaa43 305
maxonK 0:9a0a89ffaa43 306 }
maxonK 0:9a0a89ffaa43 307
maxonK 0:9a0a89ffaa43 308
maxonK 0:9a0a89ffaa43 309 //以上にひっかからなかった異常時
maxonK 0:9a0a89ffaa43 310 //バッファクリア
maxonK 0:9a0a89ffaa43 311 for (int i = 0; i <dataLength; i++) { //配列の要素は0~ 大きさは1~
maxonK 0:9a0a89ffaa43 312 receiveDataString[i] = '\0';
maxonK 0:9a0a89ffaa43 313 }
maxonK 0:9a0a89ffaa43 314 //ハードウェアバッファクリア
maxonK 0:9a0a89ffaa43 315 bufferClear();
maxonK 0:9a0a89ffaa43 316 //書き込み位置クリア
maxonK 0:9a0a89ffaa43 317 stringPosition = 0;
maxonK 0:9a0a89ffaa43 318 //-3リターン
maxonK 0:9a0a89ffaa43 319 return -7;
maxonK 0:9a0a89ffaa43 320 }
maxonK 0:9a0a89ffaa43 321
maxonK 0:9a0a89ffaa43 322
maxonK 0:9a0a89ffaa43 323 //cramp関数
maxonK 0:9a0a89ffaa43 324 int cramp(int val , int min , int max)
maxonK 0:9a0a89ffaa43 325 {
maxonK 0:9a0a89ffaa43 326 if(val < min) {
maxonK 0:9a0a89ffaa43 327 return min;
maxonK 0:9a0a89ffaa43 328 }
maxonK 0:9a0a89ffaa43 329 if(val > max) {
maxonK 0:9a0a89ffaa43 330 return max;
maxonK 0:9a0a89ffaa43 331 }
maxonK 0:9a0a89ffaa43 332
maxonK 0:9a0a89ffaa43 333 return val;
maxonK 0:9a0a89ffaa43 334 }
maxonK 0:9a0a89ffaa43 335
maxonK 0:9a0a89ffaa43 336 //serialハードウェアバッファクリア関数
maxonK 0:9a0a89ffaa43 337 void bufferClear()
maxonK 0:9a0a89ffaa43 338 {
maxonK 0:9a0a89ffaa43 339 char temp = 0;
maxonK 0:9a0a89ffaa43 340 while(sensSerial.readable()) {
maxonK 0:9a0a89ffaa43 341 temp = sensSerial.getc();
maxonK 0:9a0a89ffaa43 342 }
maxonK 0:9a0a89ffaa43 343 return;
maxonK 0:9a0a89ffaa43 344 }
maxonK 0:9a0a89ffaa43 345
maxonK 0:9a0a89ffaa43 346
maxonK 0:9a0a89ffaa43 347
maxonK 0:9a0a89ffaa43 348
maxonK 0:9a0a89ffaa43 349
maxonK 0:9a0a89ffaa43 350
maxonK 0:9a0a89ffaa43 351 void CT32B0_MAT3_PWM_registerSet(unsigned int pwmFrequency)
maxonK 0:9a0a89ffaa43 352 {
maxonK 0:9a0a89ffaa43 353 //PWM機能設定用
maxonK 0:9a0a89ffaa43 354 //pwmピンのピン機能選択をmbedで行う
maxonK 0:9a0a89ffaa43 355 //PwmOut MAT2(dp24);//CT32B0_MAT2
maxonK 0:9a0a89ffaa43 356 //PWM周波数
maxonK 0:9a0a89ffaa43 357 //unsigned int pwmFrequency = 4;
maxonK 0:9a0a89ffaa43 358 //各種レジスタ設定用ビットマスク
maxonK 0:9a0a89ffaa43 359 //システムAHBクロック制御レジスタマスク
maxonK 0:9a0a89ffaa43 360 unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9;
maxonK 0:9a0a89ffaa43 361 //IO設定レジスタレジスタマスク
maxonK 0:9a0a89ffaa43 362 unsigned int mask_IOCON_PIO0_11 = 0x3;
maxonK 0:9a0a89ffaa43 363 //タイマ制御レジスタマスク
maxonK 0:9a0a89ffaa43 364 //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ
maxonK 0:9a0a89ffaa43 365 unsigned int mask_TMR32B0TCR = 1;
maxonK 0:9a0a89ffaa43 366 //プリスケールレジスタマスク
maxonK 0:9a0a89ffaa43 367 unsigned int val_TMR32B0PR = 0;
maxonK 0:9a0a89ffaa43 368 //マッチ制御レジスタマスク
maxonK 0:9a0a89ffaa43 369 //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する
maxonK 0:9a0a89ffaa43 370 //残りのマッチレジスタはディスエーブルにする
maxonK 0:9a0a89ffaa43 371 //mbedのピン配列ではタイマ0は0番をTCリセットに使うといいかも
maxonK 0:9a0a89ffaa43 372 unsigned int mask_TMR32B0MCR = 1 << 1;
maxonK 0:9a0a89ffaa43 373 //PWM制御レジスタマスク
maxonK 0:9a0a89ffaa43 374 //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで
maxonK 0:9a0a89ffaa43 375 //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする
maxonK 0:9a0a89ffaa43 376 //mbedではMAT2がpwmOutになってるがISPモードに使用しているので、dp4-MAT3を試す
maxonK 0:9a0a89ffaa43 377 unsigned int mask_TMR32B0PWMC = 1 << 3;
maxonK 0:9a0a89ffaa43 378 //マッチレジスタ値
maxonK 0:9a0a89ffaa43 379 //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する
maxonK 0:9a0a89ffaa43 380 // ((48*10^6)/nHz)で任意の周波数になる、はずである
maxonK 0:9a0a89ffaa43 381 //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する
maxonK 0:9a0a89ffaa43 382 // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない
maxonK 0:9a0a89ffaa43 383 unsigned int val_TMR32B0MR0 = /*10;*/((48000000) / (pwmFrequency));
maxonK 0:9a0a89ffaa43 384 unsigned int val_TMR32B0MR3 = /*8;*/((48000000) / (pwmFrequency)) + 1;
maxonK 0:9a0a89ffaa43 385
maxonK 0:9a0a89ffaa43 386 //システムAHBクロック制御レジスタアドレス
maxonK 0:9a0a89ffaa43 387 volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080;
maxonK 0:9a0a89ffaa43 388 //IO設定レジスタアドレス
maxonK 0:9a0a89ffaa43 389 volatile unsigned int *IOCON_PIO0_11Local = (unsigned int *)0x40044074;
maxonK 0:9a0a89ffaa43 390 //プリスケールレジスタアドレス
maxonK 0:9a0a89ffaa43 391 volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C;
maxonK 0:9a0a89ffaa43 392 //タイマ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 393 volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004);
maxonK 0:9a0a89ffaa43 394 //マッチ制御レジスタアドレス
maxonK 0:9a0a89ffaa43 395 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:9a0a89ffaa43 396 //マッチレジスタ0アドレス
maxonK 0:9a0a89ffaa43 397 volatile unsigned int *TMR32B0MR0 = (unsigned int *)(0x40014018);
maxonK 0:9a0a89ffaa43 398 //マッチレジスタ3アドレス
maxonK 0:9a0a89ffaa43 399 volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024);
maxonK 0:9a0a89ffaa43 400 //PWM制御レジスタアドレス
maxonK 0:9a0a89ffaa43 401 volatile unsigned int *TMR32B0PWMC = (unsigned int *)(0x40014074);
maxonK 0:9a0a89ffaa43 402
maxonK 0:9a0a89ffaa43 403 //PWM機能制御レジスタセット
maxonK 0:9a0a89ffaa43 404 //システムAHBクロック制御レジスタセット
maxonK 0:9a0a89ffaa43 405 *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL;
maxonK 0:9a0a89ffaa43 406 //IO設定レジスタセット
maxonK 0:9a0a89ffaa43 407 *IOCON_PIO0_11Local |= mask_IOCON_PIO0_11;
maxonK 0:9a0a89ffaa43 408 //プリスケーラレジスタセット
maxonK 0:9a0a89ffaa43 409 *TMR32B0PRLocal = val_TMR32B0PR;
maxonK 0:9a0a89ffaa43 410 //PWM制御レジスタセット
maxonK 0:9a0a89ffaa43 411 *TMR32B0PWMC |= mask_TMR32B0PWMC;
maxonK 0:9a0a89ffaa43 412 //マッチレジスタセット
maxonK 0:9a0a89ffaa43 413 //デフォルト値設定操作
maxonK 0:9a0a89ffaa43 414 //MR0_周波数
maxonK 0:9a0a89ffaa43 415 *TMR32B0MR0 = val_TMR32B0MR0;
maxonK 0:9a0a89ffaa43 416 //MR3_LOWパルス長
maxonK 0:9a0a89ffaa43 417 *TMR32B0MR3 = val_TMR32B0MR3;
maxonK 0:9a0a89ffaa43 418 //マッチ制御レジスタセット
maxonK 0:9a0a89ffaa43 419 *TMR32B0MCR |= mask_TMR32B0MCR;
maxonK 0:9a0a89ffaa43 420 //タイマ制御レジスタセット
maxonK 0:9a0a89ffaa43 421 *TMR32B0TCR |= mask_TMR32B0TCR;
maxonK 0:9a0a89ffaa43 422 }