2017-06-21 20 views
0

3つのPWM + USB(3種類のTIM)を使用して3つの80kHzの方形波を生成し、50khz付近で動作するようになると、メインループは実行されません1秒間点滅している)。 USBのプライオリティは0ですが、PWMは1(変更可能)です。これは、USB経由で目標波の周波数が与えられているためです。NVIC_Priorityとmain()stm32の優先度

PWMコールバックでは、波が加速または減速できるので、次のCCR/ARRがどの値で滑らかに加速するかを精緻にする関数を呼び出しています。

私の理解では、必要な計算能力が増え始め、割込みは多くあり、使用可能なスロットがいっぱいです。

私ができることは、PWMコールバック関数内でtrueに変わる単純なブール変数を使用してメインループ内の上記の関数を呼び出すことです。メインがファンクションを呼び出すとfalseに変わります。

このアプローチでは、完全な70/100kHzの方形波(たとえば、計算時間が必要なため63khzまたは95khz)が得られないことがあります。

メインに優先順位を与える方法はありますか? 主に基本的に5ms/10ms/50ms/1sが経過したかどうかを確認しています。

+0

どのSTM32を使用していますか?なぜ割り込みを使ってPWMをやっているのですか?なぜあなたはタイマーモジュールを持っていないのですか? DMAでいくつかのレジスタ値を変更することができます。この方法でTimer1で正弦波を作りました。私は何かが欠落しているに違いないと思うが、ソフトウェアで100kの方形波を作り出すことは私にとってのようだ。 :) – DiBosco

+0

私は各方形波パルスを数える必要があるので、私は割り込みを使用する必要があります。 また、100khzのターゲットを持っている場合、波形は10-20-30-40-50-60-70-80-90-100Khzの直線較正可能な「加速」を行う必要があるため、割り込みが必要です。これは私がdinamically CCRとARRを変更する必要があることを意味します – Luigi

+0

私はあなたが "计算"各矩形波によって何を意味するか分かりません。あなたは本当にあなたが各タイマー割り込みのソフトウェアのピンを切り替えることを私に伝えていますか?また、頻度を正確に変更する頻度は?私はまだ何かが欠けていると思う。 – DiBosco

答えて

0

メインに優先順位を与える方法はありますか? は、基本的に、 の例で5ms/10ms/50ms/1sが経過しているかどうかを確認しています。

いいえ、メイン定義では、優先度が最も低く、アイドル状態で実行されます。ただし、定期的なタスクに高い優先順位を与えるために、Systick(または他の割り込み)のものを実行することはできます。しかし、あなたが本当に時間外ならば、優先順位を変えることは役に立ちません。これで滑らかな加速を持つためにカウントすべき次のCCR/ARR を重視精巧な関数を呼び出すPWMコールバックで

、波が加速または減速することができるので、私は 。

この代わりにDMAを使用することをお勧めします。
事前に、値のセクションを計算します。次に、新しい値をタイマーに書き込んだり、ソースアドレスをインクリメントしたり、ハードウェアで実行させたりするために、DMA(タイマーにはDMA要求があります)を使用します。タイマーには、不具合を防ぐためにオーバーフロー時にのみ更新するようにレジスタをバッファリングするオプションがあります。 ハーフ転送割り込みでは、循環元バッファの次のセクションを計算します。そして、オン・アンド・オン。

複数のタイマーを同期させて接続することができます。ちょっとパズルをしなければなりません。