同じタイマーの複数の出力PWM波チャネル間のSTM32F7相互影響

-------------------------- 2020/8/12更新------------------ --------------
今回は、Cubeを使用してPWM制御コードを直接生成し、RT-Thread Studioでプログラムを作成したところ、TIM1とTIM8の8つのPWM波制御が実現できることがわかりました。問題は、最下層を書くときにいくつかの要因を見落としていることかもしれません。以下は参照用です。

- - - - - - - - - - - - - 元の - - - - - - - - - - - - ---------
このブログを使用して、私が3日間投げたピットでの踏みつけの苦痛な経験を記録します。次の内容は参照用であることを事前に宣言します。理由がわかっている場合は、コメント領域で私を修正してください。 。

結論から始めましょう:ピットを踏んだこの経験から、同じタイマーが複数のPWM波出力に設定されている場合、F7開発ボード(少なくとも私が購入したもの)がさまざまなチャネル間で相互に影響を与えることがわかりました。特定のパフォーマンスはTIM3とTIM4です。各タイマーのCH1とCH2、CH3とCH4は互いに独立していません。具体的な説明については、フォローアップを参照してください。

初期状況

STM32リソースを節約するために、ブロガーは当初、同じタイマーの4つのチャネルを使用して複数のPWM波を出力し、複数のESCを制御することを計画していました。パンクチュアアトムが使用するF7開発ボードは、もともとTIM3とTIM4、合計8つのチャネルを使用して8つのPWM波出力を実現し、シリアルポートを介してコマンドを送信してPWM波のデューティサイクルを変更することを目的としていました。

参考資料は公式マニュアルです。
シリアル通信制御については、このブログ投稿参照してくださいSTM32407シリアルポート制御PWMデューティサイクルと周波数
ESC制御以前のブログ投稿を参照してください:STM32はPWMを介してESC30CESCを制御します

最初に、TIM3とTIM4の8つのチャネルを構成して、PWMを一緒に出力します。周期は20ミリ秒、初期パルス幅は1.5ミリ秒です。

問題がありました

1つ目は、プログラムのダウンロード後に物理オブジェクトをテストすることです。ESCのロックを解除した後、シリアルポートを使用して1.7msのパルス幅を送信し、速度を調整して制御を完了しますが、1.1ms後に停止します。デッドゾーンだと思いました。 、次に1.3msコマンドを再送信しても、何も起こりません。次に、オシロスコープを接続してピンの出力波形を観察します。シリアルポートが命令を送信するときにパルス幅が1.5msの範囲内で自由に調整できることに驚きましたが、パルス幅が1.5ms未満の場合は変化しません。これは最小の変化です。 1.5msまで(プログラムでPWMを初期化するときにパルス幅をランダムに設定し、TIM-> CCRx構成レジスタを使用して初期パルス幅を1.5msに変更します。以前のブログ投稿では、これはESCのロックを解除するためのものであると述べています)。

記事の内容をより充実させるために、パルス幅を変更するための概略プログラムを示します。

//设置TIM3通道的占空比
//compare:比较值
void TIM3_SetChannelCompare(u8 channel, u32 compare)
{
    
    
	switch(channel)		//配置各个通道的CCRx寄存器值
	{
    
    
		case 1:
			TIM3->CCR1 = compare;
			break;
		case 2:
			TIM3->CCR2 = compare;
			break;
		case 3:
			TIM3->CCR3 = compare;
			break;
		case 4:
			TIM3->CCR4 = compare;
			break;
	}
}

これがシリアルポート制御プログラムです。ここでは、TIM3の各チャネルのシリアルポート制御のみが構成されていることに注意してください。

/*****
串口指令控制PWM波输出函数
初始高电平占空比已设置为中位信号1.5ms,对应于15
通过修改占空比来实现电调调速功能,范围11~19
后续配置指令如下(目前仅配置TIM3通道):
输入指令CHx XX E,其中x表示通道,XX表示占空比时间,E表示结束
*****/
void USART1_PWM(void)
{
    
    
	u16 len;
	u8 ch, time;
	u8 flag = 0;
	
	if(USART_RX_STA & 0x8000)
	{
    
    
		len = USART_RX_STA & 0x3fff;
		
		if(USART_RX_BUF[len-1]=='E')
		{
    
    
			if(USART_RX_BUF[0]=='C' & USART_RX_BUF[1]=='H' & USART_RX_BUF[3]==' ' & len==8)
			{
    
    
				ch = (USART_RX_BUF[2]-48);
				time = 10*(USART_RX_BUF[4]-48) + (USART_RX_BUF[5]-48);		//字符'0'对应的ASC码是48,因此为了得到正确的数字需减去48
				printf("ch = %d, time = %d\r\n", ch, time);
				if(ch<5 & ch>0)
				{
    
    
					//TIM4_SetChannelCompare(ch, time);
					TIM3_SetChannelCompare(ch, time);
					printf("pwm占空比已修改为%d\r\n", time);
					flag = 0;
				}
				else flag = 1;
			}
			else flag = 1;
		}
		else flag = 1;
		
		if(flag==1)
		{
    
    
			flag=0;
			printf("指令无效,请重新输入\r\n");
		}
		
		USART_RX_STA = 0;
	}
}

