راه اندازی ADC در STM32، رجیستری و HAL

توسط | 11 خرداد, 1400 | میکروکنترلر | 2 دیدگاه ها

راه اندازی ADC در STM32، استفاده از پیکربندی Independent، کانال تکی، تبدیل Discontinuous و کانال Regular، اتصالات لازم برای راه اندازی واحد ADC در STM32، نمونه کد رجیستری، نمونه کد ADC میکروکنترلر STM32 با HAL، خواندن از چند کانال ADC با توابع HAL، توابع HAL راه اندازی ADC
راه-اندازی-adc-stm32

راه اندازی ADC در STM32، آنچه که در این نوشته به شرح آن خواهیم پرداخت، به سادگی با مقداردهی به چند رجیستر انجام می شود. در این نوشته نحوۀ راه اندازی ADC میکروکنترلرهای STM32F1 را بیان می کنیم. و نتیجۀ آن را در یک LCD گرافیکی مشاهده می کنیم. در نوشته های پیشین راه اندازی ADC در AVR را دیدیم. در آن نوشته، واحد ADC میکروکنترلرهای AVR را راه اندازی کردیم. و نتیجۀ خواندن از چند کانال ورودی ADC را در LCD گرافیکی KS0108 نمایش دادیم. در این نوشته نیز از دو کانال ورودی ADC میکروکنترلر STM32F107VC، خروجی یک پتانسیومتر و یک فتوسل را می خوانیم. در نمونه کدی که بررسی خواهیم کرد، واحد ADC شمارۀ 1 این میکروکنترلر را راه اندازی می کنیم. میکروکنترلر STM32F107VC دو واحد ADC با رزولوشن 12 بیتی دارد و روش آن تقریب متوالی است. واحدهای ADC میکروکنترلرهای STM32F1 ویژگی ها و امکاناتی دارند که باعث به وجود آمدن مدهای عملیاتی متنوع می شوند. برای مثال در مد Dual، می توان از دو واحد ADC به صورت همزمان استفاده کرد. یا مدهای تبدیل Discontinuous و Continuous و کانال های تکی و چندگانه وجود دارد. همچنین دو نوع کانال Regular و Injected در ADC این میکروکنترلرها وجود دارد. که می توان از تلفیق تعداد واحدهای ADC و مدها و کانال ها و نوع تبدیل آنها، مدهای عملیاتی متنوع به وجود آورد. برای اطلاعات بیشتر دربارۀ مدها و انواع تبدیل و انواع کانال در ADC میکروکنترلرهای STM32، به نوشتۀ «اصطلاحات ADC در STM32» مراجعه نمایید.

در این نوشته به شرح پروژه های راه اندازی ADC میکروکنترلر STM32F107VC می پردازیم. یکی از پروژه ها را به صورت رجیستری در نرم افزار Keil و دیگری را با توابع HAL و با استفاده از نرم افزار STM32CubeMX و Keil نوشته ایم. هر دو نمونه کد در پیوست قرار دارند.

فیلم آموزش ARM STM32 مقدماتی

راه اندازی ADC در AVR               (فیلم آموزش AVR مقدماتی)

راه اندازی ADC در آردوینو           (فیلم آموزش آردوینو مقدماتی)

بلوک-دیاگرام-adc-stm32f1

تصویر 1 – پایه های ورودی و تغذیه و ولتاژ مرجع و کانال های Injected و Regular واحد ADC در STM32F1

