NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2971 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 3 از 3

موضوع: خواندن از دو کانال adc

  1. #1
    کاربر علاقه مند rebia آواتار ها
    تاریخ عضویت
    Sep 2011
    نوشته ها
    22
    تشکر
    22
    تشکر شده 15 بار در 10 پست

    Icon16 خواندن از دو کانال adc

    سلام دوستان

    اگه میشه راهنماییم کنید چطوری تو یه برنامه از دو تا کانال بخونم.

    البته از روی فیلم آموزشی یه کد نوشتم که از دو تا ADC بخونم و روی LCD نشون بدم و باقی کارا، تا جایی که شد خیلی دست تو کدای اصلی نبردم که خرابکاری نکنم، اما وقتی کد رو به این صورت مینویسم که یه تابع ADC_Read تعریف میکنم با آرگومان Channel و یه بار 6 قرارش میدم و یه بار 7، اول با آرگومان 6 میخونه و سر خط فراخونی تابع با آرگومان 7 میمونه.
    ینی دستورات تا این خط اجرا میشه current_value = ADC_Read(7); و دیگه اجرا نمیشه.


    کد:
    unsigned short ADC_Read(unsigned char channel)
    {
     unsigned int i;
     //-----------------------------
     if (channel == 6)
                LPC_PINCON->PINSEL0 |= 2 << 6;    /* p0.3 select as ADC0.6 */
     else if (channel == 7)
                LPC_PINCON->PINSEL0 |= 2 << 4;    /* p0.2 select as ADC0.7 */ 
     
     LPC_SC->PCONP |= (1 << 12);  // Enable power to AD block 
     LPC_ADC->ADCR |= 1<<channel; //select AD0.4 TO AD0.5 depend adc channel nomber
     LPC_ADC->ADCR |= 0x0100;     //        ADCLK is 12.5 MHz
     //LPC_ADC->ADCR |= 0x10000;    // BURST bit   1 << 16
     LPC_ADC->ADCR |= 0x200000;   //Power up,    1 << 21
     //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal.
                                            // 1 << 27
     //-----------------------------
     LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion
     do
     {
       switch (channel)
      {
        case 6:
           i = LPC_ADC->ADDR6; // Read A/D Data Register
        break;
        case 7:
           i = LPC_ADC->ADDR7; // Read A/D Data Register
        break;
      }
     }
     while ((i & 0x80000000) == 0); // Wait for end of A/D Conversion
     return (i >> 4) & 0x0FFF; // bit 4:15 is 10 bit AD value
    }
     
     
    int main (void) {
      
                 unsigned short current_value;
                 unsigned int l = 0;
                 unsigned int r = 0;
                 unsigned int m = 0;
                 char h[100];
                 char p[100];
       unsigned int n;
                LPC_GPIO0->FIODIR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10));
                LPC_GPIO0->FIOMASK = 0;
                LPC_GPIO0->FIOCLR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10));
               
                //LCD_4 BIT MODE
                lcd_init_4bit();
                SystemInit();
                command(0x01);
    lcd_putsf(" NavaBehdasht 2  ");
        Delay(10000);
                command(0x01);
                command(0x0c);
     
    while(1){
    l=0;                    
     
    for(n=0;n<=10;n++)
    {
    Delay(1000);
    current_value = ADC_Read(6);
     
     
    l=l+current_value;
    }                       
    l=l/10;
    sprintf(h,"%i",l);
    command(0x80);
    lcd_putsf("L:     ");
    command(0x82);                        
    lcd_putsf(h);
    delay(11000);
     
     
    r=0;
     
    for(n=0;n<=10;n++)
    {
    Delay(1000);
    current_value = ADC_Read(7);
     
     
    r=r+current_value;
    }                       
    r=r/10;
    sprintf(p,"%d",r);
        
                           
    command(0x88);
    lcd_putsf(" R:     ");
    command(0x8b);                        
    lcd_putsf(p);
    delay(11000);
     
    m=l-r;
    sprintf(p,"%i",m);
        
                           
    command(0xc0);
    lcd_putsf("   Diff:     ");
    command(0xc8);                        
    lcd_putsf(p);
    delay(11000);
    }
    }
    وقتیم به این صورت مینویسم و دو تا تابع تعریف میکنم یعنی یه تابع ADC_Read و یه تابع ADC_Read1 و هر کدومو جدا فراخونی میکنم هر دو رو میخونه ولی فقط یه بار، و حلقه بسته ای که گذاشتم که مرتب ADCها رو بخونم و بعد هر بار خوندن تو LCD نشون بدم این حلقه دیگه تکرار نمیشه.

    کد:
    unsigned short ADC_Read(unsigned char channel)
    {
     unsigned int i;
     //-----------------------------
     if (channel == 6)
                LPC_PINCON->PINSEL0 |= 2 << 6;    /* p0.3 select as ADC0.6 */
     else if (channel == 7)
                LPC_PINCON->PINSEL0 |= 2 << 4;    /* p0.2 select as ADC0.7 */ 
     
     LPC_SC->PCONP |= (1 << 12);  // Enable power to AD block 
     LPC_ADC->ADCR |= 1<<channel; //select AD0.4 TO AD0.5 depend adc channel nomber
     LPC_ADC->ADCR |= 0x0100;     //        ADCLK is 12.5 MHz
     //LPC_ADC->ADCR |= 0x10000;    // BURST bit   1 << 16
     LPC_ADC->ADCR |= 0x200000;   //Power up,    1 << 21
     //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal.
                                            // 1 << 27
     //-----------------------------
     LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion
     do
     {
       switch (channel)
      {
        case 6:
           i = LPC_ADC->ADDR6; // Read A/D Data Register
        break;
        case 7:
           i = LPC_ADC->ADDR7; // Read A/D Data Register
        break;
      }
     }
     while ((i & 0x80000000) == 0); // Wait for end of A/D Conversion
     return (i >> 4) & 0x0FFF; // bit 4:15 is 10 bit AD value
    }
     
    unsigned short ADC_Read1(unsigned char channel)
    {
     unsigned int i;
     //-----------------------------
     LPC_PINCON->PINSEL3 = 3 << 28;    /* p1.30 select as ADC0.4 */
     LPC_PINCON->PINSEL3 <<= ((channel-4)*2); //select AD0.4 & AD0.5 pin depend channel nomber
               
     LPC_SC->PCONP |= (1 << 12);  // Enable power to AD block 
     LPC_ADC->ADCR |= 1<<channel; //select AD0.4 TO AD0.5 depend adc channel nomber
     LPC_ADC->ADCR |= 0x0100;     //        ADCLK is 12.5 MHz
     //LPC_ADC->ADCR |= 0x10000;    // BURST bit   1 << 16
     LPC_ADC->ADCR |= 0x200000;   //Power up,    1 << 21
     //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal.
                                            // 1 << 27
     //-----------------------------
     LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion
     do
     {
       switch (channel)
      {
        case 4:
           i = LPC_ADC->ADDR4; // Read A/D Data Register
        break;
        case 5:
           i = LPC_ADC->ADDR5; // Read A/D Data Register
        break;
      }
     }
     while ((i & 0x80000000) == 0); // Wait for end of A/D Conversion
     return (i >> 4) & 0x0FFF; // bit 4:15 is 10 bit AD value
    }
     
     
    int main (void) {
      
                 unsigned short current_value;
                 unsigned int l = 0;
                 unsigned int r = 0;
                 unsigned int m = 0;
                 char h[100];
                 char p[100];
       unsigned int n;
                LPC_GPIO0->FIODIR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10));
                LPC_GPIO0->FIOMASK = 0;
                LPC_GPIO0->FIOCLR = ((1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)|(1<<10));
               
                //LCD_4 BIT MODE
                lcd_init_4bit();
                SystemInit();
                command(0x01);
    lcd_putsf(" NavaBehdasht 2  ");
        Delay(10000);
                command(0x01);
                command(0x0c);
     
    while(1){
    l=0;                    
     
    for(n=0;n<=10;n++)
    {
    Delay(1000);
    current_value = ADC_Read(6);
     
     
    l=l+current_value;
    }                       
    l=l/10;
    sprintf(h,"%i",l);
    command(0x80);
    lcd_putsf("L:     ");
    command(0x82);                        
    lcd_putsf(h);
    delay(11000);
     
     
    r=0;
     
    for(n=0;n<=10;n++)
    {
    Delay(1000);
    current_value = ADC_Read1(4);
     
     
    r=r+current_value;
    }                       
    r=r/10;
    sprintf(p,"%d",r);
        
                           
    command(0x88);
    lcd_putsf(" R:     ");
    command(0x8b);                        
    lcd_putsf(p);
    delay(11000);
     
    m=l-r;
    sprintf(p,"%i",m);
        
                           
    command(0xc0);
    lcd_putsf("   Diff:     ");
    command(0xc8);                        
    lcd_putsf(p);
    delay(11000);
    }
    }

    البته برنامه نه ارور میده و نه وارنینگ.
    ویرایش توسط rebia : 09-03-2016 در ساعت 15:14

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2014
    نوشته ها
    44
    تشکر
    0
    تشکر شده 63 بار در 22 پست

    پیش فرض

    سلام
    شما اگه میخواید از چندتا کانال adcاستفاده کنید بهتره از وقفه adc استفاده کنید اینطوری مشکلتون حل میشه.
    من خودم مداری رو بستم از همه adcها استفاده کردم و مشکلی نداشته.البته باید اینو در نظر داشته داشته باشی که کار کردن هرقسمت از میکرو ممکنه روی قسمت دیگه تاثیر بذاره.این هم به برنامه نویسی ربطی نداره یک مشکل سخت افزاریه که کارخونه سازنده باید حلش کنه.ومن به این مشکل زیاد برخوردمکه با ترفندهای برنامه نویسی و مدارهای جانبی سخت افزاری حلشون میکنم.

  4. #3
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    سلام
    اگر زمان بین خواندن لازم نیست پشت سر هم باشه به همان صورت نرم افزاری می شود چه با وقفه چه بی وقفه
    برای خواند پشت سر هم از مد burst می توان استفاده کرد.
    برای درگیر نشدن میکرو به خواندن پشت سر هم از dma می توان کمک گرفت.

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •