Toby's Study Blog
article thumbnail
Published 2023. 9. 6. 21:19
[stm32] ADC & DMA ์‹ค์Šต embedded

๐Ÿณ ์‹ค์Šต ๋ชฉํ‘œ

1. ์™ธ๋ถ€ ์˜จ๋„ ์„ผ์„œ - F429zi ์—ฐ๊ฒฐ
2. DMA๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๊ธฐ๋ณธ ๊ฐ’ ํ™•์ธ 
3. DMA๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ADC ์™ธ๋ถ€ ์˜จ๋„ ์„ผ์„œ ๊ฐ’, ๋‚ด๋ถ€ ์žฅ์น˜ Vref ๊ฐ’, ๋‚ด๋ถ€ ์˜จ๋„ ์„ผ์„œ ๊ฐ’ ํ™•์ธ 

 

๐Ÿณ ADC ์„ธํŒ…

ADC1 ํŒŒ๋ผ๋ฏธํ„ฐ ์„ธํŒ…
ADC1 DMA, NVIC ์„ธํŒ…

ADC1 ํŒŒ๋ผ๋ฏธํ„ฐ ์„ธํŒ… 

 1.1 Mode
 Independent mode : MCU ๋‚ด๋ถ€ ADC ๊ธฐ๋Šฅ ์‚ฌ์šฉ
 1.2 Clock Prescaler
 CPU Clock์„ ์‚ฌ์šฉํ•˜์—ฌ ADC ๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ ์‹œ์Šคํ…œ์˜ ํด๋Ÿญ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋น ๋ฅผ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ „๋ ฅ ์†Œ๋น„ ํšจ์œจ์„ฑ ๋ฐ 

 ์ฃผํŒŒ์ˆ˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘์„ ์œ„ํ•ด  CPU clock์„ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•œ๋‹ค.(โ€ป ์ตœ์†Œ 4 ์ด์ƒ)

 (โ€ป F429zi  PCLK2 (Peripheral Clock 2)์˜ ๊ฒฝ์šฐ 90MHz ์ด๋ฏ€๋กœ 4๋กœ ๋‚˜๋ˆŒ ๊ฒฝ์šฐ 22.5MHz๊ฐ€ ๋œ๋‹ค.)

 1.3 Resolution
 ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ๋˜๋Š” ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ๊ฐ€ 3V์ธ ๊ฒฝ์šฐ 12 bit๋กœ Resolution์„ ์„ค์ •ํ•˜์˜€์„ ๋•Œ 3V /4096= 0.732mV ๊ฐ„๊ฒฉ์œผ๋กœ 
 ๋””์ง€ํ„ธํ™” ๋˜๊ฒŒ ๋œ๋‹ค.
 1.4 Data Alignment
 ADC ๋ณ€ํ™˜ ๊ฒฐ๊ณผ 8 bits(1 byte)๋ฅผ 16 bits์˜ ๋ ˆ์ง€์Šคํ„ฐ์— ์‚ฝ์ž…ํ•˜์˜€์„ ๋•Œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•œ๋‹ค.
 1.5 Scan Conversion Mode

 ์—ฌ๋Ÿฌ ์ž…๋ ฅ ์ฑ„๋„์„ ์—ฐ์†์ ์œผ๋กœ ์Šค์บ” ํ›„ ์ฑ„๋„์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 
 (โ€ป Disable์ผ ๊ฒฝ์šฐ Single Conversion Mode๋กœ ๋™์ž‘ํ•˜๋ฉฐ ํ•˜๋‚˜์˜ ์ฑ„๋„์—์„œ ์Šค์บ” ํ›„ ํ•œ ๋ฒˆ๋งŒ ADC ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.)
 1.6 Continuous Conversion Mode
 ํ•œ๋ฒˆ ์ฑ„๋„์—์„œ ์ž…๋ ฅ ๋ฐ›์€ ํ›„ ์ž…๋ ฅ์„ ์ง€์†์ ์œผ๋กœ ๋ฐ›์„์ง€ ์„ค์ •ํ•œ๋‹ค.
 1.7 DMA Continous Requests 
 ADC ๊ฒฐ๊ณผ๊ฐ’์„ DMA๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋‹ฌํ•  ๊ฒƒ์ธ์ง€ ์„ ํƒ ์—ฌ๋ถ€
 1.8 ADC_Regular_ConversionMode
 Number Of Converison : ๋ช‡ ๊ฐœ๋ฅผ ๋ณ€ํ™˜ํ•  ๊ฒƒ์ธ์ง€
 Rank : ๋ณ€ํ™˜ ์ˆœ์„œ (ADC ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ๋‹ด๊ธฐ๋Š” ์ˆœ์„œ)
 Channel : ADC๋กœ ๋ณ€ํ™˜ํ•  ๊ฐ’์ด ์žˆ๋Š” ์ฑ„๋„์„ ์„ ํƒ
 Sampling Time : Resolution ๊ฐ’๋ณด๋‹ค ์ ๋‹นํžˆ ํฌ๊ฒŒ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
