1. NECコーディング入門
NEC プロトコルは、現在広く使用されている赤外線リモコンのコードで、その搬送波周波数は 38khz、つまり 1 秒間に 38000 パルスを生成でき、各パルス周期は 1000000us/38000=26.3us です。
NEC プロトコルは、パルス間隔を使用してデータの各ビットをエンコードし、異なるデータ ビットの時間間隔を使用して異なる論理ビットを表します。
送信データの上位ビットが先になります。
注:リモコン受信機は、パルスを受信するとロー レベルになり、アイドル状態になるとハイ レベルになります。
論理「0」: 562.5µs のアクティブ パルス + 562.5µs のアイドル間隔、合計 1.125ms。
論理「1」: 562.5µs のアクティブ パルス + 1.6875ms のアイドル間隔、合計 2.25ms の持続時間。
開始ビット: 9ms の有効パルス + 4.5ms のアイドル間隔、合計持続時間は 13.5ms です。
これに基づいて、NEC はデータのフレームを送信します: 開始ビット + アドレス コード + アドレス コード反転 + コマンド コード + コマンド コード反転
リピートコード: ボタンを押し続けると、データのフレームを送信した後、110ms ごとにリピートコードが送信されます。
9 ミリ秒のアクティブ パルス + 2.25 ミリ秒のアイドル インターバル、合計持続時間は 11.25 ミリ秒です。
2.STM32CubeMX の設定
概略図は次のとおりです。
STM32CubeMX は次のように構成されます。
分周比は71でメイン周波数は72mhzなので、タイマー周波数は72mhz/(71+1)=1mhz、つまり1μsに1回カウントします。
カウント方法はカウントアップです。
オートロード値は最大値の 65535 で、65.535µs でオーバーフローします。これはすべてのロジック ビットよりも大きいため、オーバーフローについて心配する必要はありません。
自動ロードを有効にします。
立ち下がりエッジ トリガー。
割り込み有効、ピンセットプルアップ。
3. コード分析 NECコード
TIM3の初期化後にインプットキャプチャを開始
/* USER CODE BEGIN TIM3_Init 2 */
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3); //启动输入捕获
/* USER CODE END TIM3_Init 2 */
グローバル変数を定義する
uint16_t IRTimer_Data = 0;//存放计数值
uint32_t IRCode = 0;//存放红外码
uint8_t IR_Flag = 0;//IR解析完成标志位
uint8_t IR_LeaderCode = 0;
割り込み処理機能と解析機能
/* USER CODE BEGIN 4 */
void Paser_IRCode(uint16_t PData)
{
if((PData>12000)&&(PData<15000))//获得引导码,理论值13500
IR_LeaderCode = 1;
if(IR_LeaderCode==1)
{
if((PData>1000)&&(PData<1300))//0,理论值1125
{
IRCode=(IRCode<<1);
i++;
}
else if((PData>2000)&&(PData<2500))//1,理论值2250
{
IRCode = (IRCode<<1)|0x01;
i++;
}
if(i==32)
{
i = 0;
IR_LeaderCode = 0;
IR_Flag = 1;
}
}
}
void TIM_IRQHandler(void)
{
IRTimer_Data = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3);//获取当前的捕获值.
__HAL_TIM_SET_COUNTER(&htim3,0); //设置计数寄存器的值变为0
Paser_IRCode(IRTimer_Data);
}
関数を割り込み関数に入れることを忘れないでください
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
TIM_IRQHandler();
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
メイン関数でNECコードを出力
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(IR_Flag ==1)
{
printf("%08x\r\n",IRCode);
IR_Flag = 0;
}
}
/* USER CODE END 3 */
リモコンのボタン 1 を押した結果は、アドレスコードが 0x00、アドレスの反転が 0xff、コマンドコードが 0x68、コマンドの反転が 0x97 であることがわかります。