آموزش STM32آموزش های ARM

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

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

استفاده از ADC در میکروکنترلر STM32

یکی از ویژگی هایی که تقریبا در همه میکروکنترلر ها تعبیه شده، واحد آنالوگ به دیجیتال یا همان ADC است. این مبدل ها آنالوگ به دیجیتال میتوانند ولتاژ را از سنسور های آنالوگ مانند سنسور دما، شتاب سنج، جریان، فلکس و … بخوانند. در این آموزش STM32، می آموزیم چگونه از واحد adc در stm32 استفاده کنیم تا ولتاژ را با استفاده از Energia IDE بخوانیم. ما یک پتانسیومتر کوچک را به برد STM32 Blue Pill متصل می کنیم و ولتاژ متفاوتی را به پین ​​آنالوگ ارائه می دهیم ، ولتاژ را می خوانیم و آن را روی صفحه ال سی دی کاراکتری نمایش می دهیم.

فیلم زیر نحوه عملکرد پروژه تبدیل ADC در stm 32 را نشان میدهد.

مقایسه ADC در آردوینو و STM32

برد آردوینو ، حاوی 6 کانال (8 کانال در مینی و نانو ، 16 کانال در مگا) ، آنالوگ به دیجیتال 10 بیتی با دامنه ولتاژ ورودی 0V-5V است. این بدان معنی است که ولتاژهای ورودی بین 0 تا 5 ولت را به مقادیر عدد صحیح بین 0 تا 1023 می رساند. اکنون در میکروکنترلر STM32 ما 10 کانال 12 بیتی آنالوگ به دیجیتال با دامنه ورودی 0V -3.3V داریم. یعنی این ممیکروکنترلر مقدار آنالوگ ولتاژهای ورودی بین 0 تا 3.3 ولت را به مقادیر عدد صحیح بین 0 و 4095 تبدیل می کند.

آموزش آنالوگ به دیجیتال در STM32

ADC تعبیه شده در میکروکنترلرهای STM32 از اصل SAR (ثبت تقریبی پی در پی) استفاده می کند ، که توسط آن تبدیل در چند مرحله انجام می شود. تعداد مراحل تبدیل برابر است با تعداد بیت های مبدل ADC. هر مرحله توسط ساعت ADC هدایت می شود. هر ساعت ADC یک بیت را از نتیجه به خروجی تولید می کند. طراحی داخلی آنالوگ به دیجیتال در STM32 براساس تکنیک خازن تغییر یافته است.

اگر در زمینه STM32 تازه وارد هستید، مقاله روبرو را مشاهده کنید : STM 32 چیست؟ آموزش برنامه نویسی برد STM32 با آردوینو

وضوح 12 بیتی

این ADC دارای 10 کانال 12 بیتی ADC است. در اینجا اصطلاح 10 کانال حاکی از آن است که 10 پین ADC وجود دارد که با استفاده از آنها می توانیم ولتاژ آنالوگ را اندازه بگیریم. اصطلاح 12 بیتی حاکی از رزولوشن ADC است. 12 بیتی به معنای 2 به توان 12 است که 4096 است. این تعداد نمونه مراحل برای ADC ما است ، بنابراین دامنه مقادیر ADC ما از 0 تا 4095 خواهد بود. مقدار از 0 به 4095 افزایش می یابد.

ولتاژ / مرحله = ولتاژ مرجع / 4096 = 3.3/4096 = 8.056 برای هر واحد

VOLTAGE / STEP = REFERENCE VOLTAGE / 4096 = (3.3/4096= 8.056mV) per unit.

نحوه تبدیل یک سیگنال آنالوگ به قالب دیجیتال

مقادیر آنالوگ برای پروژه های ما باید به فرم دیجیتال تبدیل شوند. زیرا کامپیوتر ها فقط مقادیر باینری / دیجیتال (0 و 1) را ذخیره و پردازش میکنند. بنابراین سیگنال های آنالوگ مانند خروجی سنسور بر حسب ولت باید به مقادیر دیحیتال تبدیل شوند و تبدیل نیز باید دقیق باشد. وقتی یک ولتاژ آنالوگ ورودی به ورودی های آنالوگ به STM32 داده می شود ، مقدار آنالوگ را در یک متغیر عدد صحیح خوانده و ذخیره می کند. . مقدار آنالوگ ذخیره شده (0-3.3V) با استفاده از فرمول زیر به مقادیر عدد صحیح (0-4096) تبدیل می شود :

