Renesas Community
Renesas Community
  • User
    Join or sign in
  • Site
  • Search Community
  • User
  • Renesas Engineering Community
  • FAQ
  • HELP
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-ADZUKI WAVPを使うとPWMの周期が変わる
  • Forums
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 GR-SAKURA

 GR-KURUMI

 GR-COTTON

 GR-CITRUS

 GR-PEACH

 GR-KAEDE

 GR-ADZUKI

 GR-LYCHEE

 GR-ROSE

 GR-MANGO(*)

 SNShield

 Web Compiler

 IDE for GR

 TOPPERS関連

 女子美コラボ

 その他

 ※プロデューサミーティング中

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他・過去ファイル

  • State Verified Answer
  • Replies 39 replies
  • Subscribers 429 subscribers
  • Views 49892 views
  • Users 0 members are here
  • GR-ADZUKI
Options
  • Share
  • More
  • Cancel
Related Tags
  • auzuki
  • azuki
  • BASIC
  • GR-ADZUKI
  • GR-ADZUKI Node.js Johnny-Five
  • GR-ADZUKI S4A モーター
  • GR-ADZUKI USB
  • WDT
  • デジタルコンパス
  • リセット
  • 省電力
Related

WAVPを使うとPWMの周期が変わる

maenoh!
maenoh! over 5 years ago

WAVPを使うとモーター用PWMの周期がかわってしまうようです。

パルス幅は変わりませんが、周期が2ms程度から700us台になってしまいました。

void loop() {
    analogWrite(6,50);
 wavp.play("organ.wav");
 wavp.play("okoto.wav");
 wavp.play("jingle2.wav");
}

  • Reply
  • Cancel
  • Cancel
