سلااااااام ببخشید بنده رو بابت یک تاخیر کوچیک یکساله، درگیر فارغ التحصیلی و خدمتو کلا اینطور چیزا بودم
و سعادت نداشتم کنار شما خوبان باشم؛ انشالله بعد این اموزش یدونه دیگه هم تو همین هفته میذارم و اگه زنده موندم بعدیشو دو ماه بعد میذارم
آموزش میکروکنترلر های arm سری stm32f10x جلسه 7
جلسه قبل ( پارسال ) ADC رو توضیح دادام؛ قراره امروز adc رو راه بندازیم و تمام
الان دیگه همتون حرفه ای شدین و میدونید که ما واسه راه اندازی adc اول باید یک پروژه مثل جلسات قبل درست کنیم و توش فایل های gpio ,adc,rcc رو اضافه کنید و یک استراکچر برای rcc , gpio بسازین؛ منم دیگه در مورد اینها صحبت نمیکنم که جسارتی بهتون نشه
کد برنامه :
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 |
#include "stm32f10x.h" GPIO_InitTypeDef GPIO_adc; ADC_InitTypeDef ADC_adc; int x; int main() { RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE ); GPIO_adc.GPIO_Mode = GPIO_Mode_AIN; GPIO_adc.GPIO_Pin = GPIO_Pin_0; GPIO_adc.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOB, &GPIO_adc ); ADC_adc.ADC_DataAlign = ADC_DataAlign_Right; ADC_adc.ADC_ContinuousConvMode = ENABLE; ADC_adc.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_None; ADC_adc.ADC_Mode = ADC_Mode_Independent; ADC_adc.ADC_NbrOfChannel = 1; ADC_adc.ADC_ScanConvMode = DISABLE; ADC_Init( ADC1, &ADC_adc ); ADC_RegularChannelConfig( ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5 ); ADC_Cmd( ADC1, ENABLE ); ADC_SoftwareStartConvCmd( ADC1, ENABLE ); while(1) { while( !ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC ) ); x = ADC_GetConversionValue(ADC1); } } |
توضیح کدهای برنامه :
خط 3 : استراکچر GPIO رو میسازیم.
خط 4 : و همچنینن استراکچر ADC رو.
خط 10 : کلاک ADC و پورت B، که پایه ADC بهش وصله رو روشن میکنیم.
خط 11 : چون میخوایم از ADC استفاده کنیم باید مود GPIO رو، روی GPIO_Mode_AIN تنظیم کنیم.
خط 12 : میخوایم کانال هشت ADC1 رو فعال کنیم که میشه پایه B0؛ اینو میتونید توی کیوب خیلی راحت متوجه بشید.
خط 15 : میپرسه دیتا رو از چپ بچینه و بافر رو پرکنه یا از راست که اینجا ما از راست رو مشخص کردیم.
خط 16 : اینجا اگه ContinuousConvMode رو فعال کنید ADC پیوسته میاد مقدار رو میخونه و تبدیل میکنه اگه غیر فعالش کنید فقط یک مرتبه مقدار ADC رو تبدیل میکنه و غیر فعال میشه.
خط 17 : شما میتونید کلاک ADC رو از بیرون از واحد ADC تامین کنید مثلا از تایمر بگیرید، که اینجا ما گفتیم کلاک خارجی نمیخوایم و از کلاک خود ADC میخوایم استفاده کنیم.
خط 18 : اگه یادتون باشه جلسه پیش ( پارسال rofl ) در مورد مود های ADC گفتم که اینجا مود Independent رو ما انتخاب کردیم.
خط 19 : میگیم از یک کانال ADC1 فعلا میخوایم استفاده کنیم.
خط 20 : اگه بخوایم از چند کانال یک ADC استفاده کنیم باید ScanConvMode رو فعال کنیم که انشالله بعدا میریم سراغش و یدونه پروژه ازش میذارم.
خط 22 : با استفاده از این تابع کانال مورد استفادمون و همچنین رنک و سمپل تایم ADC رو مشخص میکنیم، که اینجا یدونه بیشتر نداریم و میگیم میخوایم از کانال هشت استفاده کنیم و چون یدونه کانال فقط داریم میگیم اول همون کانال رو کانورت کنه مثلا دوتا کانال 1 و 2 رو میخواستیم استفاده کنیم، میتونستیم بگیم اول کانال 2 رو مقدارش رو بده بعد 1 رو.
خط 23 و 24 : این دوتا فانکشن بالا کلا ADC رو فعلا و اماده کار میکنن.
خط 28 : اینجا میایم فلگ ADC رو چک میکنیم و میگیم هر وقت کانورت کردن مقدار ADC کامل شد از تو حلقه while خارج شو.
خط 29 : و توسط این تابع مقدار کانورت شده ADC رو میگیریم و میریزیم توی متغیر x و تمام.
ببخشید اگه من یکم خلاصه توضیح میدم اگه ابهامی بود بگید تا یکم بیشتر توضیح بدم ؛ التماس دعا؛ خدانگه دار.
مهمان
سلام و خداقوت
من پنج شنبه ای یه پست گذاشتم الان خبری ازش نیست!!
در مورد تایمر و adc
وقتی تو اینتراپت تایمر فرمان خواندن adc رو میزارم همونجا گیر میکنه !!!
ولی وقتی همون خط خوندن adc رو تو حلقه while تابع main میزارم بدون هیچ اشکالی کار میکنه
void TIM3_IRQHandler(void){
if (TIM3->SR & (1<SR = (uint16_t)~(0x0001);
Iout= readADC1(5);
TIM3->SR &= ~(1UL << 0);}
}
مهمان
سلام
بسیار عالی
بالاخره قسمت 7 هم اومد … دلمون برای آموزش های سایتتون تنگ شده بود …
من می خواستم تو روتین اینتراپت تایمر یه نمونه adc بگیرم ولی همونجا گیر میکنه ادامه نمیده ؟؟!!
در حالی که همون خط رو تو حلقه while تابع main میزارم مشکلی نداره و اجرا میشه
void TIM3_IRQHandler(void){
if (TIM3->SR & (1<SR = (uint16_t)~(0x0001);
Iout= readADC1(5);
TIM3->SR &= ~(1UL << 0);
}}
مهمان
سلام من حدود یک هفته هس آرم رو با هدف انجام کارهای صنعتی شروع کردم و خوشحالم که آموزش هاتون رو آغاز کردید و امیدوارم ادامه پیدا کنه
تو فکر خرید هدر برد هستم شما چه هدر بردی رو برای شروع پیشنهاد می کنید؟
نویسنده این مطلب
سلام.دوست عزیز مرسی ممنون.انشالله ادامه میدم 😅.بنظر من هدر برد stm32f103c8t6این مینی هاشون خوبه.هم ارزون هم به هرچه دوست داشتی میتونی وصل کنی.