এইচএল ব্যবহার করে এসটিএম 32 এডিসি রূপান্তর


10

আমি কীভাবে stm32 থেকে "নতুন" এইচএল লাইব্রেরিটি ব্যবহার করব তা শিখার চেষ্টা করছি।
আমি যখন সাধারণ এডিসি রূপান্তর করার চেষ্টা করি এটি কেবল একবারে কাজ করে তবে তা রূপান্তর বন্ধ করে দেয়। আমার ধারণা ধরণের রূপান্তর পতাকাটি সেট না হয়ে যায়। আমি STM32f429I ডিসকভারি বোর্ড ব্যবহার করছি, যা বোর্ডে STM32f429ZI রয়েছে।
নোট করুন যে আমি স্প্রিন্টফ সম্পর্কে খারাপ অভ্যাস হওয়া এবং বিঘ্নিত হয়ে এডিসি তৈরি করা ভাল, আমি জানি যে দয়া করে এটি উল্লেখ করবেন না, এটি প্রশ্নের সাথে প্রাসঙ্গিক নয়, আমি এখানে কেবল এইচএএল পরীক্ষা করছি।
সুতরাং প্রশ্নটি হল কেন ইওসি পতাকা সেট করা হয়নি বা এটি কাজ করতে আমি কী করতে পারি? গুগলিং খুব ভাল সহায়তা করছে না যেহেতু এইচএএল সম্পর্কে খুব কম ভাল উপকরণ আছে।

কোডটি এখানে:

__IO uint16_t ADCValue=0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);

int main(void)
{
  char str[15];

  /* Various initializations */

  HAL_ADC_Start(&hadc1);
  while (1)
  {

        if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
        {
            ADCValue = HAL_ADC_GetValue(&hadc1);
            sprintf(str, "%d", ADCValue);
            BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
        }

  }

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    ADCValue = HAL_ADC_GetValue(&hadc1);
}

আমি কিউবিএমএক্স দিয়েও প্রকল্পটি তৈরি করেছি, অ্যাডিসি কনফিগারেশনটি নিম্নলিখিত: এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা 1
আমি সমস্ত কিছু ডিবাগ করার চেষ্টা করেছি এবং দেখে মনে হচ্ছে যে প্রোগ্রামটি ইওসি পতাকাটির জন্য যাচাই করতে আটকে গেছে - এটি দেখায় যে এটি প্রদর্শিত হয়নি এবং তাই টাইপ করে ইওসিটি প্রদর্শিত হওয়ার অপেক্ষায় রয়েছে (তবে এটি কখনই সেট হয় না) এখানে কোডটি এখানে রয়েছে ডিবাগারে আটকে যায়:

/* Check End of conversion flag */
  while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC)))
  {
    /* Check for the Timeout */
    if(Timeout != HAL_MAX_DELAY)
    {
      if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
      {
        hadc->State= HAL_ADC_STATE_TIMEOUT;
        /* Process unlocked */
        __HAL_UNLOCK(hadc);
        return HAL_TIMEOUT;
      }
    }

উত্তর:


6

আপনার আসল কোডে রূপান্তর নির্বাচনের সমাপ্তিকে অক্ষম করুন।

 hadc1.Init.EOCSelection = DISABLE;

দেখা গেল যে #define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)মানটি সমান DISABLE। সুতরাং আসলে ইওসিলেকশনটি এমনটি কনফিগার করা উচিত: একাধিকবার এডিসি পোল করতে সক্ষম হতে।এখানে চিত্র বর্ণনা লিখুন

তারপরে আপনি এডিসিটি বন্ধ না করে এবং শুরু না করে অবিচ্ছিন্নভাবে ADC পড়তে পারেন:

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    ConfigureADC();

    HAL_ADC_Start(&hadc1);
    while(1)
    {
        if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
        {
            ADCValue = HAL_ADC_GetValue(&hadc1);
        }
    }
}

এইভাবে এটি আমার পক্ষে ভাল কাজ করেছে।

যেহেতু এইচএএল হ'ল একটি নতুন লাইব্রেরি তাই সেখানে প্রচুর সংস্থান খুঁজে পাওয়া যায় না তবে অসম্ভব নয়। আমি এই টিউটোরিয়াল থেকে অনেক কিছু শিখেছি , এটি ধাপে ধাপে সমস্ত সম্ভাব্য অ্যাডিসি ব্যবহারের প্রদর্শন করে; সাধারণ পোলিং থেকে শুরু করে বিঘ্ন এবং ডিএমএ ব্যবহার করে।