بیان تمامی مدهای عملیاتی ADC این میکروکنترلرها و شرح آنها در یک نوشته نمی گنجد. بنابراین برای راه اندازی ADC در STM32 در این نوشته، به این صورت عمل می کنیم:

  • استفاده از مد Independent: یعنی تنها از یک واحد ADC استفاده می کنیم. که ما از ADC1 استفاده می کنیم. در مقابل، مد Dual وجود دارد که می توان همزمان از دو واحد ADC1 و ADC2 استفاده کرد.
  • استفاده از کانال تکی: یعنی در هر بار، تنها یکی از ورودی ها را می خوانیم. در مقابل، کانال های چندگانه وجود دارد. که می توان چند کانال ورودی را پشت سر هم خواند.
  • استفاده از مد تبدیل Discontinuous: یعنی برای هر بار خواندن از ورودی، فرمان شروع تبدیل داده می شود. تبدیل شروع می شود و پس از اتمام، برای تبدیل بعدی، دوباره باید فرمان شروع داده شود. این فرمان می تواند با یک کردن یک بیت به صورت نرم افزاری باشد. یا این که خروجی واحدهای تایمر یا پایه های ورودی وقفۀ خارجی، تحریک کنندۀ واحد ADC برای شروع تبدیل باشند. ما با یک کردن یک بیت، فرمان شروع تبدیل را می دهیم. در مقابل، مد Continuous وجود دارد. که در این مد، یک بار تبدیل شروع می شود و پس از اتمام، تبدیل بعدی به صورت اتوماتیک شروع می شود.
  • استفاده از کانال های Regular: که از بخش Regular واحد ADC استفاده می کنیم و نتیجۀ تبدیل را که در رجیستر DR قرار می گیرد، می خوانیم. در مقابل، کانال های Injected وجود دارد. این کانال ها برای تبدیل، اولویت بالاتری نسبت به کانال های Regular دارند. وقتی تبدیل برای کانال Injected شروع می شود، تبدیل برای کانال Regular تا اتمام تبدیل Injected، متوقف می شود.

در این نوشته از برد توسعۀ STM32F10xVxxx یوبرد استفاده می کنیم.

آموزش-مبدل-آنالوگ-دیجیتال-stm32f1

تصویر 2 – راه اندازی مبدل آنالوگ به دیجیتال STM32 سری F1 و نمایش در LCD گرافیکی KS0108

اتصالات لازم برای راه اندازی ADC در STM32

اتصالات لازم برای راه اندازی واحد ADC در STM32 به این صورت است:

  • پایۀ VDDA و VSSA به ترتیب تغذیه و زمین واحد ADC هستند. باید آنها را با در نظر داشتن ملاحظات سخت افزاری و محدوده های ولتاژ، به تغذیه و زمین دیجیتال میکروکنترلر متصل کرد. ولتاژ VDDA باید بین 2.4 تا 3.6 ولت باشد.
  • پایۀ VREF مثبت و VREF منفی پایه های ولتاژ مرجع ADC هستند. ولتاژ پایۀ VREF مثبت می تواند بین 4 ولت تا VDDA باشد. پایۀ VREF منفی هم باید به زمین آنالوگ (پایۀ VSSA) متصل شود. توجه داشته باشید که در برخی میکروکنترلرهای سری F1، پایه های VREF منفی و در برخی دیگر VREF مثبت و VREF منفی وجود ندارد. در این میکروکنترلرها، این پایه ها از داخل میکروکنترلر به VDDA و VSSA متصل شده اند.
  • خروجی های پتانسیومتر و فتوسل برای پروژۀ این نوشته، به ترتیب به کانال ورودی صفرم و ششم ADC متصل شده اند. که به ترتیب پایه های PA0 و PA6 هستند. در میکروکنترلرهای STM32 می توانیم کانال nام ADC را روی پایۀ PAn و PBn و PCn و … داشته باشیم. برای مثال می توانیم کانال ورودی دوم را روی PA2 و PB2 و PC2 و … داشته باشیم. یعنی هر کانال می تواند روی پورت های مختلف قرار گیرد. در این نوشته هر دو کانال روی پورت A هستند.

در این نوشته از برد توسعۀ STM32 یوبرد استفاده می کنیم. میکروکنترلر روی این برد در پروژه ای که بررسی می کنیم، STM32F107VC است. برای اتصالات، باید پین هدرهای نری روی برد را به این صورت به هم وصل کنیم:

  • اتصال VREF مثبت به تغذیۀ ADC: پایۀ 16 به 17؛
  • اتصال VREF منفی به زمین: پایۀ 14 به 15؛
  • اتصال خروجی پتانسیوتر به PA0: پایۀ 20 به 21؛
  • اتصال خروجی فتوسل به PA6: پایۀ 18 و 19.

اتصالات-برد-توسعه-یوبرد

