Top.Mail.Ru
Уведомления
Очистить все

Проблема с АЦП STM32F103C8T6

(@kamina)
New member

Добрый день, нахожусь в недоумении, рассчитываю на помощь

Только-только приобрел STM32F103C8T6. Скачал CubeMx, среда CubeIde. 

Так вот, только не смейтесь. Столкнулся с проблемой - элементарно не могу написать простейшую программу, смысл которой в том, что по достижении определенного порога по напряжению загорается светодиод, при значении ниже данного порога - выключается. 

В МХ настроил вывод PA0 как вход АЦП, вывод PB7 - как вывод IO, к которому подключается светодиод.

Снимок экрана 2024 10 21 163220

 Сгенерировал проект под среду CubeIde, версия firmware для STM32F103 - 1.8.0, тут все в порядке. 

Но при запуске программы понимаю, что программа нерабочая. Прикладываю код:
Код main.c

#include "main.h"

#include "adc.h"

#include "gpio.h"

 

// Включение необходимых библиотек для работы с АЦП и GPIO

 

void SystemClock_Config(void);

 

int main(void)

{

// Инициализация HAL

HAL_Init();

 

// Настройка системного тактового генератора

SystemClock_Config();

 

// Инициализация GPIO (PB7 для светодиода)

MX_GPIO_Init();

 

// Инициализация АЦП (использует `adc.c`)

MX_ADC1_Init();

 

// Основной цикл

while (1)

{

// Переменная для хранения результата АЦП

uint32_t adc_value = 0;

 

// Старт преобразования АЦП

HAL_ADC_Start(&hadc1);

 

// Ждем окончания преобразования

if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)

{

// Чтение значения АЦП

adc_value = HAL_ADC_GetValue(&hadc1);

}

 

// Сравнение значения с порогом 1.65 Вольт (2048 для 12-битного АЦП с диапазоном 0-3.3 В)

if (adc_value > 2048)

{

// Если напряжение выше 1.65 В, зажигаем светодиод

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);

}

else

{

// Иначе выключаем светодиод

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);

}

}

}

 

// Настройка системного тактового генератора

void SystemClock_Config(void)

{

// Сгенерируйте код через STM32CubeMX

}

void Error_Handler(void)

{

// В случае ошибки можно добавить код для индикации ошибки, например, включить светодиод

while(1)

{

// Бесконечный цикл, чтобы остановить выполнение программы при возникновении ошибки

}

Код АЦП(сгенерированный МХ)

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file adc.c

* @brief This file provides code for the configuration

* of the ADC instances.

******************************************************************************

* @attention

*

* Copyright (c) 2024 STMicroelectronics.

* All rights reserved.

*

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

*

******************************************************************************

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "adc.h"

 

/* USER CODE BEGIN 0 */

 

/* USER CODE END 0 */

 

ADC_HandleTypeDef hadc1;

 

/* ADC1 init function */

void MX_ADC1_Init(void)

{

 

/* USER CODE BEGIN ADC1_Init 0 */

 

/* USER CODE END ADC1_Init 0 */

 

ADC_ChannelConfTypeDef sConfig = {0};

 

/* USER CODE BEGIN ADC1_Init 1 */

 

/* USER CODE END ADC1_Init 1 */

 

/** Common config

*/

hadc1.Instance = ADC1;

hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

hadc1.Init.ContinuousConvMode = DISABLE;

hadc1.Init.DiscontinuousConvMode = DISABLE;

hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfConversion = 1;

if (HAL_ADC_Init(&hadc1) != HAL_OK)

{

Error_Handler();

}

 

/** Configure Regular Channel

*/

sConfig.Channel = ADC_CHANNEL_0;

sConfig.Rank = ADC_REGULAR_RANK_1;

sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

{

Error_Handler();

}

/* USER CODE BEGIN ADC1_Init 2 */

 

/* USER CODE END ADC1_Init 2 */

 

}

 

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)

{

 

GPIO_InitTypeDef GPIO_InitStruct = {0};

if(adcHandle->Instance==ADC1)

{

/* USER CODE BEGIN ADC1_MspInit 0 */

 

/* USER CODE END ADC1_MspInit 0 */

/* ADC1 clock enable */

__HAL_RCC_ADC1_CLK_ENABLE();

 

__HAL_RCC_GPIOA_CLK_ENABLE();

/**ADC1 GPIO Configuration

PA0-WKUP ------> ADC1_IN0

*/

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

/* ADC1 interrupt Init */

HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(ADC1_2_IRQn);

/* USER CODE BEGIN ADC1_MspInit 1 */

 

/* USER CODE END ADC1_MspInit 1 */

}

}

 

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)

{

 

if(adcHandle->Instance==ADC1)

{

/* USER CODE BEGIN ADC1_MspDeInit 0 */

 

/* USER CODE END ADC1_MspDeInit 0 */

/* Peripheral clock disable */

__HAL_RCC_ADC1_CLK_DISABLE();

 

/**ADC1 GPIO Configuration

PA0-WKUP ------> ADC1_IN0

*/

HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);

 

/* ADC1 interrupt Deinit */

HAL_NVIC_DisableIRQ(ADC1_2_IRQn);

/* USER CODE BEGIN ADC1_MspDeInit 1 */

 

/* USER CODE END ADC1_MspDeInit 1 */

}

}

 

/* USER CODE BEGIN 1 */

 

/* USER CODE END 1 */

Пока прикладывать файлы не буду, в остальных все в порядке, но если потребуется - буду рад скинуть.

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

 

 

Цитата
Создатель темы Размещено : 21.10.2024 16:35
Aveal
(@aveal)
Top level Admin

Доброго времени, можете проект скинуть на почту полный? (aveal@microtechnics.ru)

ОтветитьЦитата
Размещено : 21.10.2024 16:56
Поделиться: