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

Dependencies:   mbed

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?

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 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