اطلاعیه

Collapse
No announcement yet.

استفاده از دو کانال ADC

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

    استفاده از دو کانال 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);
    }
    }

    البته برنامه نه ارور میده و نه وارنینگ.
لطفا صبر کنید...
X