HAL का उपयोग करके STM32 ADC रूपांतरण


10

मैं stm32 से "नया" HAL लाइब्रेरी का उपयोग करने का तरीका जानने की कोशिश कर रहा हूं।
जब मैं सरल एडीसी रूपांतरण करने की कोशिश करता हूं तो यह सिर्फ एक बार काम करता है, लेकिन फिर इसे परिवर्तित करना बंद हो जाता है। मुझे लगता है कि रूपांतरण ध्वज का अंत सेट नहीं होता है। मैं 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);
}

मैंने CubeMX के साथ प्रोजेक्ट भी बनाया, adc कॉन्फ़िगरेशन निम्नलिखित है: यहां छवि विवरण दर्ज करें

EDIT 1
मैंने सब कुछ डिबग करने की कोशिश की और ऐसा लगता है कि कार्यक्रम EOC ध्वज के लिए जाँच में फंस गया है - यह देखता है कि यह नहीं दिखाया गया है और इसलिए टाइमर जारी करता है कि EOC को दिखाने के लिए इंतज़ार कर रहा है (लेकिन यह कभी सेट नहीं होता है) यहाँ कोड है जहां यह है डिबगर में फंस जाता है:

/* 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। तो वास्तव में EOCSelection को कॉन्फ़िगर किया जाना चाहिए: ADC को कई बार परागित करने में सक्षम होने के लिए।यहां छवि विवरण दर्ज करें

फिर आप ADC को बिना रुके और 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);
        }
    }
}

इस तरह इसने मेरे लिए ठीक काम किया।

चूंकि एचएएल एक काफी नई लाइब्रेरी है, इसलिए इसमें बहुत सारे संसाधन नहीं हैं लेकिन यह असंभव है। मैंने इस ट्यूटोरियल से बहुत कुछ सीखा , यह सभी संभव एडीसी कदम से कदम का प्रदर्शन करता है; साधारण मतदान से, इंटरप्ट और डीएमए का उपयोग करने के लिए।


hm ... EOCSelection को अक्षम करने से यह काम करता है, लेकिन इसकी परिभाषा से यह कहता है - निर्दिष्ट करता है कि क्या EOC ध्वज एकल चैनल रूपांतरण के अंत में या सभी रूपांतरणों के अंत में सेट है। इसे अक्षम करने से परिभाषा में मदद नहीं मिलनी चाहिए .. बल्कि इससे .... भ्रमित होने में मदद मिलती है। क्या आप जानते हैं कि इसे अक्षम करने से यह काम क्यों करता है? वैसे भी जवाब के लिए धन्यवाद
विज्ञानसोमवार

मैं सिर्फ एचएएल भी सीख रहा हूं, इसलिए मुझे अभी तक इसका कारण नहीं पता है। यह सिर्फ एक अनुभव है। मैंने पाया कि एचएएल कई बार व्यंजन बना सकता है।
बेन्स कौलिक्स

मैंने परिभाषित मानों की जाँच की है और #define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)जो अक्षम के समान है, इसलिए अक्षम वास्तव में ADC_EOC_SEQ_CONV है।
बेन्स कौलिक्स

1
ओह, ठीक है, इसलिए यह सचमुच अक्षम नहीं है। यह समझ में आता है, पहले यह ADC_EOC_SINGLE_CONV था, जिसका अर्थ शायद सिर्फ इतना है - यह सिर्फ एक समय में परिवर्तित होता है, और ADC_EOC_SEQ_CONV निरंतर रूपांतरण है। एक और रहस्य सुलझाया :) धन्यवाद!
विज्ञानसमोवर

हां, यही होना चाहिए। :)
बेन्स कौलिक्स

2

हम्म ... मुझे कुछ ऐसे ट्यूटोरियल मिले, जिन्होंने कनवर्ज़न को समाप्त करने के लिए HAL_ADC_Stop (& hadc1) का उपयोग किया ... मैं पहले इन ट्यूटोरियल को देख रहा था और सोचा कि यह बल्कि बर्बर तरीका है, ऐसा लगता है कि यह ADC को पूरी तरह से निष्क्रिय कर देता है, इसलिए मुझे हालांकि होना चाहिए अलग विधि। लेकिन ऐसा लगता है, कि यह वास्तव में अच्छी तरह से काम करता है।
यदि यह करने का अधिक सुरुचिपूर्ण तरीका है, तो जवाब देने के लिए आपका स्वागत है, क्योंकि मुझे लगता है कि 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);

  }

नमस्ते, मुझे इस विधि के साथ एक समस्या मिली, यह अधिकतम नमूना दर को प्रतिबंधित करता है जिसे आप A LOT द्वारा प्राप्त कर सकते हैं, यदि आपको त्वरित ADC रूपांतरणों की आवश्यकता है तो इस विधि का उपयोग करने की अनुशंसा नहीं की जाती है।
रिचर्ड बैमफोर्ड

2

मैं जोड़ना चाहूंगा कि मेरे सेटअप के लिए (नाभिक-एच )४३) यह सेट करने के लिए पर्याप्त नहीं था:

hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;

मुझे ओवररन सेटिंग को भी सक्षम करना था:

hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;

इसके बिना HAL_ADC_PollForConversion अभी भी अवरुद्ध था। मुझे पूरी तरह से समझ नहीं आया कि यह क्यों आवश्यक था लेकिन यह मुझे निरंतर मोड में मतदान करने की अनुमति देता है।


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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.