• 締切済み

割り込みの衝突

現在、マイコンにてPWMを多数本出力させようとしています。 PWMコントローラが内蔵されていないので、ソフトウェアで対応させるしかないのですが、プログラムを組んで動作させると、どうも割り込み同士が衝突・干渉し、想定している出力とは違うものとなってしまいます。 「マイコンを変える」ことは、事情柄行えません。 皆さんは、割り込み同士が衝突してしまう場合等、どう対処されていますか? それぞれの割り込み周期が同じか整数倍等だと、衝突は発生しなくなりますか?

みんなの回答

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

割り込み処理を極力短くする。 例えば、割り込みルーチンでは、フラグをセットするだけで即リターンする。 で、メインループでフラグをみて、Outputを反転させるとか、カウンタをリセットするとか、実際の処理を行う。 まあ、これでも、小さな誤差は避けられませんが。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

複数のPWM出力したいだけなら、タイマー割り込み1本でソフト処理したらどうでしょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マイコンとスピードコントローラについて

    今,マイコンを使って,小型のヘリコプタの研究を行っています.マイコンから算出した制御出力(PWM)をスピードコントローラを介してプロペラの制御を使用と思っています.そこで,どのようにマイコンを使用して,ブラシレスモータ制御用のスピードコントローラを使用できるようにするか分かりなくて困っています.スピードコントローラの設定法やマイコンからどのような周期のPWMを送ればいいのかなどを教えてください.以下が使用しているマイコンと,スピードコントローラになります. スピードコントローラ  TURNIGY Plush マイコン         sh-2 sh7047 以上が使用しているものです.ご答えを宜しくお願いします.

  • マイコンのプログラミングについて

    H8マイコン内で周期の異なるPWM波形(PWM1、PWM2)を発生させ、PWM1とPWM2を論理演算した波形(例えばVout = PWM1 & PWM2)を出力端子に出力したいと考えています。この際、同時に通信プログラムも走らせるつもりです。タイマ関数を使えばVoutの生成は一応実現できそうなのですが、待ち時間によって通信プログラムに影響がでるため別の方法を模索しています。 当方、マイコン、プログラミングともに初心者なため、そもそもこのような並列処理ができるのかすら分かっていません。何か良いアドバイスがあればよろしくお願いします。

  • マイコンによるPWM制御

    7個のサーボをマイコンによって独立に駆動しようと試みています。 つまり、別の周期、DUTY比のPWM信号を7つ同時に出力できるマイコンが要求されます。 どのようなマイコンが最適でしょうか。 ほかの条件としては、 1.開発環境が整っている。 2.入手性がよい 3.ローコスト 4.20MIPS以上の処理性能 でしょうか。どなたかお願いします。

  • UC3526A:PWMコントローラの使用法について

    本を読んでいたところ、気になる部品がありましたので質問させて頂きます。 PWMコントローラ「UC3526A」の動作についてです。 データシート → http://www.tij.co.jp/jp/lit/ds/symlink/uc3526a.pdf データシートを読み、自分なりに考えてみましたが、英語ということもありこのシートだけでは よく理解できませんでした。 シートにはPWMコントローラと記述されており、また書いてある内容から 出力するパルスのDuty比を変化させる物であると思うのですが、 もう少し詳細な動作を知りたいと思っています。 ご存知の方、教えて頂けますか? 現在私がこんな動作をするんじゃないかと思っている事、及び疑問点を挙げます。 ・ RESET、SHUTDOWNで出力を止められる。 ・ 外付けのR、Cでオシレータの周波数を決められる。   → オシレータの半分の周波数のパルスがOUT A、Bから出力されるのですか?(Duty比可変) ・ 1,2ピンの+EA、-EAの差を見て、差があるとDuty比が上下するのですか? ・ SYNC信号は入力にも出力にもなるのですか?   入力の場合、出力の場合それぞれのSYNC信号の役目は何ですか? ・ 6,7ピンの役割は何ですか? ・ Vrefの役割は何ですか? ほとんどわかっていませんが、動作を知りたいと思います。 お願いします。

  • 三端子レギュレータについて

    三端子レギュレータ7805(1A)で12Vを5Vに変換するオーソドックスな回路を作りました。入力側に22μF、出力側に100μFの電解コンデンサ、入出力端子両方に0.1μFのセラミックコンデンサを取り付け、レギュレータの2倍くらいの大きさの方熱器を取り付けました。 5Vの出力ではPICマイコンを制御しているのですが、このレギュレータを高温になる場所で使用すると当然レギュレータの放熱効果が下がって出力できる電流量は減りますよね?ちなみに摂氏80℃で使用するとして、レギュレータでPICマイコンを動作させるのに充分な電力を取り出す事は可能でしょうか? (PICマイコンの動作温度は考えない)

  • [回路設計]センサー付きLED照明の誤動作

    焦電センサー駆動のLED照明を作ってみたのですが、 センサーが誤動作してアナログ出力を出してしまうため、LEDが消灯できず困っています。 添付の回路図含めて下記情報参照頂いて、アドバイス頂けると助かります。 [現象] (1)焦電センサが熱源を検出すると、アナログ出力(約2.5V)をマイコンのADCONで閾値検出 ↓ (2)マイコンのI/O出力でトランジスタをPWM駆動でLED点灯 という回路を作ったのですが、 (2)のLED点灯終了時に、(1)の焦電センサが何も検出していない状態でも、 アナログ出力を出してしまい、LEDが消灯できない状態になってしまいます。 [確認ポイント] A)焦電センサが何も検出していないことは、 アナログ出力ピンの電圧をテスターで確認しています。 LED消灯時(PWM駆動停止)に、数十mVから2.5Vに跳ね上がります。 B)LEDのPWM駆動中でも、焦電センサ周囲に熱源が無ければ、 焦電センサ出力はOFFになり、数十mVに下がります。 [これまでの対策] センサ近くの5V-GND間にコンデンサ(10μF)を入れてみましたが、 特に改善しませんでした。 [焦電センサ] http://ur2.link/Cvax Amazonで見つけたものですが、データシートも無く詳細が不明です。

  • ICポートでのLED点灯

    いつもお世話になります。 下記のような質問があります。 お解りになる方、ご指導ください。 【質問】  次のような構成でLEDを点灯させたら、マイコンのポートは壊れますか?  理由も教えて下さい。 【構成】  (1)マイコンは5Vで動作。  (2)ポートの電流特性は、入力も出力も20mA。  (3)このポートにLEDを次のように接続。(制限抵抗無し。直接接続。)    アノード側:5V    カソード側:マイコンのポート  (4)LEDの特性    Vf:2.5V    If:20mA  (5)マイコンのポートからパルス状の点灯するために"0"信号を出力。    各出力は一定周期で下記の様な繰り返し。    1→1→0(点灯)→1→1→0(点灯)・・・・・繰り返し よろしくお願いします。 以上  

  • デュアルショックの仕組みについて

    デュアルショックの仕組みについて詳しく説明して頂けませんか? ・コントローラー側に振動モーターが内蔵してあり、ソフトウェアの動作・場面によってソフトウェアプログラムが振動モーターに信号を伝える。といった認識なのですが・・・ ・又、PCゲームでもデュアルショックが使えるゲームソフトやハードウェアはありますか? よろしくお願い致します。

  • PWM制御のデューティ変更時におけるトラブル

    SH7211マイコンのPWM(モード1)を使用して、定電流制御をしています。 PWMの周期を10KHzとし、その割り込みの周期で電流値を増設のADコンバータで取得、PID演算の後にPWMのデューティを変更して電流を制御するフィードバック機構です。 この時、10KHzで割り込みをして電流を一定に保つようデューティを常に変更しているのですが、過度に電流を流さないようデューティの値を変更する時はデューティが50%以上にならないようにしています。 ですが、PWM出力をオシロで見ていると、例えば電流値を5Aから1Aへ変更しようとした時、変更するタイミングで何故かデューティが100%以上になってしまい、本来電流値が下がるべき所で一瞬だけ5A以上となる現象に悩まされています。 CPUのマニュアルに、「周期レジスタとデューティレジスタのコンペアマッチが同時に発生すると出力は変化しない」とあり、その時デューティが100%以上になってしまう動作例が載っているのですが、プログラム上でデューティは50%以上にならないようにしていますので、この箇所は問題ないかと思います。 今現在わかっている事ですが 1) 割り込みで常にデューティは書き換えているのですが、電流値を変化させた時、つまりデューティレジスタの値を急激に変化させた時に発生しているように見えます。2A→1A程度の変化では発生しません。 2) 5A→1Aと減らした時と、1A→5Aと増やした時両方で発生します。 3) デューティを変更する直前でブレークをかけて、適当なタイミングでブレーク解除した時、この現象が発生する時と発生しない時があります(デューティを変更するタイミングが問題?)。 4) デューティレジスタの値を0とした場合、上記に書きました「周期レジスタとデューティレジスタのコンペアマッチが同時に発生すると出力は変化しない」事に該当するかもしれないと考え、デューティレジスタの値が0の時は強制的に値を10としましたが、この現象が発生しました。 また、プログラムの中身ですが 1) 周期レジスタの値は3999、デューティレジスタの値は0~1999の値で変化。 2) 出力は初期出力がHi、コンペアマッチでLowというHi→Low出力。 3) 割り込み関数の中でADコンバータから値を取得→PID演算→デューティレジスタの値を変更という処理をしています。 4) 割り込みレベルを他の割り込みと比べて一番高くしているため、割り込み関数処理中に他の割り込みは発生しません。 長文申し訳ございませんが、何か同じような現象が起きた方、または何かしらの解決策をご存知の方、アドバイスを宜しくお願いします。

  • 組み込みマイコンでのソフトウェアによるリセット

    組み込み用マイコン向けのファームウェアをC言語で 書いています. ここで, ソフトウェア側からマイコンにリセットをかけ るにはどのような方法があるでしょうか? ※マイコン自体には内部的なハードウェアリセットを行 う機能は無いものとします. 素人考えで思いつく限りだと: ・リセットを行う場所の関数からmainまですべて戻る 経路を作っておく. main (または, mainを呼び出すスタートアップルーチ ンの部分)をループにしておき, その始めで内蔵周辺 機能のレジスタやstatic領域のメモリをすべて初期化 するようなコードを ひたすらハードコーディングしておく. (※static領域のメモリ初期化はどのみち行うからよ いとして, 内蔵周辺機能のレジスタをひたすら初期化 するのが面倒に思われます) ・ウォッチドッグタイマ機能があれば, わざとカウン タをオーバーフローさせてハードウェアリセットをか ける. ・外部リセット端子に何らかの形で出力ポートを 接続しておいて, 自分でハードウェアリセットをかける. 上記のものでもやればそれなりに動作しそうな気は しますが, どういう方法が一般的なのか知らないため どうしてよいか悩んでいます. どのようにリセットを行うのがスマートであるか ご教示いただけませんでしょうか?