- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
PWMコンポーネントのPeriodとCMP Valueの書き換えについて質問があります。
例えば、起動直後に
Periodに999、CMP Valueに899と設定するとDuty比で1対9のパルスになります。
二回目に、同じ値の書き込みを行うと、Duty比で5対5のパルスになり設定値通りのパルスになりません。
希望のDuty比に設定するには、どうすれば良いでしょうか?
解決済! 解決策の投稿を見る。
- ラベル:
-
PSoC 5LP
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
こんばんは、
お書きになっている現象から、PWM 設定は period : compare = 10 : 5 になっているのではないかと思います。
実験の為に CY8CKIT-059 で以下のようなサンプルを作ってみました。
胆は config_pwm() という関数で、
PWM を止めて、設定、PWM のカウントを0にする、PWMを再スタート (Enable)
という処理をしているところではないでしょうか。
==============
void config_pwm(uint16_t period, uint16_t compare)
{
PWM_Stop() ;
PWM_WritePeriod(period) ;
PWM_WriteCompare(compare) ;
PWM_WriteCounter(0) ;
PWM_Enable() ;
}
=============
UART からの入力処理は自作の tty_utils を使用して手を抜いています。
Re: tty_utils a utility sample for CLI type program
schematic
pins
main.c
=================
#include "project.h"
#include "stdio.h"
#include "tty_utils.h"
#include "string.h"
#define CMD_LEN 16
uint16_t period = 999 ;
uint16_t compare = 899 ;
void usage(void)
{
print("=== usage ===\n\r") ;
print("pwm <period> <compare>\n\r") ;
print("period <peroid>\n\r") ;
print("compare <compare>\n\r") ;
print("\n\r") ;
}
void report(void)
{
print("=== report ===\n\r") ;
print("PWM : ") ;
snprintf(str, STR_BUF_LEN, "period: %d ", period) ;
print(str) ;
snprintf(str, STR_BUF_LEN, "compare: %d\n\r", compare) ;
print(str) ;
}
void config_pwm(uint16_t period, uint16_t compare)
{
PWM_Stop() ;
PWM_WritePeriod(period) ;
PWM_WriteCompare(compare) ;
PWM_WriteCounter(0) ;
PWM_Enable() ;
}
void do_command(void)
{
char cmd[16] ;
sscanf(str, "%s", cmd) ;
if (strcmp(cmd, "pwm") == 0) {
sscanf(str, "%*s %hd %hd", &period, &compare) ;
} else if (strcmp(cmd, "period") == 0) {
sscanf(str, "%*s %hd", &period) ;
} else if (strcmp(cmd, "compare") == 0) {
sscanf(str, "%*s %hd", &compare) ;
} else if (strcmp(cmd, "report") == 0) {
report() ;
} else {
usage() ;
}
config_pwm(period, compare) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
tty_init() ;
splash("PWM Duty Test on 5LP") ;
PWM_Init() ;
config_pwm(period, compare) ;
}
int main(void)
{
init_hardware() ;
prompt() ;
for(;;) {
if (get_line()) {
do_command() ;
prompt() ;
}
}
}
=================
プログラムを実行したときの Tera Term の様子は
起動直後の波形 period: 999 compare: 899
compare 499にした場合
compare 99 にした場合
オシロの写真、踊っていてすみません。
というように、
pwm <periodvalue> <compare_value>
period <period_value>
compare <compare_value>
と入力して波形を変えられますので
遊んでみてください。
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
こんばんは、
お書きになっている現象から、PWM 設定は period : compare = 10 : 5 になっているのではないかと思います。
実験の為に CY8CKIT-059 で以下のようなサンプルを作ってみました。
胆は config_pwm() という関数で、
PWM を止めて、設定、PWM のカウントを0にする、PWMを再スタート (Enable)
という処理をしているところではないでしょうか。
==============
void config_pwm(uint16_t period, uint16_t compare)
{
PWM_Stop() ;
PWM_WritePeriod(period) ;
PWM_WriteCompare(compare) ;
PWM_WriteCounter(0) ;
PWM_Enable() ;
}
=============
UART からの入力処理は自作の tty_utils を使用して手を抜いています。
Re: tty_utils a utility sample for CLI type program
schematic
pins
main.c
=================
#include "project.h"
#include "stdio.h"
#include "tty_utils.h"
#include "string.h"
#define CMD_LEN 16
uint16_t period = 999 ;
uint16_t compare = 899 ;
void usage(void)
{
print("=== usage ===\n\r") ;
print("pwm <period> <compare>\n\r") ;
print("period <peroid>\n\r") ;
print("compare <compare>\n\r") ;
print("\n\r") ;
}
void report(void)
{
print("=== report ===\n\r") ;
print("PWM : ") ;
snprintf(str, STR_BUF_LEN, "period: %d ", period) ;
print(str) ;
snprintf(str, STR_BUF_LEN, "compare: %d\n\r", compare) ;
print(str) ;
}
void config_pwm(uint16_t period, uint16_t compare)
{
PWM_Stop() ;
PWM_WritePeriod(period) ;
PWM_WriteCompare(compare) ;
PWM_WriteCounter(0) ;
PWM_Enable() ;
}
void do_command(void)
{
char cmd[16] ;
sscanf(str, "%s", cmd) ;
if (strcmp(cmd, "pwm") == 0) {
sscanf(str, "%*s %hd %hd", &period, &compare) ;
} else if (strcmp(cmd, "period") == 0) {
sscanf(str, "%*s %hd", &period) ;
} else if (strcmp(cmd, "compare") == 0) {
sscanf(str, "%*s %hd", &compare) ;
} else if (strcmp(cmd, "report") == 0) {
report() ;
} else {
usage() ;
}
config_pwm(period, compare) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
tty_init() ;
splash("PWM Duty Test on 5LP") ;
PWM_Init() ;
config_pwm(period, compare) ;
}
int main(void)
{
init_hardware() ;
prompt() ;
for(;;) {
if (get_line()) {
do_command() ;
prompt() ;
}
}
}
=================
プログラムを実行したときの Tera Term の様子は
起動直後の波形 period: 999 compare: 899
compare 499にした場合
compare 99 にした場合
オシロの写真、踊っていてすみません。
というように、
pwm <periodvalue> <compare_value>
period <period_value>
compare <compare_value>
と入力して波形を変えられますので
遊んでみてください。
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
ご返信ありがとうございます。
PWM のカウントを0にする処理を追加し、希望の動作をするようになりました。
初歩的な質問に対し、いつも分かりやすいご丁寧なお返事ありがとうございます。