1

CubeIDE を使用して、STM32F031K6 で HAL (セットアップを除く) を使用せずに ADC を使用しようとしています。ADCを不連続モードで使用しています-私が知る限り、イベントのシーケンスは

  • ADC がセットアップされ、ADEN で有効化されます
  • ADSTART を設定して ADC の変換を開始する
  • EOC フラグをチェックして、変換がいつ終了したかを確認します
  • DR レジスタからデータが読み出されると、EOC フラグがクリアされます。

ここで私は混乱しています-その後、ADSTARTを再度設定する必要がありますか? 連続モードでは、リファレンスマニュアルは次の変換が自動的に行われることを示しているようですが、不連続モードでは、次の変換を手動で開始する必要があると述べています-これはADSTARTによって行われると思いますか? シミュレーションでは、これはうまくいかないようです。データシートには、ADSTART はソフトウェアによって設定されると書かれていますが、これは直接書き込めないということですか?

私のコードは次のとおりです。ステップバイステップでクリックすると正しく動作しないようです。実行を設定すると、ボード上のポットを変更すると ADC1_data 変数が変化するのがわかりますが、断続的に動作し、 0 と正しい値

HALのセットアップは

static void MX_ADC_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};
 
  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;     
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }
 
  /** Configure for the selected ADC regular channel to be converted. */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
 
  /** Configure for the selected ADC regular channel to be converted. */
  sConfig.Channel = ADC_CHANNEL_1;
  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

プログラム内のコードは読み取ります

ADC1->CR |= ADC_CR_ADEN; // enable ADC
ADC1 ->SMPR = 0b11;// speed divider select
ADC1 ->CHSELR |= 1<<0 | 1<<1; // set sequence to adc0, adc1
ADC1 ->CFGR1 |= ADC_CFGR1_DISCEN; //discontinuous mode
ADC1 ->CR |= 1<<2; // start conversion

while (1)
{
  if((ADC1->ISR) & 0b00000100) //if EOC flag is on
  {
    ADC1_data = ADC1->DR;
    ADC1 ->CR |= 1<<2; // start conversion
  }
}

私が間違いを犯しているかどうかを誰かが確認できますか? どんな助けでも大歓迎です

4

0 に答える 0