問題解決プロセス

以下は私の考えと解決のプロセスです。問題が発生した場合は、この考えに従って自分で解決を試みることができます。

①CCRx値の変更方法に問題があるのではないかと思ったので、パンクチャムアトムの方法でチャンネルを個別に設定しました。

//设置TIM通道1的占空比
//compare:比较值
void TIM_SetTIM3Compare1(u32 compare)
{
    
    
	TIM3->CCR1 = compare;
}

ただし、レジスタCCRxの値がmainで直接変更されても、明らかに機能の問題ではありません。

②次に、シリアル通信が影響を受けることを考慮してください。つまり、最初にメインのUSART1_PWM()関数をオフにし、シリアルポートを使用してデューティサイクルを変更せず、プログラムのデューティサイクルを直接変更します。テスト後、問題はまだ存在します。

③最後に、タイマーを個別にデバッグします。まず、他の3つのPWM波をオフにして、出力用に1つのチャネルだけを残します。このとき、キーが来ます。この場合、シリアルポートを介して制御することも、プログラム内で直接変更することもできます。つまり、1.5ms未満で調整することができます。

④しかし、多くのテストを行った後、なぜこれが起こるのかまだわかりません。ですから、助けを求め始めてください(結局のところ、最初に自分で試して、特定の問題を知る必要があります。そうしないと、助けを求めたときに要点をつかむことができません)。最初に、STM32を使用したことのある仲間に尋ねましたが、複数のPWM出力を構成しようとしたことは一度もありませんでした。その後、フォーラムやさまざまな専門家グループを含むがこれらに限定されないインターネットでのみ助けを求めることができます(今回はさらに数回電話する必要があります)兄貴)、しかし結果はあまり満足のいくものではありません。

⑤危機的な時期に友人は信頼できる。友人からのリモートビデオの助けを借りて、これは形而上学的な問題であることがわかった。デバッグモードでシリアルポートでコマンドをテストしたところ、テストしたCH1チャネルのパルス幅を1.5ms未満に減らすことができないことがわかった。ただし、内部CCR1レジスタの値が実際に変更されていることが観察され、多くの議論の結果、これは形而上学的な問題であると判断 されました。また、チャネル1のパルス幅が変更されると、チャネル2のパルス幅にも影響が及ぶことが観察されます。、議論は夜遅くまでまだ無益でした。

問題が解決しました

朝起きて考えたのですが、CH1とCH2が影響し合うとしたら、CH3とCH4はどうですか?すると、食後、CH1とCH2が互いに影響し合い、CH3とCH4も互いに影響し合うことに驚きました。

具体的には、SetCompareを使用して同じタイマーの4つのチャネルを初期化および構成すると(すべて1.5msであると想定)、CH1のパルス幅の変化は他のチャネルCH2の影響を受けます。チャネルのパルス幅が大きい場合、他のチャネルのパルス幅をこのチャネルのパルス幅より小さくすることはできません。CH2のパルス幅が2msに設定されているとすると、CH1も2msに変更され、2ms以上の範囲でのみ実行できます。調整します。CH3とCH4の間でも同じことが言えます。ただし、マニュアルを読んだところ、チャンネルが独立していることが明記されており、理由はわかりません。ご理解いただける方がいらっしゃいましたら、お答えください。
ここに写真の説明を挿入

結論として

以下は個人テストの結論に過ぎません(間違っている可能性があります)。同じタイマーでマルチチャネルPWM波出力を実行すると、CH1とCH2が相互に影響し合うことがわかります(グループ1と呼ばれます)。同様に、CH3とCH4(と呼ばれます)。グループ2)。ただし、グループ1とグループ2は相互に影響を与えません。つまり、CH1とCH3 / CH4、またはCH2とCH3 / CH4を使用して、各PWM波を制御できます。

もちろん、私自身の理由によるものかもしれませんので、上記の内容は参考用です。主な目的は、フォローアップレビューのためにピットを踏んだ経験を記録することです。大勢の人も私を批判して訂正することを歓迎します。

-------------------------- 2020/8/12更新------------------ --------------
今回は、Cubeを使用してPWM制御コードを直接生成し、RT-Thread Studioでプログラムを作成したところ、TIM1とTIM8の8つのPWM波制御が実現できることがわかりました。問題は、参照用として、最下層を作成するときにいくつかの要因を見落としていることかもしれません。

おすすめ

転載: blog.csdn.net/moumde/article/details/107687596