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