nRF 52832-マルチチャネルADCインタフェースの使用

2631 ワード

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX作者:ZHS(文化人)
XX連絡先:文末Chat快問
XX版権声明:オリジナル文章、コメントと転載を歓迎します~転載する時私に1回教えることができるのが最も良いです
作者のレベルが限られているので、どうしても足りないところがあるので、ご指摘ください.
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
前に書きます:ビルの所有者が参加するプロジェクトの中で2つのADCを採集する必要があるため、ADC採集のマルチチャネルインタフェースを使用して、ADCはnrf 51だけに対して、nrf 52はSAADCにアップグレードします.感慨してみます:Nordicの資料は本当に少なすぎます~
一、調整過程:
まずデバッグの過程を分かち合うのは、数奇なことだと言えます.
1、プロジェクトの中で2つのADCを採集する必要があり、ADCのインタフェースを研究した.
2、マルチチャネルのインタフェースを使用して、timerで呼び出した結果、リセットを招き、原因が見つからず放棄するしかない.(今考えると使い方が間違っているのか、それともインターフェースに詳しくないのか)
3、次に単一チャネルのインタフェースを変更して、2つのtimerの中で呼び出して、ADCは正しいですが、プログラム全体のtimerが異常で、タイミングが間違っていることを発見しました.
4、長い間詰まっていて、ずっと時計の設定や結晶振動に問題があると思っていたが、いろいろな方法でtimer異常問題を解決しようとしたが、ずっと解決しなかった.
5、最後に決別の問題を理解するために、ADCのセットを遮断し、timerが正常であることを発見し、これによって2つのADCが2つのtimerの中に置いて衝突を呼び出し、timer異常を招いたと判断した.
6、2つの単一チャネルADCを1つのtimerの中に置いてみて、timerはまだ異常です.(ADC初期化はブロックモードなので)
7、仕方がない.csdnにもマルチチャネルの使用が検索されず、無理にマルチチャネルのインタフェースを研究し続けるしかない.
8、最終的には、timerでマルチチャネルのインタフェースを呼び出し、問題を解決したことが分かった.
二、使用方法:
       1、single channel ADC:
                nrf_drv_adc_sample_convert(channel,value);
       2、more than one channel:
                nrf_drv_adc_buffer_convert(buffer,size);
1)sizeはbufferの長さである.
2)sizeが2であれば1つのチャネル(input 4)を使用でき,そのチャネルを2回採取し,毎回nrf_を呼び出す.drv_adc_sample();
3)sizeが2で2つのチャネル(input 4とinput 5)が可能であれば、buffer[0]はinput 4に対応し、buffer[1]はinput 5に対応する.
4)ブロックモードではbufferがいっぱいになってからcallbackが呼び出される.
三、使用例:
SDKのadcのルーチンとnrf_を参照drv_adc.hでの紹介:
nrf_drv_adc_channel_t m_channel_config1 = NRF_DRV_ADC_DEFAULT_CHANNEL(NRF_ADC_CONFIG_INPUT_4);
nrf_drv_adc_channel_t m_channel_config2 = NRF_DRV_ADC_DEFAULT_CHANNEL(NRF_ADC_CONFIG_INPUT_5);
//   
adc_init()
{
	ret_code_t ret_code;
	nrf_drv_adc_config_t config = NRF_DRV_ADC_DEFAULT_CONFIG;

	ret_code = nrf_drv_adc_init(&config, adc_event_handler);
	
	m_channel_config1.config.config.input = NRF_ADC_CONFIG_SCALING_INPUT_ONE_THIRD;
	m_channel_config2.config.config.input = NRF_ADC_CONFIG_SCALING_INPUT_ONE_THIRD;	
	nrf_drv_adc_channel_enable(&m_channel_config1);
	nrf_drv_adc_channel_enable(&m_channel_config2);
}


//timer   
adc_timer_handler()
{
	static uint8_t i;

	i++;
	if(1 == i)
		nrf_drv_adc_buffer_convert(buffer, size);

	if(2 == i)
		i = 0;
		
		nrf_drv_adc_sample();
}

周波数が1 hzである必要がある場合、timerは500 msに1回採集するように設定され、2回の採集が完了してからcallbackが呼び出される.
そしてcallback~adc_event_handlerでADCデータを処理すればよい.ここでは,重み付け平均フィルタリングアルゴリズムという簡単なアルゴリズムを用いた.