تصویر 3 – اتصالات لازم برای راه اندازی ADC در STM32 و LCD گرافیکی KS0108 با برد توسعۀ STM32 یوبرد

نمونه کد رجیستری برای راه اندازی ADC در STM32

در این بخش نمونه کد رجیستری ADC در STM32 را تشریح می کنیم. خروجی پتانسیومتر و مدار فتوسل روی برد توسعه به ترتیب به کانال های ورودی صفرم و ششم ADC متصل اند. تغذیۀ پتانسیومتر و فتوسل 3.3 ولت است و ولتاژ خروجی آنها بین صفر تا 3.3 ولت تغییر می کند. ولتاژ مرجع ADC برابر 3.3 ولت و رزولوشن آن 12 بیتی است. همچنین ولتاژ خروجی پتانسیومتر و شدت نور را بر حسب درصد، روی یک LCD گرافیکی KS0108 نمایش می دهیم. در ابتدا تعدادی کتابخانه را فراخوانی می کنیم. کتابخانۀ stdio.h برای استفاده از تابع sprint است که برای تبدیل داده ها به رشته از آن استفاده می کنیم. کتابخانۀ gpio.h نیز هم در کتابخانۀ LCD گرافیکی مورد استفاده قرار می گیرد و هم در طول برنامه. برای تبدیل دادۀ ADC به ولتاژ و درصد شدت نور، از دو تابع voltage formula و photocell formula استفاده می کنیم. مقادیر 3.3 و 4095 و 40.95 در این فرمول ها از این روست که ولتاژ مرج 3.3 ولت است و ADC دارای رزولوشن 12 بیتی است.

GPIOدر STM32

#include <stm32f10x.h>
#include <stdio.h>
#include "Libs/gpio.h"
#include "Libs/delay.h"
#include "Libs/GlcdKs108.h"

float voltage_formula(unsigned int adc_out_value)
{
	// v = (digital_output * vref) / ((2^resolution)-1)
	return ((float)((adc_out_value * 3.3) / 4095.0));
}

unsigned int photocell_formula(unsigned int adc_out_value)
{
	// out for absolute darkness(0%) = 0 , for full light(100%) = 4095
	return (unsigned int) (adc_out_value/40.95);
}

پیکربندی ADC و LCD گرافیکی KS0108

در تابع main پس از تعریف یک رشته و دو متغیر، با مقداردهی به رجیستر APB2ENR، کلاک واحدهای ADC1 و AFIO را فعال می کنیم. کلاک AFIO را برای مقداردهی به رجیستر MAPR فعال کرده ایم. با مقداردهی به رجیستر MAPR، برای پروگرام کردن  STM32، ارتباط JTAG را غیر فعال و ارتباط SWD را فعال می کنیم. سپس تابع delay set cpu clock را فراخوانی می کنیم. این تابع در کتابخانۀ delay.h قرار دارد و ورودی آن، فرکانس کلاک CPU است. فرکانس کلاک CPU همان مقدار پیش فرض یعنی 8 مگاهرتز است.

کلاک-apb2-cpu

تصویر 4 – بخشی از دیاگرام کلاک STM32F107VC و فرکانس کلاک CPU و APB2

در ادامه مد پایه های PA0 و PA6 را روی Input analog تنظیم می کنیم. سپس به راه اندازی ADC در STM32 می پردازیم. ابتدا بیت 11 رجیستر CR1 واحد ADC را یک می کنیم. با این کار مد Discontinuous را برای کانال های Regular فعال کرده ایم. از رجیستر CR2 بیت 20 را به منظور فعال کردن منبع تحریک خارجی یک می کنیم. منظور از منبع تحریک خارجی، یکی از منابع تحریک خارج از واحد ADC است. که یا می تواند خروجی های واحدهای تایمر باشد، یا ورودی یک وقفۀ خارجی و یا یک کردن یک بیت از رجیسترهای ADC (تحریک نرم افزاری). با یک کردن این بیت و بیت 11 رجیستر CR1، مد تبدیل، Discontinuous است. همچنین بیت های 17 تا 19 را که تعیین کنندۀ نوع تحریک است، مقدار می دهیم. این سه بیت را یک کرده ایم، پس منبع تحریک، یک شدن بیت SWSTART است. که بیت 22 رجیستر CR2 است. بیت صفرم رجیستر CR2 را نیز به منظور فعال کردن واحد ADC، یک کرده ایم. در ادامه توابع راه اندازی LCD گرافیکی KS0108 با STM32 را می آوریم. رشتۀ UBOARD را به مدت دو ثانیه نمایش می دهیم و سپس آن را پاک می کنیم.