(โ€ป Sampling Time : ์ƒ˜ํ”Œ๋ง ์‹œ์  ๋™์•ˆ ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์‹œ๊ฐ„)

 

๐Ÿณ ์‹ค์Šต ๊ฒฐ๊ณผ

https://github.com/Tobbyvv/stm32-project/tree/main/adc

์™ธ๋ถ€ ์˜จ๋„ ์„ผ์„œ - F429zi ์—ฐ๊ฒฐ

์˜จ๋„์„ผ์„œ์˜ DATA ํ•€์„ PA5(CN7 10), PA6(CN7 12)์— ์—ฐ๊ฒฐ
VCC์™€ GND๋ฅผ ๊ฐ๊ฐ CN7 6, CN7 8์— ์—ฐ๊ฒฐํ•˜์˜€๋‹ค. 

 

DMA๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ADC ์™ธ๋ถ€ ์˜จ๋„ ์„ผ์„œ ๊ฐ’, ๋‚ด๋ถ€ ์žฅ์น˜ Vref ๊ฐ’, ๋‚ด๋ถ€ ์˜จ๋„ ์„ผ์„œ ๊ฐ’ ํ™•์ธ 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>

#include "main.h"
#include "app.h"

// ADC, DMA, UART ํ•ธ๋“ค๋Ÿฌ ๋ณ€์ˆ˜ ์„ ์–ธ
extern ADC_HandleTypeDef hadc1;	
extern DMA_HandleTypeDef hdma_adc1;
extern UART_HandleTypeDef huart3;
// ADC ์ฑ„๋„์—์„œ ๋ฐ›์€ ๊ฐ’ ์ €์žฅ์šฉ ๋ฐฐ์—ด ์„ ์–ธ
static volatile uint16_t adc_value[4];
// EXTI์—์„œ ๋ฐ›์€ ๊ฐ’ ์ €์žฅ์šฉ ๋ณ€์ˆ˜ ์„ ์–ธ
static volatile uint16_t exti_value = 0;

void app(void)
{
	// ADC ๋ณ€ํ™˜์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์— DMA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
    // CPU์˜ ๊ฐœ์ž… ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Œ
	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_value, 4);

	for (;;) { 
		HAL_Delay(100);
		// ADC ์˜จ๋„๊ฐ’๊ณผ EXTI ์ƒํƒœ ๊ฐ’์„ UART๋ฅผ ํ†ตํ•ด ์ถœ๋ ฅ
		printf("ExtUnitTemp = %d ExtUnitTemp = %d InternalTemp = %d Vref = %d ExtValue = %d\r\n",
		       adc_value[0], adc_value[1], adc_value[2], adc_value[3],
		       exti_value);
	}}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	exti_value = GPIO_Pin; //GPIO 13๋ฒˆ Pin์˜ ์ƒํƒœ๊ฐ’ 0 ๋˜๋Š” 1 ์ €์žฅ
}
int __io_putchar(int ch)
{
  HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff); // UART ์ถœ๋ ฅ
  return ch;
}

