質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

5288閲覧

STM32で位相差を持たせたプログラムの作成方法

PHENIXa

総合スコア47

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2021/10/23 14:56

編集2021/10/23 15:02

#実現させること
STMマイコンでデューティー比50%のPWM信号を2つ発生させ、それにデューティー比は変更せずにPWM信号を出力する方法を探しています。

#困っていること・試したこと
デューティー比が90°ずれたPWM信号を出力させることはできたのですが、自分が実現させたいのとは異なるようです。これだとデューティ比は可変できるけど位相が可変できません。
(ソースコード参照)
TIM1だけだと実現ができないのでしょうか?一応いろいろと試したのですが、海外の質問サイトにも同じような質問があるのですが、途中で質問が終了してしまっています。
何か不足してるレジスタの項目などがあるのでしょうか?

参考にしたSTM32のリファレンスマニュアル
rm0316
AN4776

#環境
PC:Mac Pro Big Sur
開発環境:STM32CubeIDE
マイコンボード:Nucleo-F303K8

#TIM1のmode設定(変更したところのみ)
イメージ説明
イメージ説明
イメージ説明

//main.c の USER CODE 2 の部分のみ TIM1->CR1 = 1UL<<7 /* ARPEビット*/ | 0b10UL<<5 /*CMSビット */; TIM1->CCMR1 = 0UL<<3 /*OC1PE */ | 0b110UL<<4 /*OC1M */| 0b1UL<<11 /*OC2PE*/| 0b110UL<<12 /*OC2M */; TIM1->CCER = 1UL<<0 /*CC1E */ | 1UL<<2 /* CC1NE */ | 1UL<<4 /* CC2NE */ | 1UL<<6 /* CC3E */ ; TIM1->BDTR = 1UL<<15 /*MOEビット*/ | 1UL<<11 /*OSSR */ | 1UL<<10 /*OSSI */ | 10UL /* DTG */; uint32_t Phase_shift_cnt = 4000; SET_BIT(TIM1->CR1,TIM_CR1_UDIS); TIM1->CCR1 = 5000 - Phase_shift_cnt; TIM1->CCR2 = 5000 + Phase_shift_cnt; TIM1->CCR3 = 5000 + Phase_shift_cnt; TIM1->CCR4 = 5000 - Phase_shift_cnt; CLEAR_BIT(TIM1->CR1,TIM_CR1_UDIS); TIM1->BDTR |= 1UL<<15;// TIM1->CNT = 0;// TIM1->EGR = 1UL; // TIM1->CR1 |= 1UL; //

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/10/25 22:16

参考までに、 > 海外の質問サイトにも同じような質問があるのですが、途中で質問が終了してしまっています のURLを教えて下さい。
PHENIXa

2021/10/26 11:24

STマイクロの質問サイトでした
guest

回答2

0

ベストアンサー

やってみたらできたけど、タイマーをふたつ使って同期運転とかのほうが話がわかりやすいかも。

手持ちの関係でSTM32F302で試しました(多分TIM1の機能は同じ)。

使うのはRM0316リファレンスマニュアルで言えば20.3.13の組み合わせPWMモード(Combined PWM Mode)
組み合わせ PWM モードでは、2 つのエッジアラインまたはセンターアライン PWM 信号を生成でき、
それぞれのパルス間に遅延および位相シフトをプログラムできます。

だそうです。

いろいろとバリエーションはできるでしょうが、

チャネル1がCombined PWM 1、チャネル2がPWM mode 2のとき、
チャネル1はCNT<CCR1のときH
チャネル2はCNT>CCR2のときH
このOR合成がチャネル1出力に出てきます。

チャネル1がComnined PWM 2、チャネル2がPWM mode 1のとき
チャネル1はCNT>CCR1のときH
チャネル2はCNT<CCR2のときH
このAND合成がチャネル1出力に出てきます。

で、同じ仕組みがチャネル3と4の組でも使えるので、タイマー1本で(4チャネルを使用して)2系統の位相差を持ったPWM波形が出せるには出せる、ということになります。
ただし、位相を動かしていくとCNTのリセットをまたぐかまたがないかでPWMモードを変えなきゃいけない、なんて話になるようですね。
CH1/CH2設定

とりあえずカウンタは16bitフルに回して50%デューティー2位相の例

cubeMX設定

これで、main関数中で初期化後に

C

1 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); 2 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); 3 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); 4 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);

しただけでPC0とPC2に位相差のあるパルスが得られました。CCR(cubeMX上では各ChannelのPulse)を動かすとパルスの開始/終了位置が変わります。


Asymmetric PWMでもやってみました。
今度はCounter Mode:Center Aligned mode 1, Counter Period 10000

CubeMX設定
CubeMX設定

写真うまく取れてないけど出力波形(骨董品オシロなので画面出力できない)上CH1(PC0)下CH3(PC2)
出力波形

投稿2021/10/24 12:31

編集2021/10/26 13:42
thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/10/24 12:35

マニュアルにはさらっとセンターアラインでもできるような書き方になってるけど、センターアラインで移相できるんだろうか? 設定を思いつかない。
thkana

2021/10/26 13:04

さらに検討してみたけど、センターアライン時に似たようなことができるのがAsymmetric PWMということかしら。CH1/CH3をAssymetric PWM1にしたらCH2/CH4はPWM mode1に、CH1/CH3をAssymetric PWM2にしたらCH2/CH4はPWM mode2にしないといけないみたいだけど。 Asymmetricではセンターアラインの「山」か「谷」を挟む波形しか作れないから、Combinedのほうが自由度はちょっと高い、ということになるかしら。Duty50%ならどちらでもほぼ同等。 AsymmetricにしろCombinedにしろ、一つのPWM波形をCH1とCH2で、もう一つをCH3とCH4で作るのがミソ、ということの様子。
PHENIXa

2021/10/26 13:58

確かにできたことにはできたのですが、何か腑に落ちないところがあります。 RM0716の図176では非対称PWMで実現可能らしいのですが、ややこしいのでしょうか? 別に「非対称PWM」に拘るつもりはないのですが、気になったので...
thkana

2021/10/26 14:22

タイミング的に入れ違いになったのかも知れませんが、Asymmetric PWMでの設定も回答に追記しました。 RM0316の図176は内部信号OC1REFCとOC3REFCについて書かれています。その出力ピンはCH1(PC0)/CH3(PC2)です。
thkana

2021/10/26 23:26

STM32F302とF303ではピンアサイン違いましたね。 F303だとTIM1_CH1はPA8, TIM_CH3はPA10ですか。
PHENIXa

2021/10/27 12:48

TIM1_CH1はPA8で TIM1_CH3はPA10ですね 一応,非対称PWMの方も試してみましたが、問題なく動作できたのですが、STMのタイマについては理解できていないことが多いので、あとは自分で調べていこうと思います。
thkana

2021/10/27 13:25

職場の上司はSTM32のタイマーは変態的に凝っている...と評していました。 まぁ、頑張ってください。
PHENIXa

2021/10/28 21:31

半日考えてやっとわかりました!! 自分はArduinoしか使ってこなかったですが、なんかSTM32マイコンはタイマーがいろいろとややこしいんですね(高機能だから仕方ないのでしょうか)
guest

0

タイマを2つで同じPWMを生成しといて、カウンタをずらすことで任意の位相差とする、というのでどうでしょう

タイマ一つだけではおっしゃるような波形生成は難しいのではないかと思います

投稿2021/10/23 23:26

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問