Keiju Nakano
/
mbed1114_PWM_DirectRegister_test
analogInでとった値をpwmにセットしてpwmoutputする。 pwmDutyを変化させたいときは割り込みONにして割り込みハンドラ内でdutyセットするとガンガン更新しても更新時に停波しない
main.cpp@1:efe01e5b6f28, 2016-03-22 (annotated)
- Committer:
- maxonK
- Date:
- Tue Mar 22 10:01:15 2016 +0000
- Revision:
- 1:efe01e5b6f28
- Parent:
- 0:9fa317215b7b
PWM???????????????????????PWM????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maxonK | 0:9fa317215b7b | 1 | #include "mbed.h" |
maxonK | 0:9fa317215b7b | 2 | |
maxonK | 0:9fa317215b7b | 3 | // Reuse initialization code from the mbed library |
maxonK | 0:9fa317215b7b | 4 | DigitalOut PIO0_8(dp1); // P1_18 |
maxonK | 0:9fa317215b7b | 5 | AnalogIn Speed(dp13); |
maxonK | 0:9fa317215b7b | 6 | Serial uP(dp16, dp15); |
maxonK | 0:9fa317215b7b | 7 | |
maxonK | 0:9fa317215b7b | 8 | //dp24pwm初期化関数プロトタイプ宣言 |
maxonK | 1:efe01e5b6f28 | 9 | void CT32B0_MAT3_PWM_registerSet(unsigned int ); |
maxonK | 0:9fa317215b7b | 10 | |
maxonK | 0:9fa317215b7b | 11 | //グローバル変数宣言 |
maxonK | 1:efe01e5b6f28 | 12 | //dp24pwmDuty |
maxonK | 1:efe01e5b6f28 | 13 | unsigned int dp4pwmDuty = 0; |
maxonK | 1:efe01e5b6f28 | 14 | //dp24pwmFrequency |
maxonK | 1:efe01e5b6f28 | 15 | unsigned int dp4pwmFrequency = 0; |
maxonK | 0:9fa317215b7b | 16 | |
maxonK | 0:9fa317215b7b | 17 | //割り込みハンドラ(PICでいうISRのこと) |
maxonK | 0:9fa317215b7b | 18 | void TIMER32_0_IRQHandler(void) |
maxonK | 0:9fa317215b7b | 19 | { |
maxonK | 0:9fa317215b7b | 20 | //タイマー操作 |
maxonK | 0:9fa317215b7b | 21 | //タイマリセット→保持 |
maxonK | 0:9fa317215b7b | 22 | //タイマ制御レジスタアドレス |
maxonK | 0:9fa317215b7b | 23 | volatile unsigned int *TMR32B0TCRLocal = (unsigned int *)0x40014004; |
maxonK | 0:9fa317215b7b | 24 | //1ビット目を1にしてタイマリセット |
maxonK | 0:9fa317215b7b | 25 | unsigned int mask_TMR32B0TCR = 1 << 1; |
maxonK | 0:9fa317215b7b | 26 | //タイマ制御レジスタセット |
maxonK | 0:9fa317215b7b | 27 | *TMR32B0TCRLocal |= mask_TMR32B0TCR; |
maxonK | 0:9fa317215b7b | 28 | /***********************************************************************************/ |
maxonK | 0:9fa317215b7b | 29 | //マッチレジスタセット |
maxonK | 0:9fa317215b7b | 30 | //新しくセットする値はグローバルで宣言しとく(割り込みハンドラは、引数、戻り値ともに意味を成さない) |
maxonK | 0:9fa317215b7b | 31 | //0~1023もらって0%~100%のpwm出力する |
maxonK | 1:efe01e5b6f28 | 32 | //CT32B0_MAT3に対応したマッチレジスタアドレス |
maxonK | 1:efe01e5b6f28 | 33 | volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024); |
maxonK | 0:9fa317215b7b | 34 | //ゼロの時はレジスタへセットする値に+1してカウンタよりマッチレジスタが大きくなるようにする |
maxonK | 1:efe01e5b6f28 | 35 | if(dp4pwmDuty == 0) { |
maxonK | 1:efe01e5b6f28 | 36 | *TMR32B0MR3 = (((48000000 / dp4pwmFrequency) / 1024)*(1024 - dp4pwmDuty + 1)); |
maxonK | 1:efe01e5b6f28 | 37 | } else { |
maxonK | 0:9fa317215b7b | 38 | //デューティセット |
maxonK | 1:efe01e5b6f28 | 39 | *TMR32B0MR3 = (((48000000 / dp4pwmFrequency) / 1024)*(1024 - dp4pwmDuty)); |
maxonK | 1:efe01e5b6f28 | 40 | } |
maxonK | 0:9fa317215b7b | 41 | /*******************************************************************************************/ |
maxonK | 1:efe01e5b6f28 | 42 | |
maxonK | 0:9fa317215b7b | 43 | //タイマリセット解除 |
maxonK | 0:9fa317215b7b | 44 | //タイマ制御レジスタセット |
maxonK | 0:9fa317215b7b | 45 | *TMR32B0TCRLocal &= ~mask_TMR32B0TCR; |
maxonK | 0:9fa317215b7b | 46 | /*******************************************************************************************/ |
maxonK | 1:efe01e5b6f28 | 47 | |
maxonK | 0:9fa317215b7b | 48 | //マッチチャネル0 用の割り込みフラグリセット |
maxonK | 0:9fa317215b7b | 49 | //割り込みレジスタアドレス |
maxonK | 0:9fa317215b7b | 50 | volatile unsigned int *TMR32B0IRLocal = (unsigned int *)0x40014000; |
maxonK | 0:9fa317215b7b | 51 | //0ビット目を1にしてMR0の割り込みフラグをリセット |
maxonK | 0:9fa317215b7b | 52 | unsigned int mask_TMR32B0IR = 1; |
maxonK | 0:9fa317215b7b | 53 | //割り込みレジスタセット |
maxonK | 0:9fa317215b7b | 54 | *TMR32B0IRLocal |= mask_TMR32B0IR; |
maxonK | 0:9fa317215b7b | 55 | |
maxonK | 0:9fa317215b7b | 56 | } |
maxonK | 0:9fa317215b7b | 57 | |
maxonK | 0:9fa317215b7b | 58 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
maxonK | 0:9fa317215b7b | 59 | /***************************************************************************************************************/ |
maxonK | 0:9fa317215b7b | 60 | |
maxonK | 0:9fa317215b7b | 61 | int main() |
maxonK | 0:9fa317215b7b | 62 | { |
maxonK | 0:9fa317215b7b | 63 | //割り込み設定 |
maxonK | 0:9fa317215b7b | 64 | //Interrupt Service Routineが書いてある、割り込み時ジャンプ先アドレス設定? |
maxonK | 0:9fa317215b7b | 65 | NVIC_SetVector(TIMER_32_0_IRQn, (uint32_t)&TIMER32_0_IRQHandler); |
maxonK | 0:9fa317215b7b | 66 | //割り込みハンドライネーブル |
maxonK | 0:9fa317215b7b | 67 | NVIC_EnableIRQ(TIMER_32_0_IRQn); |
maxonK | 0:9fa317215b7b | 68 | //割り込み優先順位設定 |
maxonK | 0:9fa317215b7b | 69 | NVIC_SetPriority(TIMER_32_0_IRQn, 1); |
maxonK | 0:9fa317215b7b | 70 | //LEDチカチカ |
maxonK | 0:9fa317215b7b | 71 | //後ろから8bit目まで1を送る(たぶんそこがp0_8のビット位置) |
maxonK | 0:9fa317215b7b | 72 | unsigned int mask_pin8 = 1 << 8; |
maxonK | 0:9fa317215b7b | 73 | //レジスタ位置。メモリ上にあるのでポインタでアクセスできるぽい |
maxonK | 0:9fa317215b7b | 74 | volatile unsigned int *GPIO0DATA = (unsigned int *)(0x50000000 + 0x3FFC ); |
maxonK | 0:9fa317215b7b | 75 | uP.baud(9600); |
maxonK | 0:9fa317215b7b | 76 | |
maxonK | 0:9fa317215b7b | 77 | //PWM周波数 |
maxonK | 1:efe01e5b6f28 | 78 | dp4pwmFrequency = 60; |
maxonK | 1:efe01e5b6f28 | 79 | //dp4pwm初期化 |
maxonK | 1:efe01e5b6f28 | 80 | CT32B0_MAT3_PWM_registerSet(dp4pwmFrequency); |
maxonK | 0:9fa317215b7b | 81 | |
maxonK | 0:9fa317215b7b | 82 | int val = 0; |
maxonK | 0:9fa317215b7b | 83 | int sval = 0; |
maxonK | 1:efe01e5b6f28 | 84 | /*********************************************************************************/ |
maxonK | 0:9fa317215b7b | 85 | while (true) { |
maxonK | 0:9fa317215b7b | 86 | //LED1点灯 |
maxonK | 0:9fa317215b7b | 87 | *GPIO0DATA |= mask_pin8; |
maxonK | 0:9fa317215b7b | 88 | val = (Speed.read_u16()>>6); |
maxonK | 1:efe01e5b6f28 | 89 | //グローバルdp4pwmDutyセット |
maxonK | 1:efe01e5b6f28 | 90 | dp4pwmDuty = val; |
maxonK | 0:9fa317215b7b | 91 | if(val != sval) { |
maxonK | 0:9fa317215b7b | 92 | sval = val; |
maxonK | 0:9fa317215b7b | 93 | //pwm周波数設定用マッチレジスタの動作をタイマークリアから割り込み発生へ変更 |
maxonK | 0:9fa317215b7b | 94 | //マッチ制御レジスタアドレス |
maxonK | 0:9fa317215b7b | 95 | volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014); |
maxonK | 0:9fa317215b7b | 96 | //マッチ制御レジスタマスク |
maxonK | 1:efe01e5b6f28 | 97 | //マッチレジスタMR0とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止される |
maxonK | 1:efe01e5b6f28 | 98 | unsigned int mask_TMR32B0MCR = 1; |
maxonK | 0:9fa317215b7b | 99 | //マッチ制御レジスタセット |
maxonK | 0:9fa317215b7b | 100 | *TMR32B0MCR = mask_TMR32B0MCR; |
maxonK | 0:9fa317215b7b | 101 | |
maxonK | 0:9fa317215b7b | 102 | |
maxonK | 0:9fa317215b7b | 103 | } |
maxonK | 0:9fa317215b7b | 104 | |
maxonK | 0:9fa317215b7b | 105 | |
maxonK | 0:9fa317215b7b | 106 | } |
maxonK | 1:efe01e5b6f28 | 107 | /**************************************************************************************/ |
maxonK | 0:9fa317215b7b | 108 | } |
maxonK | 0:9fa317215b7b | 109 | |
maxonK | 0:9fa317215b7b | 110 | /***********************************************************************************************************/ |
maxonK | 0:9fa317215b7b | 111 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////// |
maxonK | 0:9fa317215b7b | 112 | |
maxonK | 1:efe01e5b6f28 | 113 | void CT32B0_MAT3_PWM_registerSet(unsigned int pwmFrequency) |
maxonK | 0:9fa317215b7b | 114 | { |
maxonK | 0:9fa317215b7b | 115 | //PWM機能設定用 |
maxonK | 0:9fa317215b7b | 116 | //pwmピンのピン機能選択をmbedで行う |
maxonK | 1:efe01e5b6f28 | 117 | //PwmOut MAT2(dp24);//CT32B0_MAT2 |
maxonK | 0:9fa317215b7b | 118 | //PWM周波数 |
maxonK | 0:9fa317215b7b | 119 | //unsigned int pwmFrequency = 4; |
maxonK | 0:9fa317215b7b | 120 | //各種レジスタ設定用ビットマスク |
maxonK | 0:9fa317215b7b | 121 | //システムAHBクロック制御レジスタマスク |
maxonK | 0:9fa317215b7b | 122 | unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9; |
maxonK | 0:9fa317215b7b | 123 | //IO設定レジスタレジスタマスク |
maxonK | 1:efe01e5b6f28 | 124 | unsigned int mask_IOCON_PIO0_11 = 0x3; |
maxonK | 0:9fa317215b7b | 125 | //タイマ制御レジスタマスク |
maxonK | 0:9fa317215b7b | 126 | //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ |
maxonK | 0:9fa317215b7b | 127 | unsigned int mask_TMR32B0TCR = 1; |
maxonK | 0:9fa317215b7b | 128 | //プリスケールレジスタマスク |
maxonK | 0:9fa317215b7b | 129 | unsigned int val_TMR32B0PR = 0; |
maxonK | 0:9fa317215b7b | 130 | //マッチ制御レジスタマスク |
maxonK | 0:9fa317215b7b | 131 | //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する |
maxonK | 0:9fa317215b7b | 132 | //残りのマッチレジスタはディスエーブルにする |
maxonK | 1:efe01e5b6f28 | 133 | //mbedのピン配列ではタイマ0は0番をTCリセットに使うといいかも |
maxonK | 1:efe01e5b6f28 | 134 | unsigned int mask_TMR32B0MCR = 1 << 1; |
maxonK | 0:9fa317215b7b | 135 | //PWM制御レジスタマスク |
maxonK | 0:9fa317215b7b | 136 | //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで |
maxonK | 0:9fa317215b7b | 137 | //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする |
maxonK | 1:efe01e5b6f28 | 138 | //mbedではMAT2がpwmOutになってるがISPモードに使用しているので、dp4-MAT3を試す |
maxonK | 1:efe01e5b6f28 | 139 | unsigned int mask_TMR32B0PWMC = 1 << 3; |
maxonK | 0:9fa317215b7b | 140 | //マッチレジスタ値 |
maxonK | 0:9fa317215b7b | 141 | //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する |
maxonK | 0:9fa317215b7b | 142 | // ((48*10^6)/nHz)で任意の周波数になる、はずである |
maxonK | 0:9fa317215b7b | 143 | //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する |
maxonK | 0:9fa317215b7b | 144 | // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない |
maxonK | 1:efe01e5b6f28 | 145 | unsigned int val_TMR32B0MR0 = /*10;*/((48000000) / (pwmFrequency)); |
maxonK | 1:efe01e5b6f28 | 146 | unsigned int val_TMR32B0MR3 = /*8;*/((48000000) / (pwmFrequency)) + 1; |
maxonK | 0:9fa317215b7b | 147 | |
maxonK | 0:9fa317215b7b | 148 | //システムAHBクロック制御レジスタアドレス |
maxonK | 0:9fa317215b7b | 149 | volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080; |
maxonK | 0:9fa317215b7b | 150 | //IO設定レジスタアドレス |
maxonK | 1:efe01e5b6f28 | 151 | volatile unsigned int *IOCON_PIO0_11Local = (unsigned int *)0x40044074; |
maxonK | 0:9fa317215b7b | 152 | //プリスケールレジスタアドレス |
maxonK | 0:9fa317215b7b | 153 | volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C; |
maxonK | 0:9fa317215b7b | 154 | //タイマ制御レジスタアドレス |
maxonK | 0:9fa317215b7b | 155 | volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004); |
maxonK | 0:9fa317215b7b | 156 | //マッチ制御レジスタアドレス |
maxonK | 0:9fa317215b7b | 157 | volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014); |
maxonK | 1:efe01e5b6f28 | 158 | //マッチレジスタ0アドレス |
maxonK | 1:efe01e5b6f28 | 159 | volatile unsigned int *TMR32B0MR0 = (unsigned int *)(0x40014018); |
maxonK | 0:9fa317215b7b | 160 | //マッチレジスタ3アドレス |
maxonK | 0:9fa317215b7b | 161 | volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024); |
maxonK | 0:9fa317215b7b | 162 | //PWM制御レジスタアドレス |
maxonK | 0:9fa317215b7b | 163 | volatile unsigned int *TMR32B0PWMC = (unsigned int *)(0x40014074); |
maxonK | 0:9fa317215b7b | 164 | |
maxonK | 0:9fa317215b7b | 165 | //PWM機能制御レジスタセット |
maxonK | 0:9fa317215b7b | 166 | //システムAHBクロック制御レジスタセット |
maxonK | 0:9fa317215b7b | 167 | *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL; |
maxonK | 0:9fa317215b7b | 168 | //IO設定レジスタセット |
maxonK | 1:efe01e5b6f28 | 169 | *IOCON_PIO0_11Local |= mask_IOCON_PIO0_11; |
maxonK | 0:9fa317215b7b | 170 | //プリスケーラレジスタセット |
maxonK | 0:9fa317215b7b | 171 | *TMR32B0PRLocal = val_TMR32B0PR; |
maxonK | 0:9fa317215b7b | 172 | //PWM制御レジスタセット |
maxonK | 0:9fa317215b7b | 173 | *TMR32B0PWMC |= mask_TMR32B0PWMC; |
maxonK | 0:9fa317215b7b | 174 | //マッチレジスタセット |
maxonK | 0:9fa317215b7b | 175 | //デフォルト値設定操作 |
maxonK | 1:efe01e5b6f28 | 176 | //MR0_周波数 |
maxonK | 1:efe01e5b6f28 | 177 | *TMR32B0MR0 = val_TMR32B0MR0; |
maxonK | 1:efe01e5b6f28 | 178 | //MR3_LOWパルス長 |
maxonK | 0:9fa317215b7b | 179 | *TMR32B0MR3 = val_TMR32B0MR3; |
maxonK | 0:9fa317215b7b | 180 | //マッチ制御レジスタセット |
maxonK | 0:9fa317215b7b | 181 | *TMR32B0MCR |= mask_TMR32B0MCR; |
maxonK | 0:9fa317215b7b | 182 | //タイマ制御レジスタセット |
maxonK | 0:9fa317215b7b | 183 | *TMR32B0TCR |= mask_TMR32B0TCR; |
maxonK | 0:9fa317215b7b | 184 | } |
maxonK | 0:9fa317215b7b | 185 |