最新情報

ナウいマイコン 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で入替

トリガーコマンドでトリガーかけておけ

 

って事のようです。

ナウすぎ・・・・・・・・・・

 

 

加納 大裕(かのう だいゆう)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最新の投稿記事

加納製作所の商品開発

  • 薪ストーブ
  • メッキアノード
  • 粉体塗料
  • ミニトマト選別機

開発でお悩みの方、

まずは新たな発想を生む
私達の開発環境へお越しください。
知識・経験・ノウハウがそのお悩みを解決します。

開発のご相談