INPUT VOLTAGE = (ADC Value / ADC Resolution) * Reference Voltage

ولتاژ ورودی = (مقدار ADC / وضوح ADC) * ولتاژ مرجع

وضوح = 4096

ولتاژ مرجع = 3.3 ولت

پین های ADC در STM32F103C8T6

جزئیات پین های STM32
10 پین آنالوگ در STM32 از PA0 تا PB1 وجود دارد.

مدار پروژه راه اندازی ADC در برد STM32

شماتیک مدار مربوط به پروژه راه اندازی آنالوگ به دیجیتال STM32 در صتویر زیر نشان داده شده است.

مدار پروژه راه اندازی ADC

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

اتصالات بین STM32 و ال سی دی کاراکتری را مانند جدول زیر انجام دهید. همانطور که در تصویر میبیند، دو پتانسیومتر در مدار وجود دارد. یک پتانسیومتر برای تغییر ولتاژ و ارائه ورودی آنالوگ به STM 32 استفاده میشود.و پتانسیومتر دیگر برای تغییر کنتراست ال سی دی استفاده میشود. اتصالات بین LCD و STM 32 را مانند جدول زیر انجام دهید. منبع تغذیه STM32 از طریق منبع تغذیه USB از رایانه شخصی یا لپ تاپ تهیه می شود.

شماره پین LCD  نام پین LCD نام پین STM32
1 Ground Ground
2 VCC 5V
3 VEE پین پتانسیومتر
4 RS PB11
5 RW Ground
6 EN PB10
7 DB0 بدون اتصال
8 DB1 بدون اتصال
9 DB2 بدون اتصال
10 DB3 بدون اتصال
11 DB4 PB0
12 DB5 PB1
13 DB6 PC13
14 DB7 PC14
15 LED مثبت 5V
16 LED منفی Ground

قطعات مورد نیاز

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. ال سی دی کاراکتری 16*2
  3. پتانسیومتر 100 کیلو اهم
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

برنامه نویسی STM32 برای خواندن مقادیر ADC

در آموزش قبلی ما درباره برنامه نویسی STM32F103C8T6 با استفاده از درگاه USB آموختیم. بنابراین اکنون دیگر به یک پروگرامر FTDI احتیاج نداریم. نگران نباشید ، آن را از طریق درگاه USB STM32 به رایانه متصل کنید و برنامه ریزی را با ARDUINO IDE انجام دهید برنامه ریزی STM32 در ARDUINO IDE برای خواندن ولتاژ آنالوگ بسیار ساده است. این کار دقیقا مانند راه اندازی آنالوگ به دیجیتال در برد های آردوینو است و نیازی به تغییر جامپر روی برد STM32 نیست.

در این برنامه مقدار آنالوگ را می میخوانیم و سپس مقادیر آنالوگ و دیجیتال را روی صفحه LCD نمایش می دهید.

ابتدا پین های LCD را تعریف میکنیم. این قسمت معرفی میکند کدام پین stm32 به LCD متصل میشود. شما میتوانید این پین ها را مطابق نیاز خود اصلاح کنید یا از همین پین ها استفاده کنید.

const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;

در مرحله بعد، ما کتابخانه کریستال مایع که مربوط به نمایشگر ال سی در در Arduino است را فراخوانی میکنیم. این کتابخانه ارتباط stm 32 با lcd کاراکتری را بسیار ساده میکند.

#include <LiquidCrystal.h> 
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

در داخل تابع setup () ، فقط یک پیام مقدمه برای نمایش در صفحه LCD قرار می دهیم.

lcd.begin(16, 2); //از ال سی دی 16*2 استفاده میکنیم
lcd.clear(); //پاکسازی ال سی دی
lcd.setCursor(0, 0); //ردیف اول ستون اول
lcd.print("IRENX"); //نمایش این متن
lcd.setCursor(0, 1); //ردیف دوم ستون اول
lcd.print("STM32F103C8"); //نمایش این متن
delay(2000); //تاخیر 2 ثانیه ای
lcd.clear(); //پاکسازی ال سی دی
lcd.setCursor(0, 0);  //ردیف اول ستون اول
lcd.print("USING ADC IN");//نمایش این متن
lcd.setCursor(0,1); //ردیف دوم ستون اول
lcd.print("STM32F103C8");//نمایش این متن
delay(2000); //تاخیر 2 ثانیه ای
lcd.clear(); //پاکسازی ال سی دی

