اطلاعیه

Collapse
No announcement yet.

سوال در رابطه با ADC

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

    #16
    پاسخ : سوال در رابطه با ADC

    ممنون
    کد:
    #include <mega32.h>
    #include <delay.h> 
    #include <stdlib.h>
    #asm
      .equ __lcd_port=0x18 ;PORTB
    #endasm
    #include <lcd.h>
    unsigned  int adc_data ;    
    char s[6] ;       
    interrupt [TIM1_OVF] void timer1_ovf_isr(void){
    TCCR1B=0x00 ;
    TCNT1H=0xFF;
    TCNT1L=0xDE;
    PORTD.5=!(PORTD.5);
    TCCR1B=0x02 ;
    }  
    interrupt [TIM1_COMPA] void timer1_compa_isr(void) {
    PORTD.5=!(PORTD.5);
    } 
    interrupt [ADC_INT] void adc_isr(void){
     adc_data=ADCW; 
      
     delay_ms(250); 
    
     ADCSRA=0xCD ;
    }
    
    void main(void)
    {
    PORTD=0x00;
    DDRD=0xff;
    
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    TCCR1A=0x00;
    
    TCNT1H=0xFF;
    TCNT1L=0xDE;
    ICR1H=0x00;
    ICR1L=0x00; 
    
    OCR1AH=0xFF;
    OCR1AL=0xEF;  
    
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    MCUCR=0x00;
    MCUCSR=0x00;
    
    TIMSK=0x14;
    TCCR1B=0x02;
    
    ACSR=0x80;          
    SFIOR=0x00;          
    ADMUX=0X43 ;        
    ADCSRA=0x8D ;                    
     lcd_init(16);
     #asm("sei") 
     ADCSRA=0xCD ;
    
    
    while (1)
       {
         itoa(adc_data,s);
       lcd_gotoxy(0,0);
       lcd_puts(s);
       lcd_putsf("  "); 
    
       };
    }

    دیدگاه


      #17
      پاسخ : سوال در رابطه با ADC

      از یک flag برای تشخیص وقفه استفاده شده
      کد:
      #include <mega32.h>
      #include <delay.h> 
      #include <stdlib.h>
      #asm
        .equ __lcd_port=0x18 ;PORTB
      #endasm
      #include <lcd.h>
      unsigned int adc_data;
      bit flag;    
      char s[6] ;
      
             
      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
      {
      TCCR1B=0x00 ;
      TCNT1H=0xFF;
      TCNT1L=0xDE;
      PORTD.5=!(PORTD.5);
      TCCR1B=0x02 ;
      }  
      
      interrupt [TIM1_COMPA] void timer1_compa_isr(void)
      {
      PORTD.5=!(PORTD.5);
      } 
      
      interrupt [ADC_INT] void adc_isr(void){
       adc_data=ADCW;
       
       delay_us(100); 
       flag=1;
       ADCSRA=0xCD ;
      }
      
      void main(void)
      {
      PORTD=0x00;
      DDRD=0xff;
      
      TCCR0=0x00;
      TCNT0=0x00;
      OCR0=0x00;
      
      TCCR1A=0x00;
      
      TCNT1H=0xFF;
      TCNT1L=0xDE;
      ICR1H=0x00;
      ICR1L=0x00; 
      
      OCR1AH=0xFF;
      OCR1AL=0xEF;  
      
      OCR1BH=0x00;
      OCR1BL=0x00;
      
      
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;
      MCUCR=0x00;
      MCUCSR=0x00;
      
      TIMSK=0x14;
      TCCR1B=0x02;
      
      ACSR=0x80;          
      SFIOR=0x00;          
      ADMUX=0X43 ;        
      ADCSRA=0x8D ;                    
       lcd_init(16);
       #asm("sei") 
       ADCSRA=0xCD ;
      
      
      while (1)
       {
         if(flag)
          {    
          #asm("cli");
          itoa(adc_data,s);
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_puts(s);
          delay_ms(100); 
          flag=0;
          #asm("sei");
          }
       }
      };
      امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

      دیدگاه


        #18
        پاسخ : سوال در رابطه با ADC

        سلام
        دوستان راهی هست که بشه فرکانس نمونه برداری مبدل A2D رو پایین آورد؟
        من نهایتا در حد 500-600 هرتز نیاز دارم و میکرویی که استفاده میکنم ATMEGA128 با کلاک داخلی 8000000 هستش.
        ممنون میشم راهنماییم کنین.

        دیدگاه


          #19
          پاسخ : سوال در رابطه با ADC

          نوشته اصلی توسط sadegh1992
          سلام
          دوستان راهی هست که بشه فرکانس نمونه برداری مبدل A2D رو پایین آورد؟
          من نهایتا در حد 500-600 هرتز نیاز دارم و میکرویی که استفاده میکنم ATMEGA128 با کلاک داخلی 8000000 هستش.
          ممنون میشم راهنماییم کنین.
          با سلام
          همانطور که در عکس های زیر میبینید فرکانس توسط بیتهای ADPS0,1,2 از رجیستر ADCSRA تنظیم میشود.



          مثلا اگر هرسه تای این بیت ها را روشن کنیم کلاک کل میکرو تقسیم بر 128 میشود و یا اگر آن ها را 0 کنیم کلاک میکرو تقسیم بر 2 میشود و این کلاک تقسیم شده به ADC میرود
          حالا
          کلاک شما 8000000 مگاهرتز هستش و میخاهید ADC در 500-600 هرتز کار کند
          پس ما 8000000 رو تقسیم بر 500 میکنیم میشه 1600 وما همچین عددی در جدول نداریم پس غیر ممکنه!
          پس 8 مگاهرتز خیلی زیاده
          حتی 1مگا هرتز هم خیلی زیاده
          پس!
          32768 هرتز که کریستال ساعته رو میزاریم
          32768تقسیم بر 500 میشه 65 و خورده ای ولی همچین عددی در جدول وجود نداره پس میایم از عدد 64 که در جدول هست استفاده میکنیم
          پس کلاکی که به ADC میره برابر با 512 هرتز هستش.
          1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
          من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
          !Electronic On! Programming On
          هوشمندانه سوال بپرسیم!
          http://ir02x6.persiangig.com/logo/eca/tanks_01.png

          دیدگاه


            #20
            پاسخ : سوال در رابطه با ADC

            نوشته اصلی توسط Mahan.Rafiee
            با سلام
            همانطور که در عکس های زیر میبینید فرکانس توسط بیتهای ADPS0,1,2 از رجیستر ADCSRA تنظیم میشود.



            مثلا اگر هرسه تای این بیت ها را روشن کنیم کلاک کل میکرو تقسیم بر 128 میشود و یا اگر آن ها را 0 کنیم کلاک میکرو تقسیم بر 2 میشود و این کلاک تقسیم شده به ADC میرود
            حالا
            کلاک شما 8000000 مگاهرتز هستش و میخاهید ADC در 500-600 هرتز کار کند
            پس ما 8000000 رو تقسیم بر 500 میکنیم میشه 1600 وما همچین عددی در جدول نداریم پس غیر ممکنه!
            پس 8 مگاهرتز خیلی زیاده
            حتی 1مگا هرتز هم خیلی زیاده
            پس!
            32768 هرتز که کریستال ساعته رو میزاریم
            32768تقسیم بر 500 میشه 65 و خورده ای ولی همچین عددی در جدول وجود نداره پس میایم از عدد 64 که در جدول هست استفاده میکنیم
            پس کلاکی که به ADC میره برابر با 512 هرتز هستش.
            مجبورم از 8 مگ استفاده کنم. چون از کارت حافظه هم در مدارم دارم استفاده میآ‌کنم. اگر ما وقفه مبدل A2D رو غیر فعال کنیم و با استفاده از تایمرههای موجود یکی رو تنظیم کنیم که مقدار سر ریزش بر اساس فرکانس 500 هرتز اتفاق بیفته و سپس بیایم داخل وقفه تایمر بگیم که مبدل کارش رو انجام بده، عملی میشه؟
            توی تئوری به نظرم درست میاد ولی تو عمل چطور میشه نمیدونم چون نیمتونم ازش جواب بگیرم!!! :redface:

            دیدگاه


              #21
              پاسخ : سوال در رابطه با ADC

              توی یک پروژه جدا قشنگ جواب میده ولی داخل پروژه خودم که کدها رو اعمال میکنم درست کار نمیکنه و خیلی از نمونه های سیگنال از دست میره.

              دیدگاه

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