ADC ์˜จ๋„์„ผ์„œ ๊ฐ’, EXTI ๊ฐ’ ๊ฒฐ๊ณผ

1. ExUnitTemp : 4095
DHT11 ์˜จ๋„์„ผ์„œ๋Š” ์Šต๋„, ์˜จ๋„๋ฅผ ๋””์ง€ํ„ธ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„ผ์„œ์ด๋‹ค. A๋ผ๋Š” ๋””์ง€ํ„ธ ๊ฐ’์„ adc ๋ณ€ํ™˜ํ•˜๋ฉด ๊ทธ๋Œ€๋กœ A๋ผ๋Š” ๊ฐ’์ด
๋‚˜์˜ค๋‚˜ 4095๋ผ๋Š” ๊ฐ’์€ ์˜จ๋„ ๊ฐ’๋„ ์•„๋‹ˆ๊ณ  ์Šต๋„ ๊ฐ’๋„ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ADC ์ถœ๋ ฅ์„ ์‹ค์Šตํ•˜๋Š” ์ฑ•ํ„ฐ ์ด๋ฏ€๋กœ dht11์€ ๋”ฐ๋กœ ๋‹ค๋‹ค์Œ ์ฑ•ํ„ฐ์ฏค์— ๋ฐ์ดํ„ฐ์‹œํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด ์ œ๋Œ€๋กœ ์‹ค์Šตํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.
2. Internal Temp : 970
MCU์˜ ๋‚ด๋ถ€ ์•„๋‚ ๋กœ๊ทธ ์˜จ๋„์„ผ์„œ๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฐ’์„ ํ†ตํ•ด ์„ญ์”จ์˜จ๋„๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ ์˜จ๋„(°C) = (1.43 - 0.970) / 0.0043 + 25 ≈ 32.093°C ๊ฐ€ ๋‚˜์™”๋‹ค. ์‹ค์Šต ๋‹น์‹œ ์ฃผ๋ณ€ ์˜จ๋„๋Š”  28๋„ ์˜€์œผ๋ฏ€๋กœ MCU ๋‚ด๋ถ€ ๋ฐœ์—ด ๋“ฑ์œผ๋กœ ์ธํ•ด ๋” ๋†’์€ ์˜จ๋„๊ฐ€ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™๋‹ค. 
3. Vref : 1494
3.3V๋ฅผ ์˜จ๋„์„ผ์„œ์™€ ์—ฐ๊ฒฐํ•˜์˜€์œผ๋‚˜ 1.494V๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์œผ๋กœ ๋ณด์•„ dht11 ์˜จ๋„์„ผ์„œ ๋‚ด๋ถ€์—์„œ ๋‹ค์ด์˜ค๋“œ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์ „์••์œผ๋กœ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

4. ExtValue = 8192
GPIO ํ•€์˜ ์ƒํƒœ 0 ๋˜๋Š” 1์ด ๋‚˜์˜ฌ ์ค„ ์•Œ์•˜๋Š”๋ฐ 8192๋ผ๋Š” ์ˆซ์ž๊ฐ€ ๋‚˜์™”๋‹ค. ์›์ธ์€ ์ฐพ์ง€ ๋ชปํ•˜์˜€์œผ๋ฉฐ 8192๋Š” 2^13์œผ๋กœ ์‚ฌ์šฉํ•œ 13ํ•€๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

'embedded' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[stm32] I2C ํ†ต์‹  ์‹ค์Šต  (0) 2023.09.11
[stm32] I2C ํ†ต์‹  ์ด๋ก  ์ •๋ฆฌ  (0) 2023.09.11
[stm32] ADC & DMA ์ด๋ก  ์ •๋ฆฌ  (0) 2023.09.06
[stm32] UART ์‹ค์Šต  (0) 2023.08.30
[stm32] UART ์ด๋ก  ์ •๋ฆฌ  (0) 2023.08.16
profile

Toby's Study Blog

@Toby12

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!

๊ฒ€์ƒ‰ ํƒœ๊ทธ