اطلاعیه

Collapse
No announcement yet.

مشکل با ADC

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با ADC

    سلام دوستان.
    من تازه کار با آرم رو شروع کردم برا همین سوالاتم شاید خیلی ساده باشن. من پیشاپیش معذرت میخوام
    سه تا مشکلی که دارم.
    1- از برد اموزشی فروشگاه، STM32F103 استفاده میکنم و یه دونه سنسور LM35 و یدونه ولوم رو به ADC متصل کردم. با زیاد کردن ولوم، دما هم چند درجه زیاد میشه. این مشکل از کجاست؟ سخت افزاریه یا نرم افزاریه؟
    این دستورات من برا خوندن ADCهست:
    کد:
    [FONT=Yekan]hadc1.Init.NbrOfConversion=2;///////////channel of read[/FONT]        
    HAL_ADC_Init(&hadc1);/////channel init
            HAL_ADC_Start(&hadc1);//////start adc
            HAL_ADC_PollForConversion(&hadc1,10);/////time for ready
            temp=HAL_ADC_GetValue(&hadc1);//////////get value
            HAL_ADC_Stop(&hadc1);///////stop adc
            temp*=0.107;    
            
            hadc1.Init.NbrOfConversion=1;///////////channel of read
            HAL_ADC_Init(&hadc1);/////channel init
            HAL_ADC_Start(&hadc1);//////start adc
            HAL_ADC_PollForConversion(&hadc1,10);/////time for ready
            adc=HAL_ADC_GetValue(&hadc1);//////////get value
    [FONT=Yekan]HAL_ADC_Stop(&hadc1);///////stop adc[/FONT]
    کد:
    [FONT=Yekan]hadc1.Instance = ADC1;[/FONT]  
    hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
      hadc1.Init.ContinuousConvMode = DISABLE;
      hadc1.Init.DiscontinuousConvMode = DISABLE;
      hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
      hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc1.Init.NbrOfConversion = 2;
      HAL_ADC_Init(&hadc1);
    
    
        /**Configure Regular Channel 
        */
      sConfig.Channel = ADC_CHANNEL_1;
      sConfig.Rank = 2;
      sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
      HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    
    
        /**Configure Regular Channel 
        */
      sConfig.Channel = ADC_CHANNEL_0;
      sConfig.Rank = 1;
      sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
    [FONT=Yekan]  HAL_ADC_ConfigChannel(&hadc1, &sConfig);[/FONT]
    سوال دوم:
    برا ایجاد تاخیر با حلقه FOR، این دستور چند کلاک لازم داره؟
    کد:
    for(i=0;i<1000;++i);
    سوال سوم:
    میخوام تو وقفه خارجی به یه متغیر مقدار بدم و از اون متغییر تو تابعmainاستفاده کنم. من متغییرم رو تو تایع مین تعریف میکنم ولی وقتی میخوام تو وقفه خارجی اون رو بخونم، متغییر رو نمیشناسه.

    من با نرم افزار کیل کار میکنم و برا نوشتن تو تابع وقفه از کتابخونه#include "stm32f1xx_it.h" استفاده میکنم. آیا اصلا این روش درسته،

    ممنون از همه دوستان
    سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَةِ وَ الرُّوحِ

    (SMART DESIGN....(POWERFUL &amp; QUICK

    موفقیت اتفاقی نیست......بابای پولدار میخواد

    #2
    پاسخ : مشکل با ADC

    سلام به شما

    1_شماتیک اتصال ولوم و سنسور رو رسم کنید یا بگید
    2_ابتدا مقدار 0 به متغیر i وارد میشه ( 1 کلاک )
    بعدش شرط چک میشه( نمیدونم یک کلاک یا دو کلاک )
    اگه درست بود یک واحد به متغیر اضافه میشه ( یک کلاک )
    دوباره شرط چک میشه اگه درست بود یک واحد به متغیر اضافه میشه و . . .
    در کل حدود 2000 کلاک فکر کنم لازم داشته باشه
    3_کلا تو برنامه نویسی هرجا خواستی از متغیر استفاده کنی باید قبلش متغیر رو تعریف کنی

    سوالی داشتید در خدمتم
    ضمنا از این که به جمع دوستداران الکترونیک و میکروکنترلر به خصوص میکروکنترلر آرم پیوستید تبریک میگم

    موفق باشید
    آرزوی سرافرازی برای ایران عزیز . . .


    دیدگاه


      #3
      پاسخ : مشکل با ADC

      خروجی سنسور lm35 رو مستقیما به ورودیadcوصل کردم و ولوم رو هم همینطور.

      من به یه متغییری نیاز دارم که بتونم همزمان هم تو تابع مین و هم داخل روتین وقفه خارجی بتونم مقدار دهی کنم. من تو مین متغییر رو تعریف میکنم ولی تو وقفه نمیتونم از اون استفاده کنم. خطا میده میگه متغییر تعریف نشده.



      جدیدترین ویرایش توسط الفا11; ۲۱:۲۸ ۱۳۹۷/۰۱/۲۲.
      سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَةِ وَ الرُّوحِ

      (SMART DESIGN....(POWERFUL &amp; QUICK

      موفقیت اتفاقی نیست......بابای پولدار میخواد

      دیدگاه


        #4
        پاسخ : مشکل با ADC

        در مورد اندازه گیری دما با lm,35 اول این که اگه تغذیه این آی سی 5 ولت باشه خروجی ضرب در 100 میشه همون دمای اندازه گیری شده
        بنابر این شما با adc مقدار دیجیتال رو که میخونید با فرمول تبدیل به ولت که میکنید باید در عدد 100 ضرب کنید که بشه دما
        1_حالا من نمیدونم این وسط شما چیکار به ولوم دارید ؟؟؟ آیا ولوم به سنسور وصل کردید ؟؟؟
        2_درمورد متغیر هم عرض کردم خدمت شما که باید تنها قبل از وقفه تعریفش کنید . چرا این کارو انجام ندادی ؟؟؟؟
        جدیدترین ویرایش توسط rezamajdi; ۲۳:۴۷ ۱۳۹۷/۰۱/۲۲.
        آرزوی سرافرازی برای ایران عزیز . . .


        دیدگاه


          #5
          پاسخ : مشکل با ADC

          اگر متغیر که میخوای باهاش کار کنی تو یه فایل دیگه تعریف شده اینجا تو فایل مین تعریف شده شما میخوای ازش تو یه فایل دیگه استفاده کنی باید extern char val تعریف کنی
          کلمه extern رو بنویس قبل تعریف متغیر تو فایل دیگه

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          برای خوندن adc فرکانس adc رو تا جایی که میتونی کم کن نتیجه رو بگو

          دیدگاه


            #6
            پاسخ : مشکل با ADC

            سلام شما باید متغیرتون رو بیرون حلقه main و قبل از تابع وقفه تعریف کنید مثلا volatile float temp=0.00; و اینکه بعد از تبدیل مقدار دیجیتال به ولتاژ(آنالوگ) باید اون رو در عدد 100 ضرب کنید تا به دما تبدیل بشه. چون ولتاژ adc stm32 برابر 3.3ولت و adc اون 12بیتی هست ضریب تبدیل ما برای تبدیل مقدار دیجیتال به آنالوگ میشه 3.3/4095=0.00080586 که برابر ولتاژ معادل با دمای سنسور lm35 هست حالا اگر این مقدار رو در 100 ضرب کنید مقدار دما بدست میاد.

            دیدگاه


              #7
              پاسخ : مشکل با ADC

              نوشته اصلی توسط ehsanbagheri نمایش پست ها
              اگر متغیر که میخوای باهاش کار کنی تو یه فایل دیگه تعریف شده اینجا تو فایل مین تعریف شده شما میخوای ازش تو یه فایل دیگه استفاده کنی باید extern char val تعریف کنی
              کلمه extern رو بنویس قبل تعریف متغیر تو فایل دیگه

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              برای خوندن adc فرکانس adc رو تا جایی که میتونی کم کن نتیجه رو بگو
              سلام مجدد
              همون جور که راهنمایی کردید مشکل متغییر حل شد. باید متغییر رو از جنسextern انتخاب میکردم. ممنون بابت راهنمایی
              برا مشکلی که با آنالوگ به دیجیتال هم داشتم، با افزایشSAMPLETIMEمشکل بر طرف شد. ولی چرا با SAMPLETIMEهای پایین، adcجواب نمیده؟
              در ضمن شما گفتید عدد دریافتی از آنالوگ به دیجیتال رو در 100 ضرب کن تا دما رو بدست بیاری. ولی من عددی که از آنالوگ به دیجیتال میگیرم تو دمای تقریبا25 درجه برابر 250 هستش و باید تقسیم بر 10 بکنم تا دما رو بدست بیارم. اینجا رو هم راهنمایی بکنید.

              ممنون از همه دوستانی که راهنمایی کردن
              سُبُّوحٌ قُدُّوسٌ رَبُّ الْمَلَائِکَةِ وَ الرُّوحِ

              (SMART DESIGN....(POWERFUL &amp; QUICK

              موفقیت اتفاقی نیست......بابای پولدار میخواد

              دیدگاه


                #8
                پاسخ : مشکل با ADC

                سلام شما اون عدد دیجیتال (250) رو ابتدا باید ضرب کنید در (3.3/4095) تا تبدیل بشه به ولتاژ متناسب با دما بعد اونو در 100 ضرب میکنید تبدیل میشه به خود دما برای عدد مد نظر شما میشه :
                20.14 = 100 * (3.3/4095) * 250 که اینجا دما 20.14 بدست اومد.

                دیدگاه

                لطفا صبر کنید...
                X