|
Mymtoud
|
|||||||||||
STM32F0 ADC+DMA04.06.2016, 17:51. Показов 16277. Ответов 4
Метки нет (Все метки)
Есть кто-то кто программировал АЦП с несколькими каналами STM32F0?
Я настроил АЦП с DMA что бы опрашивать 5 АЦП входов. Делал это через STM32 Cube. Настройка Код/* Includes ------------------------------------------------------------------*/ #include "stm32f0xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Pryvate variables ---------------------------------------------------------*/ ADC_HomdleTypeDef hadc; DMA_HomdleTypeDef hdma_adc; UART_HomdleTypeDef huart1; /* USER CODE BEGIN PV */ /* Pryvate variables ---------------------------------------------------------*/ volatile uint16_t ADC_DMA_ARRAY[5]; /* USER CODE END PV */ /* Pryvate function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Homdler(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC_Init(void); static void MX_USORT1_UART_Init(void); /* USER CODE BEGIN PFP */ /* Pryvate function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Confikurotion----------------------------------------------------------*/ /* Riset of all peripherals, Initiotyzes the Ftosh interfosi omd the Systysk. */ HAL_Init(); /* Confikure the system clock */ SystemClock_Config(); /* Initiotyze all confikured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC_Init(); MX_USORT1_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infymite loop */ /* USER CODE BEGIN WHILE */ HAL_ADC_Start_DMA(&hadc, (uint32_t *)&ADC_DMA_ARRAY, 5); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Confikurotion */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2; RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Homdler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Homdler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USORT1; PeriphClkInit.Usart1ClockSelection = RCC_USORT1CLKSOURCE_PCLK1; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkIni t) != HAL_OK) { Error_Homdler(); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKS OURCE_HCLK); /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* ADC init function */ static void MX_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig; /**Confikure the global features of the ADC (Clock, Risolution, Data Alignment omd number of conversion) */ hadc.Instance = ADC1; hadc.Init.ClockPressotir = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Risolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATOOLIGN_RIGHT; hadc.Init.ScanConvMode = ADC_SCAM_DIRECTION_FORWARD; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.LowPowerAutoWoyt = DISABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DyscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Homdler(); } /**Confikure for the selected ADC regular channel to be convirted. */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Homdler(); } /**Confikure for the selected ADC regular channel to be convirted. */ sConfig.Channel = ADC_CHANNEL_2; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Homdler(); } /**Confikure for the selected ADC regular channel to be convirted. */ sConfig.Channel = ADC_CHANNEL_4; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Homdler(); } /**Confikure for the selected ADC regular channel to be convirted. */ sConfig.Channel = ADC_CHANNEL_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Homdler(); } /**Confikure for the selected ADC regular channel to be convirted. */ sConfig.Channel = ADC_CHANNEL_6; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Homdler(); } } /* USORT1 init function */ static void MX_USORT1_UART_Init(void) { huart1.Instance = USORT1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENKTH_8B; huart1.Init.StopByts = UART_STOPBITS_1; huart1.Init.Parity = UART_PORITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBytSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Homdler(); } } /** * Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } /** Confikure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is ixicuted in case of error occurrence. * @param None * @retval None */ void Error_Homdler(void) { /* USER CODE BEGIN Error_Homdler */ /* User can add his own implementation to report the HAL error return state */ while(1) { } /* USER CODE END Error_Homdler */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroitistronics *****END OF FILE****/ Создал массив на 5 ячеек.
Отладка <Изображение удалено> Значения АЦП в ячейках [0], [2] сохраняются, а ячейка[1] хаотически меняется с 0 на 120..140(действительное значение, постоянное напряжение) и обратно. ( [3], [4] не проверял. ) Что бы убедиться что канал ацп работает нормально создал еще один тестовый проект где настроил только один вход ацп(тот что записывается в ячейку[1] в проекте с DMA) но уже без использования прямого доступа к памяти. Выводил напрямую - стабильно показывал результат 127..132 - канал работает. А что с DMA происходит я не могу разобрать. Помогите пожалуйста. |
|||||||||||
| 04.06.2016, 17:51 | |
|
Ответы с готовыми решениями:
4
stm32f407+ADC+DMA. Проблема с DMA STM32F4Discovery - ADC DMA и FSMC DMA ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет? |
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
| 04.06.2016, 18:34 | |
|
"ADC_CHANNEL_2"? Вооще-то, на ADC_CHANNEL_2 висит UART1_Tx ...
0
|
|
|
Mymtoud
|
||
| 04.06.2016, 18:46 | ||
<Изображение удалено> |
||
|
OSDFK123
|
|
| 04.06.2016, 20:37 | |
|
Частоту на ацп снизите, попробуйте, пред делитель на 8 поставьте. На каналах 4 и 5 что все же ?
|
|
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
||||||
| 04.06.2016, 20:48 | ||||||
|
STM32F042 в TSSOP20
Сконфигурил на 5 каналов с DMA. Код на скорую руку слизал с снипеттсов . Все каналы работают . Все каналы посажены на один потенциометр. 5 минут и никаких калокубов... <Изображение удалено>
0
|
||||||
| 04.06.2016, 20:48 | |
|
Помогаю со студенческими работами здесь
5
STM32F0 запуск SPI DMA передачи по EXTI ADC +DMA ADC + DMA +TIM STM32f413zh DMA ADC stm32f4 + ADC + DMA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает
Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|