You are on page 1of 5

Nguyễn Tấn Thanh

123200123
20PFIEV2
Bài tập: Lập trình đọc dữ liệu biến trở kết nối với Vi điều khiển STM32F103, khi giá trị
biến trở lớn hơn 50% thì đèn sáng.
1. Sơ đồ nguyên lý mạch
2. Chương trình điều khiển có chú thích

BÀI LÀM
1. Sơ đồ nguyên lý mạch

Chọn
 PA1: chân đọc input của biến trở
 PA3: chân output của led
Kích hoạt ADC1 cho chân input PA1
2. Chương trình điều khiển có chú thích
 Đây là phần chương trình chính
#include "stm32f1xx_hal.h"
ADC_HandleTypeDef hadc;

GPIO_InitTypeDef GPIO_InitStruct;//Khai báo biến hadc để quản lý ADC và biến GPIO_InitStruct


để cấu hình chân GPIO.

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1)
{
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);
uint16_t adcValue = HAL_ADC_GetValue(&hadc);
HAL_ADC_Stop(&hadc);
//Vòng lặp while(1) để thực hiện đọc giá trị từ ADC liên tục. Trong vòng lặp, chúng ta bắt đầu
chuyển đổi ADC, chờ cho đến khi quá trình chuyển đổi hoàn thành, sau đó đọc giá trị ADC và
dừng chuyển đổi ADC.

if (adcValue > 0.5 * 4095) // Giá trị biến trở lớn hơn 50%
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // Đèn sáng
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // Đèn tắt
}
//Kiểm tra giá trị đọc được từ ADC. Nếu giá trị lớn hơn 50% của giá trị tối đa ADC (4095),
chúng ta bật đèn bằng cách đặt chân GPIOB_PIN_0 lên GPIO_PIN_SET. Ngược lại, chúng ta tắt
đèn bằng cách đặt chân GPIOB_PIN_0 xuống GPIO_PIN_RESET.

HAL_Delay(100); // Đợi 100ms trước khi đọc giá trị tiếp theo
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct; // hàm đồng bộ hệ thống
RCC_ClkInitTypeDef RCC_ClkInitStruct;// Hàm đồng bộ hệ thống
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
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_MUL9;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
__HAL_RCC_ADC1_CLK_ENABLE();
hadc.Instance = ADC1;
hadc.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc);
//Cấu hình các thông số của ADC1, bao gồm chế độ chuyển đổi liên tục, không cho phép
chuyển đổi không liên tục, chế độ kích ngoại vi bằng ADC_SOFTWARE_START, và cấu hình dữ
liệu ADC được căn chỉnh về phải.

sConfig.Channel = ADC_CHANNEL_0; // Chọn kênh ADC tương ứng với chân PA0
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0; // Chọn chân GPIO PA3 tương ứng với đèn sáng
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

You might also like