最新情報
ナウいマイコン PSoC4200 PWM(TCPWMmode) なんかおかしい・・(備忘録) (解決済)
PSoC4200のPWM (TCPWM mode)で
周期固定
デューティ可変をしようと思います。
この設定で、main.cの中身はこれだけ
#include "project.h"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
PWM_1_Start() ;
for(;;){
}
}
10KHz ÷ 200 = 50 なので 50Hz
つまり1周期 20mS
OFF時間が5mS
On時間が15mS
で予定通り。
今回、150に設定した「Compare」の値を変えればデューティが変わるようなので
ほかの数字(150から50に変更)にしてみます
結果
正しく変わっています。
OFF時間が15mS
On時間が5mS
つまり「Compare」の数字を変えれば、デューティが変わると思っていたのですが、いろいろ問題があるようで・・・・・・・・・・・
for(;;)
{
PWM_1_WriteCompare(50);
PWM_1_WriteCompare(150);
}
このようなソフトでメインのループの中で
「Compare」の値を 50、150 交互に書き換えていきます。
OFF時間、周期が崩れる症状が発生します。
「Compare」の書換のタイミングに条件があるようです。
さんざん、説明書を読込み、怪しい命令を発見しました。
PWM_1_SetCompareSwap(); というネーミングからして
「Compare」の値をSwap、つまり交換してくれる何かがあるのでしょう(たぶん)
この
PWM_1_SetCompareSwap(); という命令は
Swapを許可か?不許可か?の命令のようです。
PWM_1_SetCompareSwap(0); なら不許可
PWM_1_SetCompareSwap(1); なら許可
説明書抜粋
「
Writes the register that controls whether the compare registers are swapped.
When enabled in Timer/Counter mode (without capture) the swap occurs at a compare/capture event.
In PWM mode the swap occurs at the next TC event following a hardware switch event.
Not applicable for Timer/Counter with Capture or in Quadrature Decoder modes.
」
なにやら
「PWMモードでは、switchイベントの次のTCイベントの時にスワップ発生」
書いてるようです(英語苦手なので・・・・・)。
ここの「switch 」というものを発見したので、チェックを入れてみました。
横にRising edge と書かれているので、このswitch信号がLoからHiになった時が「switchイベント」と思います。
この switch 端子に信号を外部から入れてみます。
#include "project.h"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
PWM_1_Start() ;
PWM_1_SetCompareSwap(1); // Swap 許可
PWM_1_WriteCompare(150); // WriteCompare --> 150
for(;;){
PWM_1_WriteCompareBuf(50);
}
}
こんな感じにソフトを書いてみました。
最初は compear=150 で動作し、スイッチを押したら compare =50 にチェンジするようなソフトです。
試したところ、うまく動作しました。
ただ、現実的に、外部にスイッチを設けて押しまくるわけにはいかないので・・・・・・・・説明書などを、読み漁ったところ、怪しい命令を見つけました。
PWM_1_TriggerCommand(uint32 mask,uint32 command);
ネーミングからして、この命令でトリガーかけろ!!って感じです。
説明書抜粋
「
Description:
Triggers the designated command to occur on the designated TCPWM instances.
Use the mask to apply this command simultaneously to more than one instance.
This allows multiple TCPWM instances to be synchronized.
Parameters:
uint32 mask: Combination of mask bits for each instance of the TCPWM that the command should apply to.
A function from one instance can be used to apply the command to any of the instances in the design.
The mask value for a specific instance is available with the TCPWM_MASK define for that instance.
uint32 command: Enumerated command values.
」
PWM_1.C の 1238行 ~ 1274行 にもヒントが書いてあります。
今回は、たぶん
PWM_1_TriggerCommand(PWM_1_MASK, PWM_1_CMD_CAPTURE);
こう書けば、出来そうな予感がするので、やってみます。
#include "project.h"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
PWM_1_Start() ;
PWM_1_SetCompareSwap(1); // Swap 許可
for(;;)
{
PWM_1_WriteCompareBuf(50); // CompareBuf に書き込み
PWM_1_TriggerCommand(PWM_1_MASK, PWM_1_CMD_CAPTURE); // CompareBuf と Compare TCで入替
PWM_1_WriteCompareBuf(150); // CompareBuf に書き込み
PWM_1_TriggerCommand(PWM_1_MASK, PWM_1_CMD_CAPTURE); // CompareBuf と Compare TCで入替
}
}
設定、ソフトはこんな感じ。
結果
周期崩れず、良いです!!
まとめ
PWM_1_SetCompareSwap(1);// Swap 許可
にて Swap 許可して
PWM_1_WriteCompareBuf(50); // CompareBuf に書き込み
にてバッファに書き込み
PWM_1_TriggerCommand(PWM_1_MASK, PWM_1_CMD_CAPTURE); // CompareBuf と Compare TCで入替
トリガーコマンドでトリガーかけておけ
って事のようです。
ナウすぎ・・・・・・・・・・
加納 大裕(かのう だいゆう)
-
- 2024.09.19
- 薪ストーブ、新城軽トラ市「49番ブース」、出店します。
-
- 2024.01.20
- 薪ストーブ出展 新城消防祭
-
- 2023.11.28
- SDGsへの貢献:薪ストーブ
-
- 2023.11.01
- 薪ストーブ今週末のイベント
-
- 2023.11.01
- 薪ストーブ納品 南信州うるぎ高原 風の森