analogInでとった値をpwmにセットしてpwmoutputする。 pwmDutyを変化させたいときは割り込みONにして割り込みハンドラ内でdutyセットするとガンガン更新しても更新時に停波しない

Dependencies:   mbed

Committer:
maxonK
Date:
Fri May 08 02:33:57 2015 +0000
Revision:
0:9fa317215b7b
Child:
1:efe01e5b6f28
?????????

Who changed what in which revision?

UserRevisionLine numberNew 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 }