Parents
  • fujita nozomu
    +1 fujita nozomu over 5 years ago

    WAVPを使うとモーター用PWMの周期がかわってしまうようです。

    パルス幅は変わりませんが、周期が2ms程度から700us台になってしまいました。

    GR-ADZUKI はどうだかわからないのですが、GR-KURUMI の標準のライブラリでのタイマ・アレイ・ユニットの各タイマの割り振りを今確認したところ

    チャネル 内容
    0 ハードウェア PWM のマスタ・チャネル
    1 3番ピン ハードウェア PWM 出力, MsTimer2
    2 5番ピン ハードウェア PWM 出力
    3 10番ピン ハードウェア PWM 出力
    4 9番ピン ハードウェア PWM 出力, Servo ライブラリ使用時のタイマ
    5 マイクロ秒タイマ
    6 ソフトウェア PWM 用タイマ
    7 6番ピン ハードウェア PWM 出力

    こんな感じで使用しており、恐らくは ADZUKI でも大して変わらないのではないかと思います。

    Wavp は TCR00 をマスタ・チャネルとして使用し、チャネル1 と チャネル2 を出力にして残りのタイマのハードウェア PWM の使用は考慮されていない感じです。

    http://gadget.renesas.com/ja/product/kemuri.html に GR-KURUMI のピンマップが掲載されておりハードウェア PWM とソフトウェア PWM に使用できるピンがわかりますが、実際この図は間違っており、ハードウェア PWM に割り当てられたピン以外は全てソフトウェア PWM に使用できるライブラリの作りとなっており、恐らくは ADZUKI でも変わらないと思うので、DC モーター制御程度ならソフトウェア PWM を試してみるというのも手だと思います。ソフトウェア PWM はハードウェア PWM の約490Hz の1/4、約122Hz で動作していたと思いますが DC モーター程度なら支障はないのでは。

    GR-KURUMI のライブラリでは gr_common/RLduino78/cores/pintable.h の中 PinTable[] というテーブルでハードウェア PWM/ソフトウェア PWM の定義を行っており、ハードウェア PWM に設定されているピンをこゝを変更することでソフトウェア PWM に変更することも可能だった筈です。恐らくは ADZUKI でも同様の手は使えると思います。

    • Cancel
    • Up 0 Down
    • Reply
    • Reject Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to fujita nozomu
    fujitaさん、ありがとうございます。モーター制御は(6,11)と(9,10)なのですが、”ソフトウェア PWM に変更することも可能"であれば、解決できるかもしれません。”TCR04 9番ピン ハードウェア PWM 出力、Servo ライブラリ使用時のタイマ”というのがちょっと心配ですが。そもそもWAVPの利用後に初期状態にタイマー設定を戻すライブラリがあればいいのかもしれません。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to fujita nozomu

    そうですね。悩ましいですがトレードオフになりますね。WAVPはチャネルを選べるようにしましたが、attachMicroIntervalTimerHandler() や MsTimer2をすでに使用している場合は5ピンだけの出力になるようにした方がよさそうですね。

    >Maenoさん

    Webコンパイラに以下のテストバージョンを用意しました。ピン10をソフトPWMにして、サーボ専用にタイマーを割り当てました。ちょっと試していただけないでしょうか?

    GR-ADZUKI_Sketch_e.101.zip

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    GR-ADZUKI_Sketch_e.101は、モーターとサーボの制御に関しては、正常に動作しました。更にGR-COTTONのサンプルプログラムから赤外線リモコン受信の部分を移植して組み合わせてみたのですが、リモコン受信時にサーボの波形が少し乱れます。あと、toneとnoToneが正常に動作していないようです。ロボット用途の場合はWAVPは一時的にピン5だけでいいです。もちろん音楽用途ではステレオ再生を希望しますが。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!
    Maenoさん、ご確認ありがとうございます。
    IRに関してですが、COTTONのサンプルでは割り込み処理が長いため、割り込み冒頭でinterrupts()を挿入する必要があります。ただ、これだけだと割り込み優先順位がサーボと一緒のため、動作しませんでした。サーボの優先順位をひとつ上げて動作確認したテンプレートを用意しましたので、確認していただけますでしょうか。

    GR-ADZUKI_Sketch_e.101b.zip

    それからtoneに関してですが、tone用のタイマーはピン3に割り当てられているものを使用しているため、ピン3に圧電スピーカーをつけている場合は音がなりません。私はピン5で確認しましたが音がなりました。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to Okamiya Yuuki
    Maenoさん、たびたびすみません。
    Toneライブラリの確認をしましたが、実装が中途半端で音程の変更とかDurationが正しく機能していませんでした。以下、テンプレートを更新しましたので、ご確認いただければ幸いです。

    GR-ADZUKI_Sketch_e.101c.zip

    Toneサンプル:

    void setup(){
    for(int i = 0; i < 500; i+=10){
    tone(5, 500 + i);
    delay(10);
    }
    for(int i = 0; i < 500; i+=10){
    tone(5, 1000 - i);
    delay(10);
    }
    noTone(5);
    delay(500);
    tone(5, 400, 200);
    delay(500);
    tone(5, 400, 1000);
    }

    void loop(){

    }
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    GR-ADZUKI_Sketch_e.101c、ありがとうございます。以下の結果でした。
    (1)リモコンボタンを押し続けた場合のサーボ波形は乱れがなくなりました。
    (2)toneはピン5だけでなくピン3でも正む常に鳴りました。
    (3)リモコンボタンを押し続けた場合のtoneは途切れ途切れになりました。(特に問題ありませんが)
    (4)ピン13でサーボ制御を試したのですが、servo.detach()のタイミングに依存してHIGH固定やLOW固定になりました。これは、このままの方がいいと思います。無理にLOW固定に強制するとサーボへのパルス幅が変わって誤動作するかもしれないからです。

    ...ということで特に大きな問題はありませんので、次はピン5でのWAVPを期待してます。急ぎませんが。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!

    Maenoさん、ご確認ありがとうございます。Toneを使った場合、ピン3のanalogWriteは多分乱れてしまうと思いますが、ピン3を使用したToneは大丈夫ですね。ちょっと紛らわしくてすみません。

    以下のwav_libライブラリを試してみていただきたいのですが、以下のように第2引数にenumマクロを指定すると5ピンだけの出力になります。

    Wavp wavp(44100, WAVP_OUTPUT_5);

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    Wavp wavp(44100, WAVP_OUTPUT_5)はうまくいきました。
    ただ、モーターのPWMの周期が720us程度に変わってしまうのはそのままなので、デューティ制御が正常にできません。パルス幅はanalogWriteの50で400us、75で600us程度なので正回転時は調整すればなんとかなりますが逆回転時の制御がが難しいです(下記のPWMMAXの値)。

    #define PWMMAX 255
    #define M1F 6
    #define M0F 9
    #define M0B 10
    #define M1B 11
    void drvMotorR(int pwm) {
    if (pwm >0) {
    digitalWrite(M0B,LOW);
    analogWrite(M0F,pwm);
    }
    else if (pwm < 0) {
    digitalWrite(M0B,HIGH);
    analogWrite(M0F,PWMMAX+pwm);
    }
    else {
    digitalWrite(M0B,LOW);
    pinMode(M0F, OUTPUT);
    digitalWrite(M0F,LOW);
    }
    }

    void drvMotorL(int pwm) {
    if (pwm >0) {
    digitalWrite(M1B,LOW);
    analogWrite(M1F,pwm);
    }
    else if (pwm < 0) {
    digitalWrite(M1B,HIGH);
    analogWrite(M1F,PWMMAX+pwm);
    }
    else {
    digitalWrite(M1B,LOW);
    pinMode(M1F, OUTPUT);
    digitalWrite(M1F,LOW);
    }
    }
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!

    Maenoさん、WAVPでplay後にPWMの周期、デューティをもとに戻すようにしてみましたので、ちょっと確認いただけないでしょうか。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    モーターのPWMの周期が720us程度に変わってしまうのは改善されていないようです。音声再生後にノイズが出るようになりました(タイミングにより出なかったりします)。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!

    Maenoさん、お手数をおかけしてすみませんでした。

    WAVP再生中はピン6,9のPWM周期に合わせてデューティーを合わせるようにして、再生後はPWM周期を元に戻すように修正いたしました。

    なお、GR-ADZUKIのソフトウェアPWMピン10, 11とToneがONの場合、WAVP再生速度に影響が出てきます。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    Okamiyaさん、ありがとうございます。WAVPでの音声再生時にモーターのPWM(6,9)の周期が変わってもデューティ比が維持されているのが素晴らしいですね(再生しながら一定の速度でモーターを回すことができる)。ただし、少し問題が残っていて、モーターのanalogWriteを実行する前に音声再生をしてしまうとモーターのPWMが出ませんでした。あと、TONEのピンをWAVPのピンと重ねることができなかったので、TONEは3、WAVPは5にして正常動作しましたが、これだと圧電スピーカーが2個必要になります。そこで、1つの圧電スピーカーを3と5の間に接続することにしました。すると音がなりませんでした。noToneで3がHiZ状態になるようですね。今のところ、noToneの後で、3をOUTPUTにしてLOW固定することで回避しています。noToneで指定ピンがHiZ状態になるのはArduinoの仕様でしょうか?(LOW固定の方が良いのですが)
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!
    Maenoさん、ありがとうございます。ちょっと今日は時間が取れず何もできなかったのですが、明日修正を行います。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to Okamiya Yuuki

    Maenoさん、すみません、きちんと問題を把握できているか分かりませんが、

    analogWriteの前にwavを再生したときに波形が出ない不具合を修正し、toneとwavp用のピンをシェアしていても大丈夫なようにしました。

    noToneはArduino仕様ではポート入出力は何もせず(出力のまま)、Timerを止めているだけでしたので、RL78もそのようにしようと思います。変更したTone.cppも添付します。

    幾度もデバッグにお付き合いいただいてすみません。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki

    ありがとうございます。もう少しでゴールですね。

    以下の問題がありました。

    (1)TONE_PINとWAVPをピン5に重ねた場合、WAVP再生後にTONEが出ません(HIGH固定後HiZになる)

    (2)TONE_PINをピン3、WAVPをピン5にしてその間に圧電スピーカーを接続した場合、

       WAVP再生後にピン5がHiZになり、TONEの音が出ません(ピン3は出てます)。

    →(2)に関してはWAVPピンもOUTPUT固定にして頂いた方がよいです。

     

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!
    Maenoさん、ありがとうございます。(2)についてちょっと教えてください。ピン3とピン5の間とはA7とGNDのことでしょうか?
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Reply
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!
    Maenoさん、ありがとうございます。(2)についてちょっと教えてください。ピン3とピン5の間とはA7とGNDのことでしょうか?
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Children
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    5番ピンだけでWAVPとTONEを鳴らすことができなかったので、圧電スピーカーの端子の一方を5、他方を3につないでいます。WAVPでピン5から出力する時はピン3をLOW固定にします。TONEでピン3を使う時はピン5をLOW固定にしたい訳です。ところがWAVP再生後ピン5がHiZになってしまうとそれ以降TONEが鳴りません。まあ、自分でLOW固定すればいいのですが。ただ、WAVPの出力ピンには普通は簡単なアンプがつながっていると思いますので、ノイズ等を避ける意味でも再生後はLOW固定の方が良いかなと思います。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!

    Maenoさん、本件ご対応遅くなっておりすみません。LYCHEEとかいろいろと少し落ち着いたので開始しました。

    ただ、考えていたよりちょっと難航中です。WAVP再生後、SAUが何かしらの設定で1を出していると思うのですが、なかなか見つけきれてないです。もう少しお時間いただきます。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • エイジ
    0 エイジ over 5 years ago in reply to Okamiya Yuuki
    岡宮さん,RL78のSAUは未使用時にハイが正しい状態ですが。
    SAUがハイだから,ポートの出力が可能になります。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to エイジ
    あ、失礼しましたANDでしたね。
    実際のところ以下をコメントアウトしたりしなかったりするとP15のTO2が出たり出なかったりで、いまいち何が影響しているのか分からないのですよね。
    SO1.BIT.bit1 = 0;
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • エイジ
    0 エイジ over 5 years ago in reply to Okamiya Yuuki
    SO1.BIT.bit1が具体的にRL78/G13の何を指しているか分かりませんが,RL78の兼用ポートでSAU系の出力を使用する場合には,ポートの出力ラッチは1に,タイマの出力等それ以外の出力を使用するには出力ラッチは0に設定する必要があります。
    P15からTO02を出力するには,PIOR0ビットが1,P1.5が0,PM1.5が0,ついでに兼用機能のPCLBUZ1が0である必要があります。
    端子のブロック図ではSAU以外とひとまとめにされていますが,この場合にはTO02とPCLBUZ1がORになっているので,注意が必要です。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • エイジ
    0 エイジ over 5 years ago in reply to エイジ

    もしかして,P1.5が入力(Hi-Z)のときにP1.1をビット操作したのではありませんか?
    そうだとすると,ビット操作によってP1.5の出力ラッチが書き換わっている可能性が考えられます。P1.5をTO02に設定して,出力に設定する直前にP1.5をビット操作でクリアしてみてください。

    【修正】

    そうか,SO1はSAU1の出力のレジスタでしたね,P1.5とは関係ない信号だったので勘違いしていました。

    SO1レジスタは16ビットレジスタなので,リード・モディファイ・ライトでbit1をクリアしていると思いますが,そのときにbit8(CKO10:SCK20に相当)が変に書き換わっているのかもしれません。CKO10が0になれば,P1.5の値によらず,TO02は出せるかもしれません(P1.5を0にするのが正規の方法ですが)。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to エイジ

    エイジさん、本件アドバイスをいただきましてありがとうございました。

    まず、私にひとつ勘違いがありました。問題の発端としては①WAV再生(PWM)→②TONEでビープで②が動作しないというものなのですが、②はPWMでなく、タイマーによるポートパタパタで実現されていました。とはいえ、原因としては兼用機能の出力ラッチによる影響でした。

    問題は2つあり、一つ目はエイジさんにアドバイスいただいたSO1レジスタで、16ビット操作専用にもかかわらずプログラムがビット操作になっており、該当ビットだけを0にするはずが、すべてのチャネル用のビットが0になってしまっており、P1.5の出力にも影響を与えていました。

    二つ目は①WAV再生後にタイマー機能の出力TO0のビット2がクリアされておりませんでした。このため出力ラッチがORで入っているため、P1.5出力が固定され、正常に動作しませんでした。

     

    >Maenoさんへ、

    一応修正したwav_libを添付いたしますので、時間が経ってしまい恐縮ですが、試してみていただけるとありがたいです。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    Okamiyaさん、TONE_PINとWAVPをピン5に重ねられるようになりましたが、まだ少し問題が残っているようです。
    play(jingle); delay(500);
    wavp.play("okoto.wav");
    の場合、okotoが再生されますが、
    play(tonakai); delay(500);
    wavp.play("okoto.wav");
    の場合は、okotoが再生されませんでした。
    前者はjingleの演奏の後で、Low状態になっており、okotoの部分で正常な再生が行われています(HiZ状態は無いようです)。
    後者はtonakaiの演奏の後で、HIgh状態からHiZ状態になっているようで、徐々に電圧が下がり、okotoの再生部分でHIgh固定になっています。
    Tone関数の最後の出力値がHIghかLowかの差異がその後の動作に影響しているのではないでしょうか?
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!
    Maenoさん、ご確認ありがとうございます。
    問題を再現したいと思いますが、tonakaiはどの音楽ですか?以下で提供されているものですか?
    音楽:魔王魂 maoudamashii.jokersounds.com/
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    wav再生ではなくて、私がこのスレッドで2017/4/7 15:57に投稿したときに添付した adzuki_remorobo_5c.zipに含まれるTone関数を使ったplayルーチンです。よろしくお願い致します。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 5 years ago in reply to maenoh!

    maenoさん、ありがとうございます。添付ファイルを見落としていました、すみません。原因はmaenoさんがおっしゃる通りでポートの構成上、出力ラッチをLOWにしておかないと、PWMが正しく出力されませんでした。

    RL78では、ポートと兼用機能を切り替えるプログラムはなかなか難しいと感じますね。。

    念のため修正ファイルしたファイルを添付いたします。

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    Okamiyaさん、エイジさん、ありがとうございました。
    ピン5から正常にToneとWAVP再生を行うことができました。
    素晴らしいです。感謝!
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • maenoh!
    0 maenoh! over 5 years ago in reply to Okamiya Yuuki
    Okamiyaさん、エイジさん、ありがとうございました。
    ピン5から正常にToneとWAVP再生を行うことができました。
    素晴らしいです。感謝!
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2022 Renesas Electronics Corporation. All rights reserved.