سرانجام ، در loop()، خواندن ولتاژ آنالوگ را که از پتانسیومتر به پین ​​PA7 وارد می شود ، شروع می کنیم. همانطور که قبلاً بحث کردیم ، میکروکنترلر یک دستگاه دیجیتالی است و نمی تواند مستقیماً سطح ولتاژ را بخواند. با استفاده از تکنیک SAR ، سطح ولتاژ بین 0 تا 4096 تبدیل می شود. برای دریافت این مقدار ADC، از خط زیر استفاده میکنیم.

int val = analogRead(A7); 

در اینجا تابع analogRead () برای خواندن مقدار آنالوگ پین مورد نظر استفاده می شود. سرانجام ما این مقدار را در متغیری به نام “Val” ذخیره می کنیم. نوع این متغیر عدد صحیح است زیرا ما فقط مقادیری از 0 تا 4096 دریافت خواهیم کرد تا در این متغیر ذخیره شوند.

مرحله بعدی محاسبه مقدار ولتاژ از مقدار ADC خواهد بود. برای این کار فرمول های زیر را داریم :

ولتاژ = (مقدار ADC / وضوح ADC) * ولتاژ مرجع

Voltage = (ADC Value / ADC Resolution) * Reference Voltage

ما می دانیم که وضوح ADC میکروکنترلر ما 4096 است. مقدار ADC در خط قبلی نیز یافت می شود و آن را در متغیری به نام val را ذخیره می کند. ولتاژ مرجع برابر با ولتاژ میکروکنترلر است. هنگامی که برد STM32 از طریق کابل USB تغذیه می شود ، ولتاژ 3.3 ولت است. همچنین می توانید ولتاژ کار را با استفاده از مولتی متر در سراسر Vcc و پین زمین روی تخته اندازه گیری کنید. بنابراین فرمول فوق مطابق شکل زیر در پرونده ما متناسب است

float voltage = (float(val)/4096) * 3.3;

پس از محاسبه مقدار و ولتاژ ADC ، تمام آنچه باقی مانده است نمایش نتایج در صفحه LCD است که می تواند با استفاده از خطوط زیر انجام شود

  lcd.setCursor(0, 0);   // ردیف اول ستون اول
  lcd.print("ADC Val:");
  lcd.print(val); //نمایش مقدار ADC
  lcd.setCursor(0, 1);   // ردیف دوم ستون اول
  lcd.print("Voltage:");
  lcd.print(voltage); //نمایش ولتاژ

کد کامل :

#include <LiquidCrystal.h> 
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; 
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); 
const int analogip = PA7;
void setup() 
{
  lcd.begin(16, 2); 
  lcd.clear(); 
  lcd.setCursor(0, 0);
  lcd.print("IRENX.IR");
  lcd.setCursor(0, 1);
  lcd.print("STM32F103C8"); 
  delay(2000); 
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print("USING ADC IN");
  lcd.setCursor(0,1); 
  lcd.print("STM32F103C8");
  delay(2000); 
  lcd.clear();
}
void loop()
{   
  int val = analogRead(PA7);
  float voltage = (float(val)/4096) * 3.3; 
  lcd.setCursor(0, 0); 
  lcd.print("ADC Val:");
  lcd.print(val);
  lcd.setCursor(0, 1); 
  lcd.print("Voltage:");
  lcd.print(voltage); 
}
5 (4 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

4 نظر

  1. سلام
    مقاله جالب و آموزنده ای بود
    از توضیحات خوبتون ممنونم
    یه سوال دارم اگر میکروکنترلر های stm32f با ولتاژ حدودی 1.8 الی 3.6 کار میکنند اونوقت نمیشه از قطعات و ماژول هایی که با 5 ولت کار میکنند اتصالات بگیرند و کارکنند
    فرضا من یه قطعه دارم که خروجی آنالوگش بین 0 تا 5 ولت هست و بر مبنای این خروجی قراره چیزی رو سنس کنم با توضیحاتی که در مورد stm32f گفتید پس اصلا نباید سراغ میکروکنترلرهای این خانواده برم درسته؟ و اگر راه حلی وجود داره آن چیه

    1. سلام عزیز، آنالوگ به دیجیتال داخلی STM32 تا 3.3 ولت رو جواب میده. میتونید از قطعه های خارجی ADC استفاده کنید تا آنالوگ به دیجیتال خارج از برد انجام بشه.

  2. سلام
    امکانش هست مطلبی درمورد پروتکل ارتباطی i2c با stm32f103 داخل سایت قرار بدید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *