Nucleo-F303K8のPWMについて説明します。
F303K8とmbed OSを使ってPWMを使う時には少し注意が必要です。F303K8のピンの説明図を見ると、17個のピンがPWMに使えることがわかります。
ただし、この17個が全て同時に使えるかというとそういうわけではありません。上記図の紫色で示されているPWMの名前ですが、PWMn/c[N]
という形式になっていてnはタイマの番号、cはチャネルとなっています。[N]
はNがついたりつかなかったりなのですが、無視して良いです。このPWMの名前が同じものは、一緒には使えません。例えば、D6とD7はともにPWM1/3Nです。ということはD6とD7はいつも同じ動きをするということです。同様にD11とA6もPWM17/1という同じPWMの名前です。
PWMの名前を表にまとめると以下のようになります。色で同じ名前のPWMを表しています。
これを見ると、同時に使えるPWMは最大13個であることがわかります。
Example
8個のLEDをPWMで制御してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include "mbed.h" #define NUM_OF_LEDS 8 #define LEVEL1 0.5 #define LEVEL2 0.8 PwmOut leds[NUM_OF_LEDS] = { D2, D3, D4, D5, D6, D9, D10, D11 }; void setLEDs(float); void initPwm(); int main() { initPwm(); setLEDs(1); while(1) { for(int i = 0; i < NUM_OF_LEDS; i++) { leds[i] = 0; if(i - 1 >= 0) { leds[i - 1] = LEVEL1; } if(i - 2 >= 0) { leds[i - 2] = LEVEL2; } if(i + 1 < NUM_OF_LEDS) { leds[i + 1] = LEVEL1; } if(i + 1 < NUM_OF_LEDS) { leds[i + 2] = LEVEL2; } wait_ms(50); setLEDs(1); } wait_ms(200); for(int i = NUM_OF_LEDS - 1; i >= 0; i--) { leds[i] = 0; if(i - 1 >= 0) { leds[i - 1] = LEVEL1; } if(i - 2 >= 0) { leds[i - 2] = LEVEL2; } if(i + 1 < NUM_OF_LEDS) { leds[i + 1] = LEVEL1; } if(i + 1 < NUM_OF_LEDS) { leds[i + 2] = LEVEL2; } wait_ms(50); setLEDs(1); } wait_ms(200); } } void setLEDs(float x) { for(int i = 0; i < NUM_OF_LEDS; i++) { leds[i] = x; } } void initPwm() { for(int i = 0; i < NUM_OF_LEDS; i++) { leds[i].period_ms(1); } } |
— by 綿貫 理明、石井 健太郎、飯田 周作 専修大学ネットワーク情報学部