Keiju Nakano
/
mbed1114_PWM_DirectRegister_test
analogInでとった値をpwmにセットしてpwmoutputする。 pwmDutyを変化させたいときは割り込みONにして割り込みハンドラ内でdutyセットするとガンガン更新しても更新時に停波しない
Diff: main.cpp
- Revision:
- 1:efe01e5b6f28
- Parent:
- 0:9fa317215b7b
--- a/main.cpp Fri May 08 02:33:57 2015 +0000 +++ b/main.cpp Tue Mar 22 10:01:15 2016 +0000 @@ -6,15 +6,13 @@ Serial uP(dp16, dp15); //dp24pwm初期化関数プロトタイプ宣言 -void CT32B0_MAT2_PWM_registerSet(unsigned int ); -//dp24pwmdutyセット関数プロトタイプ宣言 -void CT32B0_MAT2_PWM_dutySet(unsigned int , unsigned int); +void CT32B0_MAT3_PWM_registerSet(unsigned int ); //グローバル変数宣言 - //dp24pwmDuty - unsigned int dp24pwmDuty = 0; - //dp24pwmFrequency - unsigned int dp24pwmFrequency = 0; +//dp24pwmDuty +unsigned int dp4pwmDuty = 0; +//dp24pwmFrequency +unsigned int dp4pwmFrequency = 0; //割り込みハンドラ(PICでいうISRのこと) void TIMER32_0_IRQHandler(void) @@ -31,22 +29,22 @@ //マッチレジスタセット //新しくセットする値はグローバルで宣言しとく(割り込みハンドラは、引数、戻り値ともに意味を成さない) //0~1023もらって0%~100%のpwm出力する - //CT32B0_MAT2に対応したマッチレジスタアドレス - volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020); + //CT32B0_MAT3に対応したマッチレジスタアドレス + volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024); //ゼロの時はレジスタへセットする値に+1してカウンタよりマッチレジスタが大きくなるようにする - if(dp24pwmDuty == 0) { - *TMR32B0MR2 = (((48000000 / dp24pwmFrequency) / 1024)*(1024 - dp24pwmDuty + 1)); - }else{ + if(dp4pwmDuty == 0) { + *TMR32B0MR3 = (((48000000 / dp4pwmFrequency) / 1024)*(1024 - dp4pwmDuty + 1)); + } else { //デューティセット - *TMR32B0MR2 = (((48000000 / dp24pwmFrequency) / 1024)*(1024 - dp24pwmDuty)); - } + *TMR32B0MR3 = (((48000000 / dp4pwmFrequency) / 1024)*(1024 - dp4pwmDuty)); + } /*******************************************************************************************/ - + //タイマリセット解除 //タイマ制御レジスタセット *TMR32B0TCRLocal &= ~mask_TMR32B0TCR; /*******************************************************************************************/ - + //マッチチャネル0 用の割り込みフラグリセット //割り込みレジスタアドレス volatile unsigned int *TMR32B0IRLocal = (unsigned int *)0x40014000; @@ -77,56 +75,53 @@ uP.baud(9600); //PWM周波数 - dp24pwmFrequency = 60; - //dp24pwm初期化 - CT32B0_MAT2_PWM_registerSet(dp24pwmFrequency); + dp4pwmFrequency = 60; + //dp4pwm初期化 + CT32B0_MAT3_PWM_registerSet(dp4pwmFrequency); int val = 0; int sval = 0; -/*********************************************************************************/ + /*********************************************************************************/ while (true) { //LED1点灯 *GPIO0DATA |= mask_pin8; val = (Speed.read_u16()>>6); - //グローバルdp24pwmDutyセット - dp24pwmDuty = val; + //グローバルdp4pwmDutyセット + dp4pwmDuty = val; if(val != sval) { sval = val; //pwm周波数設定用マッチレジスタの動作をタイマークリアから割り込み発生へ変更 //マッチ制御レジスタアドレス volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014); //マッチ制御レジスタマスク - //マッチレジスタMR3とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止 - unsigned int mask_TMR32B0MCR = 1 << 9; + //マッチレジスタMR0とのマッチで割り込みが発生するように機能切り替え//マッチでのクリアは停止される + unsigned int mask_TMR32B0MCR = 1; //マッチ制御レジスタセット *TMR32B0MCR = mask_TMR32B0MCR; } - uP.printf("val = %04d\n",val); - //dp24pwm出力をセット - //CT32B0_MAT2_PWM_dutySet(dp24pwmFrequency,val); } -/**************************************************************************************/ + /**************************************************************************************/ } /***********************************************************************************************************/ ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -void CT32B0_MAT2_PWM_registerSet(unsigned int pwmFrequency) +void CT32B0_MAT3_PWM_registerSet(unsigned int pwmFrequency) { //PWM機能設定用 //pwmピンのピン機能選択をmbedで行う - PwmOut MAT2(dp24);//CT32B0_MAT2 + //PwmOut MAT2(dp24);//CT32B0_MAT2 //PWM周波数 //unsigned int pwmFrequency = 4; //各種レジスタ設定用ビットマスク //システムAHBクロック制御レジスタマスク unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9; //IO設定レジスタレジスタマスク - //unsigned int mask_IOCON_PIO0_1 = 1 << 1; + unsigned int mask_IOCON_PIO0_11 = 0x3; //タイマ制御レジスタマスク //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ unsigned int mask_TMR32B0TCR = 1; @@ -135,33 +130,33 @@ //マッチ制御レジスタマスク //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する //残りのマッチレジスタはディスエーブルにする - //mbedのピン配列ではタイマ0は3番をTCリセットに使うといいかも - unsigned int mask_TMR32B0MCR = 1 << 10; + //mbedのピン配列ではタイマ0は0番をTCリセットに使うといいかも + unsigned int mask_TMR32B0MCR = 1 << 1; //PWM制御レジスタマスク //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする - //mbedではMAT2がpwmOutになってる - unsigned int mask_TMR32B0PWMC = 1 << 2; + //mbedではMAT2がpwmOutになってるがISPモードに使用しているので、dp4-MAT3を試す + unsigned int mask_TMR32B0PWMC = 1 << 3; //マッチレジスタ値 //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する // ((48*10^6)/nHz)で任意の周波数になる、はずである //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない - unsigned int val_TMR32B0MR3 = /*10;*/((48000000) / (pwmFrequency)); - unsigned int val_TMR32B0MR2 = /*8;*/((48000000) / (pwmFrequency)) + 1; + unsigned int val_TMR32B0MR0 = /*10;*/((48000000) / (pwmFrequency)); + unsigned int val_TMR32B0MR3 = /*8;*/((48000000) / (pwmFrequency)) + 1; //システムAHBクロック制御レジスタアドレス volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080; //IO設定レジスタアドレス - //volatile unsigned int *IOCON_PIO0_1Local = (unsigned int *)0x40044010; + volatile unsigned int *IOCON_PIO0_11Local = (unsigned int *)0x40044074; //プリスケールレジスタアドレス volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C; //タイマ制御レジスタアドレス volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004); //マッチ制御レジスタアドレス volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014); - //マッチレジスタ2アドレス - volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020); + //マッチレジスタ0アドレス + volatile unsigned int *TMR32B0MR0 = (unsigned int *)(0x40014018); //マッチレジスタ3アドレス volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024); //PWM制御レジスタアドレス @@ -171,35 +166,20 @@ //システムAHBクロック制御レジスタセット *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL; //IO設定レジスタセット - //*IOCON_PIO0_1Local |= mask_IOCON_PIO0_1; + *IOCON_PIO0_11Local |= mask_IOCON_PIO0_11; //プリスケーラレジスタセット *TMR32B0PRLocal = val_TMR32B0PR; //PWM制御レジスタセット *TMR32B0PWMC |= mask_TMR32B0PWMC; //マッチレジスタセット //デフォルト値設定操作 - //MR3_周波数 + //MR0_周波数 + *TMR32B0MR0 = val_TMR32B0MR0; + //MR3_LOWパルス長 *TMR32B0MR3 = val_TMR32B0MR3; - //MR2_LOWパルス長 - *TMR32B0MR2 = val_TMR32B0MR2; //マッチ制御レジスタセット *TMR32B0MCR |= mask_TMR32B0MCR; //タイマ制御レジスタセット *TMR32B0TCR |= mask_TMR32B0TCR; } -void CT32B0_MAT2_PWM_dutySet(unsigned int pwmFrequency , unsigned int duty) -{ - //0~1023もらって0%~100%のpwm出力する - //CT32B0_MAT2に対応したマッチレジスタアドレス - volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020); - //ゼロの時はレジスタへセットする値に+1してカウンタよりマッチレジスタが大きくなるようにする - if(duty == 0) { - *TMR32B0MR2 = (((48000000 / pwmFrequency) / 1024)*(1024 - duty + 1)); - return; - } - //デューティセット - *TMR32B0MR2 = (((48000000 / pwmFrequency) / 1024)*(1024 - duty)); - - -} \ No newline at end of file