STM32 ADC Continuous Conv Mode не запускает преобразование автоматически



Я пытаюсь настроить АЦП над STM32F411RE в простом непрерывном режиме Conv. Я использовал CubeMX для генерации кода на основе драйверов HAL, и это некоторые части сгенерированного кода, которые intialize ADC:



/* ADC1 init function */
void MX_ADC1_Init(void)
{

/**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
hadc1.Init.Resolution = ADC_RESOLUTION_8B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}

}


А вот основная функция:



int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART2_UART_Init();

/* USER CODE BEGIN 2 */
uint8_t analogVal;
uint8_t string[] = "Poll failedn";

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_Delay(1000);
if( HAL_ADC_Start(&hadc1) == HAL_OK) HAL_UART_Transmit(&huart2,(uint8_t*)"STRT OKn",8,100);
else HAL_UART_Transmit(&huart2,(uint8_t *)HAL_ADC_Start(&hadc1),1,100);
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
if(HAL_ADC_PollForConversion(&hadc1,1) == HAL_OK){
analogVal = HAL_ADC_GetValue(&hadc1);
HAL_UART_Transmit(&huart2,&analogVal,sizeof(analogVal),100);
}
else{
HAL_UART_Transmit(&huart2,string,sizeof(string)-1,100);
}
HAL_Delay(100);
}
/* USER CODE END 3 */

}


Если я скомпилирую и загружу этот код в микроконтроллер, не более одного раза analogVal будет передан через UART. Но если я помещаю функцию HAL_ADC_Start в цикл while, возвращается HAL_ADC_PollForConversion значение будет HAL_OK в каждом цикле while и будет analogVal для отчета.



Мой вопрос в том, почему я должен каждый раз просить АЦП запуститься, если я включил ContinuousConvMode?

785   2  

2 ответов:

Я уверен, что проблема заключается в установке флага EOC. hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; следует заменить на hadc1.Init.EOCSelection = EOC_SEQ_CONV;.

Ваша текущая опция ADC_EOC_SINGLE_CONV действует как включение одного преобразования, но вам нужно EOC_SEQ_CONV aka последовательные преобразования.

Это в значительной степени та же проблема, которая обсуждалась здесь.

Согласно справочному руководству (RM0383, стр. 214):

Режим сканирования выбирается путем установки бита сканирования в ADC_CR1 зарегистрировать. Как только этот бит установлен, АЦП сканирует все каналы выбирается в регистрах ADC_SQRx (для регулярных каналов) или в Регистр ADC_JSQR (для инжектируемых каналов). Одно преобразование-это выполняется для каждого канала группы. После каждого конца преобразования, следующий канал в группе преобразуется автоматически. Если продолжение бит установлен, регулярное преобразование каналов не останавливается на последнем выбранный канал в группе, но продолжается снова с первого выбранный канал .

Таким образом, дополнительно вы должны объявить группу каналов и их количество в регистре ADC_SQR (в вашем случае это будет только один канал).

Править: Обратите внимание, что в вашем примере, который вы разместили существует внешний запуск каждого преобразования таймером:

 g_AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;

Но верно я не видел инициализации таймер в остальной части этого кода.

Comments

    Ничего не найдено.