এইচএম ... ইওসিলেকশন অক্ষম করা এটিকে কাজ করে তোলে, তবে এর সংজ্ঞা থেকে এটি বলে যে - একক চ্যানেল রূপান্তরের শেষে বা সমস্ত রূপান্তরগুলির শেষে ইওসি পতাকা সেট করা আছে কিনা তা নির্দিষ্ট করে। এটি অক্ষম করা সংজ্ঞা দিয়ে সহায়তা করা উচিত নয় .. তবে এটি .... বিভ্রান্তিকর সাহায্য করে। আপনি কি জানেন কেন সঠিকভাবে এটি অক্ষম করা এটি কার্যকর করে? যাইহোক উত্তরের জন্য ধন্যবাদ
বিজ্ঞানসোমোবর

আমি কেবল এইচএএল শিখছি, তাই কারণটি আমি এখনও জানি না। এটি কেবল একটি অভিজ্ঞতা। আমি দেখতে পেয়েছি যে এইচএএল অনেকবার কনফিডিং হতে পারে।
বেনস কৌলিক্স

আমি সংজ্ঞায়িত মানগুলি যাচাই করে দেখেছি এবং #define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)যা অক্ষম হিসাবে একই, তাই অক্ষম প্রকৃতপক্ষে ADC_EOC_SEQ_CONV।
বেনস কৌলিক্স

1
ওহ, ঠিক আছে, সুতরাং এটি আক্ষরিক অক্ষম নয়। এটি উপলব্ধি করে, আগে এটি ADC_EOC_SINGLE_CONV ছিল যার অর্থ সম্ভবত এটি - এটি কেবল একবারে রূপান্তরিত হয় এবং ADC_EOC_SEQ_CONV ক্রমাগত রূপান্তর is আরও একটি রহস্য সমাধান হয়েছে :) ধন্যবাদ!
বিজ্ঞানসমোভার

হ্যাঁ, এটি হওয়া উচিত। :)
বেনস কৌলিক্স

2

এইচএম ... আমি রূপান্তরটি শেষ করতে HAL_ADC_Stop (& hadc1) ব্যবহার করে এমন কয়েকটি টিউটোরিয়াল পেয়েছি ... আমি এই টিউটোরিয়ালগুলি আগে দেখছিলাম এবং ভেবেছিলাম এটি বরং বর্বর উপায়, মনে হয় এটি পুরোপুরি অ্যাডিসিকে অক্ষম করে, তাই আমার যদিও সেখানে থাকা উচিত বিভিন্ন পদ্ধতি। তবে মনে হয়, এটি আসলে ভাল কাজ করে।
যদি এর থেকে আরও মার্জিত উপায় থাকে তবে উত্তর পোস্ট করতে আমরা স্বাগত জানাই, যেহেতু আমি মনে করি HAL_ADC_Stop () ব্যবহার করা অত্যন্ত ভয়াবহ, তবে শেখার উদ্দেশ্যে ব্যবহার করা যেতে পারে।

while (1)
  {
        HAL_ADC_Start(&hadc1);
        if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
        {
            ADCValue = HAL_ADC_GetValue(&hadc1);
                        sprintf(str, "%d", ADCValue);
                        BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
        }
        HAL_ADC_Stop(&hadc1);

  }

হাই, আমি এই পদ্ধতিটির সাথে একটি সমস্যা পেয়েছি, এটি আপনি একটি লট দ্বারা সর্বাধিক নমুনা হার অর্জন করতে নিষেধ করে, আপনার যদি দ্রুত এডিসি রূপান্তরগুলির প্রয়োজন হয় তবে এই পদ্ধতিটি ব্যবহার করার পরামর্শ দেওয়া হয় না।
রিচার্ড বামফোর্ড

2

আমি এটি যোগ করতে চাই আমার সেটআপের জন্য (নিউক্লিও-এইচ 743) এটি সেট করা যথেষ্ট ছিল না:

hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;

আমাকে ওভাররন সেটিংটিও সক্ষম করতে হয়েছিল:

hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;

এটি ছাড়াই এখনও এইচএএল_এডসি_পলফোর্ডকভার্সনটি অবরুদ্ধ করা ছিল। কেন এটি প্রয়োজনীয় ছিল তা আমি পুরোপুরি বুঝতে পারি না তবে এটি আমাকে ক্রমাগত মোডে পোল দেওয়ার অনুমতি দেয়।


0

এটি আমার পক্ষে কাজ করে, আশা করি এটি সাহায্য করবে:

if (HAL_ADC_Start(&hadc) != HAL_OK)
{
    /* Start Conversation Error */
    // Error_Handler();
}
if (HAL_ADC_PollForConversion(&hadc, 500) != HAL_OK)
{
    /* End Of Conversion flag not set on time */
    // Error_Handler();
    ADCValue=-1;
}
else
{
    /* ADC conversion completed */
    /*##-5- Get the converted value of regular channel ########################*/
    ADCValue = HAL_ADC_GetValue(&hadc);
}
HAL_ADC_Stop(&hadc);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.