int main(void)
{
	char LcdStr[20] , counter=0;
	unsigned int adc_data;
	
	RCC->APB2ENR |= RCC_APB2ENR_ADC1EN | RCC_APB2ENR_AFIOEN ;
	AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
	
	delay_set_cpu_clock(8000000);
	
	gpio_config(pa_0, input_analog, 2);
	gpio_config(pa_6, input_analog, 2);
	
	ADC1->CR1 |= (1<<11);
	ADC1->CR2 |= (1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<0);
	

	glcd_on();
	glcd_clear();
	glcd_puts((uchar*)"UBOARD",17,2,0,2,0);
	delay_ms(2000);
	glcd_clear();

راه-اندازی-ks0108-stm32f1

تصویر 5 – نتیجۀ راه اندازی LCD گرافیکی KS0108 با STM32F107VC روی برد توسعۀ یوبرد

خواندن از کانال های ورودی ADC

در راه اندازی ADC در STM32 در این نوشته، قصد داریم از کانال تکی استفاده کنیم. و هر بار یکی از کانال های صفرم و ششم را بخوانیم. بنابراین باید به بیت های L در رجیستر SQR1، مقدار صفر  بدهیم. این بیت ها به صورت پیش فرض صفر هستند و آنها را تغییر نمی دهیم. بنابراین در هر بار، تبدیل تنها برای یک کانال آغاز و انجام می شود. این تبدیل، برای کانالی است که ما آن را در بیت های SQ1 از رجیستر SQR3، تعیین می کنیم. در حلقۀ while ابتدا عدد صفر را (که بیانگر کانال شمارۀ صفر است) در بیت های SQ1 قرار می دهیم. سپس بیت SWSTART را یک می کنیم. تبدیل برای کانال صفرم آغاز می شود و با اتمام تبدیل، بیت یکم رجیستر SR یعنی بیت EOC یک می شود. در حلقۀ while بدون دستور، این بیت را چک می کنیم. با یک شدن این بیت، که به معنی اتمام تبدیل است، برنامه از حلقۀ while خارج می شود. سپس مقدار رجیستر DR را که مقدار تبدیل شده است، در ورودی تابع فرمول ولتاژ قرار می دهیم. خروجی این تابع را در sprintf قرار می دهیم و در سطر بعد، ولتاژ خروجی پتانسیومتر را نمایش می دهیم. در ادامه به بیت های SQ1 مقدار 6 را می دهیم و بیت SWSTART را یک می کنیم. تبدیل برای کانال ششم آغاز می شود و پس از اتمام، مقدار رجیستر DR را در ورودی تابع فرمول فتوسل قرار می دهیم. در ادامه شدت نور را بر حسب درصد در LCD نمایش می دهیم.

while(1)
{
	ADC1->SQR3 = 0 ;
	ADC1->CR2 |= (1<<22); //Start regular conversion
	while ((ADC1->SR & (1<<1)) != (1<<1));
		
	glcd_clear();
	sprintf (LcdStr , "Vpot =  %1.2fv ", voltage_formula(ADC1->DR));
	glcd_puts((uchar*)LcdStr,0,20,0,1,0);

	ADC1->SQR3 = 6 ;
	ADC1->CR2 |= (1<<22); //Start regular conversion
	while ((ADC1->SR & (1<<1)) != (1<<1));
		
	sprintf (LcdStr , "Light = %d%%", photocell_formula(ADC1->DR));
	glcd_puts((uchar*)LcdStr,0,50,0,1,0);
	delay_ms(1000);
}

راه-اندازی-رجیستری

تصویر 6 – نتیجۀ راه اندازی ADC در STM32، نتیجۀ نمونه کد رجیستری

نمونه کد HAL برای راه اندازی ADC در STM32

برای ایجاد نمونه کد ADC در STM32 با HAL، از نرم افزار STM32CubeMX استفاده می کنیم. ابتدا پایه های متصل به LCD گرافیکی را در بخش Pinout and configuration در مد GPIO Output تنظیم می کنیم. در بخش GPIO نیز برچسب های مربوط به این پایه ها را به این صورت قرار می دهیم:

GLCD_D0
GLCD_D1
GLCD_D2
GLCD_D3
GLCD_D4
GLCD_D5
GLCD_D6
GLCD_D7
GLCD_CS1
GLCD_CS2
GLCD_DI_RS
GLCD_RW
GLCD_EN

بسته به اتصالات LCD گرافیکی، هر یک از این عبارات را در بخش User label پایه ها قرار می دهیم. دقت شود که دقیقاً از همین Labelها استفاده کنیم. زیرا در کتابخانۀ LCD گرافیکی، از همین Labelها استفاده شده است. تنظیمات مد پایه ها را تغییر نمی دهیم. و همان مد پیش فرض یعنی Output push-pull را برای آنها در نظر می گیریم. در بخش SYS نیز دیباگ را روی Serial wire قرار می دهیم.

تنظیمات-stm32cubemx

تصویر 7 – تنظیمات پایه های متصل به LCD و انتخاب SWD برای دیباگ در نرم افزار STM32CubeMX

در بخش ADC1 نیز از قسمت Mode، ورودی های صفرم و ششم را انتخاب می کنیم. و در بخش Configuration، تنظیمات پیش فرض را تغییر نمی دهیم. می بینیم که پس از انتخاب ورودی ها، پایه های PA0 و PA6 در مد آنالوگ و به عنوان ورودی های ADC1 تنظیم می شوند. در بخش Clock configuration تنظیمات پیش فرض را تغییر نمی دهیم. در این حالت کلاک CPU و کلاک واحد ADC برابر 8 مگاهرتز خواهد بود. در بخش Project manager نام و مسیر پروژه را تعیین می کنیم. همچنین در قسمت Toolchain / IDE، گزینۀ MDK-ARM را اتخاب می کنیم. در نهایت روی Generate code کلیک می کنیم تا پروژه در نرم افزار Keil ساخته شود. پروژۀ Keil را باز می کنیم. همان طور که خواهیم دید، برای استفاده از دو کانال ADC با توابع HAL، در مدها و حالاتی که در برنامۀ رجیستری داشتیم، باید تغییراتی ایجاد کنیم. دقت شود که کتابخانۀ LCD گرافیکی در این پروژه، با آنچه در پروژۀ رجیستری استفاده می کنیم، متفاوت است.

تنظیمات-مبدل-آنالوگ-دیجیتال-stm32cubemx

تصویر 8 – راه اندازی ADC در STM32، تنظیمات واحد ADC در STM32CubeMX

خواندن چند کانال ADC در STM32 با توابع HAL

در راه اندازی ADC در STM32 با توابع HAL، برای خواندن از چند کانال ADC، باید تغییراتی ایجاد کنیم. در این صورت با اجرای تابع HAL ADC Get Value، می توانیم مقدار تبدیل شدۀ ورودی تعیین شده را بخوانیم. توابع زیر را به برنامه اضافه می کنیم:

/* USER CODE BEGIN 4 */
void adc_select_ch0(void)
{
		ADC_ChannelConfTypeDef sConfig = {0};
	  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
	  */
	  sConfig.Channel = ADC_CHANNEL_0;
		sConfig.Rank = 1;
		sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
	
	  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
	  {
	    Error_Handler();
	  }
}

void adc_select_ch6(void)
{
		ADC_ChannelConfTypeDef sConfig = {0};
	  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
	  */
	  sConfig.Channel = ADC_CHANNEL_6;
		sConfig.Rank = 1;
		sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
	
	  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
	  {
	    Error_Handler();
	  }
}

قبل از حلقۀ while، توابع مربوط به راه اندازی LCD گرافیکی را فراخوانی می کنیم. در حلقۀ while نیز ابتدا تابع adc select ch0 را اجرا می کنیم. در سطر بعد تابع HAL ADC Start را اجرا می کنیم تا تبدیل برای کانال صفرم آغاز شود. ورودی این تابع اشاره گر به متغیری است که در ابتدای فایل main به این صورت تعریف شده است:

ADC_HandleTypeDef hadc1;

که ADC_HandleTypeDef یک تایپ دف از استراکچر مربوط به ADC در کتابخانۀ stm32f1xx_hal_adc.h است. تابع HAL ADC Poll For Conversion را در یک if قرار می دهیم. ورودی اول این تابع همان اشاره گر مذکور است. ورودی دوم آن نیز یک زمان بر حسب میلی ثانیه است که اتمام تبدیل در این زمان بررسی می شود. در صورتی که تبدیل به اتمام برسد، خروجی این تابع صفر می شود. بنابراین دستورهای if اجرا می شود و مقدار ولتاژ در LCD نمایش داده می شود. برای خواندن مقدار تبدیل شده هم از تابع HAL ADC Get Value استفاده می کنیم. که دراینجا آن را در ورودی تابع فرمول ولتاژ قرار داده ایم. سپس تابع HAL ADC Stop را اجرا می کنیم. برای کانال ششم هم به همین ترتیب عمل می کنیم. و پس از نمایش درصد شدت نور، یک تأخیر یک ثانیه ای ایجاد می کنیم.

  /* USER CODE BEGIN WHILE */
  glcd_on();
  glcd_clear();
  glcd_puts((uchar*)"UBOARD",17,2,0,2,0);
  HAL_Delay(2000);
  glcd_clear();
  
  while (1)
  {
	  adc_select_ch0();
	  HAL_ADC_Start(&hadc1);
	  if(HAL_ADC_PollForConversion(&hadc1,10) == 0)
	  {
		  glcd_clear();
  sprintf (lcd_str , "Vpot =  %1.2fv ",
voltage_formula(HAL_ADC_GetValue(&hadc1)));
		  glcd_puts((uchar*)lcd_str,0,20,0,1,0);
	  }
	  HAL_ADC_Stop(&hadc1);
	  
	  adc_select_ch6();
	  HAL_ADC_Start(&hadc1);
	  if(HAL_ADC_PollForConversion(&hadc1,10) == 0)
	  {
  sprintf (lcd_str , "Light = %d%%",
photocell_formula(HAL_ADC_GetValue(&hadc1)));
		  glcd_puts((uchar*)lcd_str,0,50,0,1,0);
	  }
	  HAL_ADC_Stop(&hadc1);
	  
	  HAL_Delay(1000);
	  
	  /* USER CODE END WHILE */

	  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  }

راه-اندازی-hal-stm32cubemx

تصویر 9 – نتیجۀ راه اندازی ADC در STM32، نتیجۀ نمونه کد توابع HAL

نتایج راه اندازی ADC در STM32

  1. ADC در میکروکنترلرهای STM32 سری F1، دارای رزولوشن 12 بیتی هستند و روش آنها تقریب متوالی است.
  2. راه اندازی مبدل آنالوگ به دیجیتال در STM32، در صورتی که از مد Independent و کانال تکی و مد تبدیل Discontinuous و کانال های Regular استفاده کنیم، به سادگی میسر می شود.
  3. واحدهای ADC میکروکنترلرهای STM32 ویژگی ها و امکاناتی دارند که با تلفیق آنها می توان مدهای عملیاتی متنوعی ایجاد کرد.
  4. برای راه اندازی ADC میکروکنترلرهای STM32، لازم است اتصالات به این صورت باشد: پایه های VDDA و VSSA را باید با ملاحظات سخت افزاری، به ترتیب به ولتاژ تغذیۀ ADC و ولتاژ زمین متصل کرد؛ پایه های VREF مثبت و VREF منفی را نیز در صورت وجود باید به ترتیب به ولتاژ مرجع ADC و زمین آنالوگ متصل کرد.
  5. هنگام راه اندازی واحد ADC در میکروکنترلرهای STM32، پایه های ورودی باید در مد آنالوگ قرار گیرند.
  6. برای تنظیم مد Discontinuous باید بیت 11 رجیستر CR1 و بیت 20 رجیستر CR2 را یک کرد.
  7. برای انتخاب تحریک نرم افزاری (یک کردن بیت SWSTART)، باید بیت های 17 تا 19 رجیستر CR2 را یک کرد. پس از یک کردن این بیت ها، هرگاه بیت SWSTART یک شود، تبدیل آغاز می شود.
  8. برای استفاده از کانال تکی، باید به بیت های L رجیستر SQR1 مقدار صفر داد. همچنین شمارۀ کانالی را که قرار است خوانده شود، باید در بیت های SQ1 رجیستر SQR3 نوشت.
  9. با اتمام تبدیل کانال های Regular، بیت EOC (مخفف End Of Conversion) از رجیستر SR یک می شود. و مقدار تبدیل شده در رجیستر DR قرار می گیرد.
  10. برای خواندن از چند کانال ADC در استفاده از توابع HAL، مطابق پیکربندی های مورد نظر در این نوشته، باید تغییراتی در پیکربندی ADC اعمال شود. در پروژۀ این نوشته، این تغییرات در توابع تغییر کانال ADC قرار دارند.
  11. در استفاده از توابع HAL، اتمام تبدیل ADC را می توان با اجرای تابع HAL ADC Poll For Conversion بررسی کرد. همچنین می توان با تابع HAL ADC Get Value، مقدار تبدیل شده را خواند. توابع دیگر مورد استفاده، HAL ADC Start و HAL ADC Stop هستند.

رضا بداغی

رضا بداغی

عضو هیئت مدیره یوبرد، طراح و برنامه نویس سیستم های دیجیتال مبتنی بر میکروکنترلر، طراح PCB و مدرس آموزش های میکروکنترلر، طراحی PCB و برنامه نویسی میکروکنترلر

آموزش میکروکنترلرهای ARM سری STM32 یوبرد

آموزش میکروکنترلرهای AVR یوبرد

آموزش میکروکنترلرهایARM سری LPC یوبرد

آموزش Arduino یوبرد

خدمات برنامه نویسی میکروکنترلر یوبرد

راه-اندازی-dac-stm32

راه اندازی DAC در STM32

راه اندازی DAC در STM32، ویژگی های DAC در میکروکنترلرهای STM32F1، بلوک دیاگرام DAC در STM32، اتصالات راه اندازی DAC در میکروکنترلر STM32F107VC، نمونه کد رجیستری راه اندازی واحد DAC در میکروکنترلرهای STM32F1، ساخت موج سینوسی با STM32، راه اندازی مبدل دیجیتال به آنالوگ STM32 با توابع HAL

راه-اندازی-سون-سگمنت-با-آردوینو

راه اندازی سون سگمنت با آردوینو

راه اندازی سون سگمنت با آردوینو UNO، راه اندازی سون سگمنت 4 تایی آند مشترک با آردوینو، اتصال سون سگمنت به آردوینو، کتابخانۀ سون سگمنت برای آردوینو، نمونه کد راه اندازی سون سگمنت، نمایش اعداد در سون سگمنت 4 تایی، نکات راه اندازی سون سگمنت

راه-اندازی-adc-در-آردوینو

راه اندازی ADC در آردوینو

راه اندازی ADC در آردوینو، راه اندازی LCD گرافیکی KS0108 با کتابخانۀ U8g2، اتصالات لازم برای راه اندازی ADC و LCD گرافیکی KS0108، نمونه کد راه اندازی ADC آردوینو، فرمول محاسبۀ دما با TMP36، راه اندازی سنسور دما با آردوینو، راه اندازی فتوسل (LDR) با آردوینو

2 دیدگاه ها

  1. درود بر شما . آدم دیتاشیتو میخونه گیج میشه که چی کار باید بکنه دست تون درد نکنه بابت این مطلب

    پاسخ
    • سلام. خواهش میکنم. زنده باشید

      پاسخ

یک دیدگاه بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است