R8C関係のリソースもかなり色々揃って来ました。
組み込みマイコンでは、外せないPWM機能の実装です。
一般的に、組み込みマイコンのハードウェアータイマーの機能は、多機能で、複雑です。
R8C/M120の、タイマーCでも、PWMは二通りのモードがあり、その他に、インプットキャプチャなど
色々な機能があります。
今回は、3チャネルの出力が可能な、PWMモードの実装を行いました。
※今後必要になったら、PWMモード2や、インプットキャプチャーなど、他の設定も組み込む予定です。
PWMの場合、デューティ可変範囲を切りのよい2のn乗にしたい場合と、あくまでも周波数(周期)で設定
したい場合がありますので、引数の違う2つの設定を用意してあります。
今回、必要無かったので、割り込みを使っていません。
このタイマーCのPWM出力は、設定値とカウンターの一致を利用しているので、設定値を書き換えるタイミングに注意
する必要がありますが、現状の実装では考慮されていません。
// PWMモード設定 { PML1.P12SEL = pml1_t::P12TYPE::TRCIOB; PML1.P13SEL = pml1_t::P13TYPE::TRCIOC; PML1.P10SEL = pml1_t::P10TYPE::TRCIOD; bool pfl = 0; // 0->1 timer_c_.start_pwm(10000, pfl); uint16_t n = timer_c_.get_pwm_limit(); timer_c_.set_pwm_b(n >> 2); // 25% timer_c_.set_pwm_c(n - (n >> 2)); // 75% }
↑の例では、PWM周波数を10KHzとしています。
B出力には25%、C出力には75%のデューティで出力します。
if(adc_.get_state()) { uint32_t v = adc_.get_value(1); v *= timer_c_.get_pwm_limit(); timer_c_.set_pwm_d(v >> 10); adc_.start(); }
又、C出力にはLEDが接続してあるので、AN1入力にボリュームを繋げて、0~100%まで
デューティを変化させられますのでLEDの明るさが変化します。
-----
I/Oポートの定義を見直し、ポートのマッピングに「固有の型」を導入しています。
その為、設定が判りやすく、誤設定も減ると思います。
PML1.P12SEL = pml1_t::P12TYPE::TRCIOB; PML1.P13SEL = pml1_t::P13TYPE::TRCIOC; PML1.P10SEL = pml1_t::P10TYPE::TRCIOD;
※この型には「enum class」を使っている為、C++11対応コンパイラでコンパイルする必要があります。
現在 gcc-4.7.4 なので、「-std=c++0x」オプションを使っています。
GitHubにソースをプッシュしました。