با سلام،در این قسمت از آموزش ها به سراغ واحد ADC میکرو در حالت نرمال میرویم و در نهایت یک کد تست براش بنویسیم.
در ابتدا قبل از شروع این بخش از اموزش ها شما باید با پریفرالی به نام مبدل انالوگ به دیجیتال اشنایی داشته باشید.
بعد میتواند این آموزش رو نیز شروع کنید. اگر اشنایی ندارید لطفا آموزش های دوستان عزیزمون رو در این باره بخونید.
این دیاگرام داخلی واحد ADC هست:
اگرداخل دیتاشیت میکروی مورد استفاده اتون بروید میتوانید همه قابلیت های هر بخش رو ببنید برای مثال برای میکرو من قابلیت های اصلی ان به شکل زیر است:
خب بریم سراغ راه اندازیش در مود نرمال،طبق معمول اولین کار فعال کردن کلاک هر بخش مورد نیاز از میکرومون هست،در میکروی من واحد ADC متصل به باس APB2 هست،همچنین باید واحد GPIO را در حالت ورودی انالوگ گذاشت(این حالت پیش فرض هست اگر هم این کار رو انجام ندید فرقی در خروجی کار ندارد ولی برای اطمینان ما انجامش میدیم).
حالا کانفیگ واحد GPIO(این حالت به صورت پیش فرض انتخاب شده است).
1 | ADCCFG.ADC_ContinuousConvMode= ENABLE; |
با این کد ما واحد ADC را وادار میکنیم به صورت مداوم برای ما تبدیل را انجام بدهد،برای غیر فعال کردنش به راحتی آنرا DISABLE کنید.
1 | ADCCFG.ADC_DataAlign = ADC_DataAlign_Right; |
با این کد دیتا از سمت راست داخل ریجستر DATA پر میشود.
1 | ADCCFG.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; |
ما نیازی به تریگ کردن واحد ADC از خارج نداریم پس آنرا خاموش میکنیم.
1 | ADCCFG.ADC_Mode = ADC_Mode_Independent; |
مد واحد ADC را در حالت مستقل میگذاریم.
1 | ADCCFG.ADC_NbrOfChannel = 1; |
یک کانال برای تبدیل لازم داریم،پس آنرا یک میگذاریم.
1 | ADCCFG.ADC_OutputBuffer = DISABLE; |
در دو حالت باید bufferفعال باشد،یک زمانی که امپدانس ورودی خارجی بزرگ تر از ماکسیموم امپدانس ورودی واحد ADC باشد در این حالت روشن کردن بافر به دقیق تر بودن دیتا کمک میکند و پیشنهاد میشه سیکل نمونه برداری کمتر از T7.5 نباشد.
و حالت دوم زمانی که ریجستر TKENABLE یا TSVREFE یک باشند در این حالت به صورت پیشفرض بافر فعال میشود و خاموش هم نمیشود فقط باید در نظر داشته باشید که در این دو حالت اگر میخواهید ADC را کالیبره کنید حتما قبل از یک شدن این دو بیت باشد و بافر رو هم غیر فعال کنید.در اینجا هیچ کدوم از حالات بالا رو نداریم پس خاموشش میکنیم.
1 | ADCCFG.ADC_Pga = ADC_Pga_1; |
ریجستر PGA یک گین برای ورودی های ضعیف هستند و حتما باید بافر فعال باشد تا کار کند.که در این میکرو برای من 4 حالت دارد شاید برای برخی میکرو های دیگر فرق داشته باشد،این حالات به صورت زیر است:
ما نیازی بهش نداریم پس گین رو یک میذاریم.
1 | ADCCFG.ADC_ScanConvMode = DISABLE; |
ما کلا یک کانال داریم پس نیازی به Scan بین چند کانال نداریم،پس خاموشش میکنیم.
خب پس از تنظیم کردن آنها را بر واحد ADC اعمال میکنیم وسپس واحد ADC را فعال میکنیم،سپس پریفرال مورد استفاده که برای ما اینجا ADC1 هست را انتخاب میکنیم، سپس کانال مورد استفاده و نرخ نمونه برداری رو مشخص میکنیم و ADC1 را کالیبره میکنیم سپس دستور شروع تبدیل نرم افزاری را اعمال میکنیم،به صورت زیر:
پس از فعال کردن تبدیل میتوان با استفاده از تابع ADC_GetConversionValue(ADC1); مقدار دیتای ذخیره شده داخل ADC1 را خوند.به شکل زیر:
اگر همه کار هارو درست انجام داده باشید باید خروجی روی خروجی سریال دیباگ نمایش داده شود:
این هم کد کامل این قسمت آموزش:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | /********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0.0 * Date : 2021/06/06 * Description : Main program body. ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /* *@Note USART Print debugging routine: USART1_Tx(PA9). This example demonstrates using USART1(PA9) as a print debug port output. */ #include "debug.h" /* Global typedef */ static uint16_t adcvalue=0; /* Global define */ /* Global Variable */ /********************************************************************* * @fn main * * @brief Main program. * * @return none */ int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); SystemCoreClockUpdate(); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() ); printf("This is printf example\r\n"); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIOCFG; GPIOCFG.GPIO_Mode = GPIO_Mode_AIN; GPIOCFG.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA,&GPIOCFG); ADC_InitTypeDef ADCCFG; ADCCFG.ADC_ContinuousConvMode= ENABLE; ADCCFG.ADC_DataAlign = ADC_DataAlign_Right; ADCCFG.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADCCFG.ADC_Mode = ADC_Mode_Independent; ADCCFG.ADC_NbrOfChannel = 1; ADCCFG.ADC_OutputBuffer = DISABLE; ADCCFG.ADC_Pga = ADC_Pga_1; ADCCFG.ADC_ScanConvMode = DISABLE; ADC_Init(ADC1,&ADCCFG); ADC_Cmd(ADC1,ENABLE); ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_28Cycles5); ADC_StartCalibration(ADC1); Delay_Ms(50); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(1) { adcvalue=ADC_GetConversionValue(ADC1); printf("ADC Value is:%04d\r\n", adcvalue); Delay_Ms(150); } } |
در آموزش بعدش در مورد واحد DAC صحبت میکنیم،تا آموزش بعدی موفق و پیروز باشید.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.