اطلاعیه

Collapse
No announcement yet.

خواندن از دو کانال ADC

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

    خواندن از دو کانال ADC

    سلام به مهندسای عزیز

    آقا یه سوال تخصصی دارم:
    یه برنامه نوشتم که از سنسور بخونم و رو ال سی دی کاراکتری نشون بدم ولی حالا میخوام تو همین برنامه از یه ADC دیگه هم بخونم ینی یه سنسور دیگه هم وصل کنم و یه بار ازین بخونم و یه بار از اولیه. ولی نمیدونم چجوری یه ADC دیگه رو باید تنظیماتشو انجام بدم و ازش بخونم.
    ممنون میشم راهنمایی کنید.
    اگه فایل برنامه نیازه پلود میکنم.
    کد برناممم اینه:
    کد:
    #include "LPC17xx.h"
    #include <stdio.h>
    //DB4=PORT0.4	 DB5=PORT0.5	DB6=PORT0.6	 DB7=PORT0.7
    
    #define RS (1<<9) //PORT0.9
    #define E  (1<<8) //PORT0.8
    #define RW (1<<10) //PORT0.10 
    
    #define d1 300
    #define d2 50000
    
    void delay(int delay){
       long int i;
       for(i=0;i<=delay;i++) ;
    }
    
    	
    void Delay (uint32_t Time)
    {
      uint32_t i;
      
      i = 0;
      while (Time--) {
        for (i = 0; i < 5000; i++);
      }
    }
     
    //-----------------------------
    void lcd_init_4bit(void){
      LPC_GPIO0->FIOCLR = RS; // for command
    	 LPC_GPIO0->FIOCLR = RW;
    	//////////////////////////
    	 LPC_GPIO0->FIOSET = (0x03)<< 4; //0x03
    	 LPC_GPIO0->FIOSET = E;
    	 delay(d1);
    	 LPC_GPIO1->FIOCLR = E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4;  //0x03
    
    	 LPC_GPIO0->FIOSET = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4;  //0x03
    	 LPC_GPIO0->FIOSET = E;
    	 delay(d1);
    	 LPC_GPIO0->FIOCLR = E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x03
    
    	 LPC_GPIO0->FIOSET = ((0<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x02
    	 LPC_GPIO0->FIOSET = E;
    	 delay(d1);
    	 LPC_GPIO0->FIOCLR = E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR = ((0<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x02
       /////////////////////////////
      LPC_GPIO1->FIOSET = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x03
    	 LPC_GPIO1->FIOSET = E;
    	 delay(d1);
    	 LPC_GPIO0->FIOCLR = E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x03
    
    	 LPC_GPIO0->FIOSET = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x03
    	 LPC_GPIO0->FIOSET = E;
    	 delay(d1);
    	 LPC_GPIO1->FIOCLR = E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR = ((1<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x03
    
    	 LPC_GPIO0->FIOSET = ((0<<0)|(1<<1)|(0<<2)|(0<<3))<< 4; //0x02
    	 LPC_GPIO0->FIOSET = E;
    	 delay(d1);
    	 LPC_GPIO0->FIOCLR = E;
    	 delay(d2);
      LPC_GPIO0->FIOCLR = ((1<<0)|(1<<1)|(1<<2)|(1<<3))<< 4; //0x02
    }
    //-----------------------------
    void lcd_putchar( char CHAR){
    
       LPC_GPIO0->FIOSET=RS; // for character
       LPC_GPIO0->FIOCLR=RW;
       LPC_GPIO0->FIOSET= ((CHAR&0XF0)>>4)<< 4 ;
       LPC_GPIO0->FIOSET=E;
       delay(d1);
       LPC_GPIO0->FIOCLR=E;
       delay(d2);
       LPC_GPIO0->FIOCLR = ((CHAR&0XF0)>>4)<< 4 ;
    
       LPC_GPIO0->FIOSET = (CHAR&0X0F)<< 4 ;
       LPC_GPIO0->FIOSET=E;
       delay(d1);
       LPC_GPIO0->FIOCLR=E;
       delay(d2);
       LPC_GPIO0->FIOCLR= (CHAR&0X0F)<< 4 ;
    }
    //-----------------------------
    void command(unsigned char CHAR){
    
      LPC_GPIO0->FIOCLR=RS; // for command
    	 LPC_GPIO0->FIOCLR=RW;
    	 LPC_GPIO0->FIOSET= ((CHAR&0XF0)>>4)<< 4 ;
    	 LPC_GPIO0->FIOSET=E;
    	 delay(d1);
    	 LPC_GPIO0->FIOCLR=E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR= ((CHAR&0XF0)>>4)<< 4 ;
    
    	 LPC_GPIO0->FIOSET= (CHAR&0X0F)<< 4 ;
    	 LPC_GPIO0->FIOSET=E;
    	 delay(d1);
    	 LPC_GPIO0->FIOCLR=E;
    	 delay(d2);
    	 LPC_GPIO0->FIOCLR= (CHAR&0X0F)<< 4 ;
    }
    //-----------------------------
    void lcd_putsf( char *data){
       long int i;
    	 for(i=0;data[i];i++) lcd_putchar(data[i]);
    }
    
    unsigned short ADC_Read(void)
    {
     unsigned int i;
     //-----------------------------
     LPC_PINCON->PINSEL1 = 0x00010000; // p0.24 select as ADC0.0
     //LPC_PINCON->PINSEL1 = 1<< 16; // p0.24 select as ADC0.0
    	
     LPC_SC->PCONP |= (1 << 12); // Enable power to AD block 
     LPC_ADC->ADCR |= 0x02;    //select AD0.1 
     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 , When the BURST bit is 0 
     
     do {
      i = LPC_ADC->ADDR1; // Read A/D Data Register
     }while ((LPC_ADC->ADGDR & 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 s = 0;
    	 unsigned 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();
    lcd_putsf(" Nava Behdash 2 ");
      Delay(10000);
    	while(1){
    for(n=0;n<=10;n++)
    {
    	   Delay(1000);
        current_value = ADC_Read();
    		    current_value = (4000-current_value)/2;
    
    		s=s+current_value;
    }		
    	s=s/10;
    	sprintf(p," %i",s);
      command(0x0C);
    		command(0x01);    //LCD CLEAR
        lcd_putsf(" ADC Valu=");
    		
      		lcd_putsf(p);
    				delay(1000000);
      }
    }

    #2
    پاسخ : خواندن از دو کانال ADC

    سلام
    چقدر این برنامه آشناست :biggrin:
    برای تغیر کلنال بایستی شناره کانال در تنظیمات عوض بشه و تنظیملت پایه مربوطه
    فيلم آموزشي ميکروکنترلر LPC1768
    فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
    فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
    فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

    دیدگاه


      #3
      پاسخ : خواندن از دو کانال ADC

      اول یه تشکر ویژه از شما مهندس زرکوب عزیز آقا عاشق عکس پروفایلتم(نوستالوژی شده تقریبا برام )
      بعد این که تو فیلمتم هر چی دقت کردم متوجه نشدم آخه اگه دو تا کانال ADC رو کانفیگ کنیم با چه دستوری از کدوم بخونیم؟ میشه لطف کنی کدشو بنویسی؟
      آقا ما نووبیم دیگه :-"

      دیدگاه


        #4
        پاسخ : خواندن از دو کانال ADC

        دو تا کانال را با هم تنظیم بکنید باید از مد burst استفاده کنید که پشت هم بخونه
        یک بار با یه تابعی مثلا read_adc0 یکی بخونید و بعد با تابعی مثل read_adc1 یکی دیگه. هر کدوم هم تنظیمات کانال خودش توشه
        برای فیلم هم تاپیک مخصوص داره دیگه در فروم
        فيلم آموزشي ميکروکنترلر LPC1768
        فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
        فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
        فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

        دیدگاه

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