STM32 ADC DMA

 STM32 ADC DMA

割り込みで読むという方法などがあるが、連続的に読むやり方。

1.ピン配置

AnalogからADC1を選択(別にADC2でもよい、上の例では4チャンネル分を指定。すでにSPIと競合しているピンが赤くなっている)

下のタブをDMA Settingにきりかえ、Addを押す。

ModeをCircularをしていして、Memoryの方にIncrementのチェックが入っているか確認する。


Parameter Settingのタブ
Continuous Conversion Mode Enable
Number of Conversion を読み取る端子の数、ここでは4
それぞれRank違いで、Sampling Timeを設定し、Channel0から1、2と使うチャンネル分増やす。Sampling Timeここは長くっとっておいて様子を見て早くする(計算すればよいんだろうけど・・・)
ADCについての詳しい解説:

Clockの方も必要に応じて編集する。

ADC prescalerを/6を選択して12MHzに設定した。
ここまでできたら保存してコードを吐き出す。

2.コーディング
  /* USER CODE BEGIN 2 */
//ADC setting
uint16_t ADC_buff[4];
  while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK);           // calibrate AD convertor
  if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_buff, 4) != HAL_OK)
  {
  Error_Handler();
  }

  /* USER CODE END 2 */

メイン部分は
 /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /*read ADC*/
  for (int i=0;i<4;i++){
 V1[i]=ADC_buff[i]/4095.0*3.3;
  sprintf(OLED_buffer, "ch%d=%d\n\r",i+1,ADC_buff[i]);
  ssd1306_SetCursor(0, 8*i);
  ssd1306_WriteString((char *)OLED_buffer, Font_6x8, White);
  }
  ssd1306_UpdateScreen();
}

ADC_buffを呼び出すごとに読み取りされる。
ch1~ch4で干渉している5-7を飛ばして、8をさらに有効化した場合でもBuffer[0]にch1,[1]にはch2.....[3]にch4, [4]にch8が格納される。 


コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法