اطلاعیه

Collapse
No announcement yet.

تولید فرکانس و دیوتی سایکل قابل تغییر با ولوم و نمایش رویlcd با avr

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

    #16
    پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

    نوشته اصلی توسط mhfd

    با درود
    نه داداش میخواستم قابل تغییر با ولوم باشه عنوان اولمم همینه که هر کدومو با ولوم تغییر بدم مثل همونیکه بار اول شما لطف کردین ضحمتشو کشیدین در هر صورت اگر من خوب منظورمو نرسوندم عذر میخوام ... اگر وقتتونو میگره پس لطفا یه راهنمایی کنید که چطوری میتونم فرکانسم با ولوم تغییر بدم ممنون میشم :smile:
    همه پروژه ها رو قاطی کردم ...
    بله شما درست میگید
    محدوده فرکانسی چقدر باشه ؟؟
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      #17
      پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر با ولوم و نمایش رویlcd با avr

      ببین این به دردتون میخوره ؟؟

      کد:
      /*****************************************************
      Chip type        : ATmega8
      Program type      : Application
      AVR Core Clock frequency: 8.000000 MHz
      Memory model      : Small
      External RAM size    : 0
      Data Stack size     : 256
      *****************************************************/
      
      #include <mega8.h>
      #include <delay.h>
      #define ADC_VREF_TYPE 0x40
      
      // Read the AD conversion result
      unsigned int read_adc(unsigned char adc_input)
      {
        ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
        // Delay needed for the stabilization of the ADC input voltage
        delay_us(10);
        // Start the AD conversion
        ADCSRA|=0x40;
        // Wait for the AD conversion to complete
        while ((ADCSRA & 0x10)==0);
        ADCSRA|=0x10;
        return ADCW;
      }
      
      
      void main(void)
      {
        // Declare your local variables here
        unsigned int a=0,b=0;
        PORTB=0x00;
        DDRB=0x06;
        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: 8000.000 kHz
        // Mode: Fast PWM top=ICR1
        // OC1B output: Non-Inv.
        // Input Capture on Falling Edge
        TCCR1A=0x22;
        TCCR1B=0x19;
        ICR1L = 64;
        // ADC initialization
        // ADC Clock frequency: 62.500 kHz
        // ADC Voltage Reference: AVCC pin
        ADMUX=ADC_VREF_TYPE & 0xff;
        ADCSRA=0x87;
      
        while (1)
        {
          a = read_adc(0)*8;
          b = (float)(((float)read_adc(1)/1023))*a;
          ICR1H = a >> 8;
          ICR1L = a & 0xFF;
          OCR1BH = b >> 8;
          OCR1BL = b & 0xFF;
          delay_ms(50);
        }
      }
      پایه ها هم دقیقا همون پایه های فایل اولی هست ...

      موفق باشید
      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
      معرفی نرم افزار Codewizard PWM
      با من بیشتر آشنا شوید

      دیدگاه


        #18
        پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

        .



        اضافه شده در تاریخ :
        نوشته اصلی توسط سامان اسدی
        ببین این به دردتون میخوره ؟؟

        کد:
        /*****************************************************
        Chip type        : ATmega8
        Program type      : Application
        AVR Core Clock frequency: 8.000000 MHz
        Memory model      : Small
        External RAM size    : 0
        Data Stack size     : 256
        *****************************************************/
        
        #include <mega8.h>
        #include <delay.h>
        #define ADC_VREF_TYPE 0x40
        
        // Read the AD conversion result
        unsigned int read_adc(unsigned char adc_input)
        {
          ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
          // Delay needed for the stabilization of the ADC input voltage
          delay_us(10);
          // Start the AD conversion
          ADCSRA|=0x40;
          // Wait for the AD conversion to complete
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          return ADCW;
        }
        
        
        void main(void)
        {
          // Declare your local variables here
          unsigned int a=0,b=0;
          PORTB=0x00;
          DDRB=0x06;
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 8000.000 kHz
          // Mode: Fast PWM top=ICR1
          // OC1B output: Non-Inv.
          // Input Capture on Falling Edge
          TCCR1A=0x22;
          TCCR1B=0x19;
          ICR1L = 64;
          // ADC initialization
          // ADC Clock frequency: 62.500 kHz
          // ADC Voltage Reference: AVCC pin
          ADMUX=ADC_VREF_TYPE & 0xff;
          ADCSRA=0x87;
        
          while (1)
          {
            a = read_adc(0)*8;
            b = (float)(((float)read_adc(1)/1023))*a;
            ICR1H = a >> 8;
            ICR1L = a & 0xFF;
            OCR1BH = b >> 8;
            OCR1BL = b & 0xFF;
            delay_ms(50);
          }
        }
        پایه ها هم دقیقا همون پایه های فایل اولی هست ...

        موفق باشید

        بله دست شما درد نکنه مرسی
        درست شد عالیه
        اگه اشتباه نکنم شما تو این برنامه یه سیگنال انالوگ به ADC وارد کردین و بعد تبدیلش کردین وبعد با تقسیم فرکانسی تبدیل شدش یه فرکانس ساختین یعنی منظورم اینه که از تایمر adc فقط استفاده کردین بازم نمیدونم اگه اشتباه میکنم لطفا تصحیح کنید... فقط چنتا سوال داشتم ..اول اینکه شما یه سیگنال dc اعمال کردین بعد چجوری تونسین تبدیلش کنید منظورم پتانسومترهاس بعد چجوری دیوتی سایکل و فرکانس متغیر باهاش تولید کردین اگه ممکنه لطفا یه مختصری توضیح بدین ممنون میشم (اینها مربوط به برنامه اولیه میشه) لطفا این دوتا سطرم اگه ممکنه یکم توضیح بدین من خوب متوجه نشدم ....



        while ((ADCSRA & 0x10)==0);
        ADCSRA|=0x10;
        return ADCW;


        a = read_adc(0)*64;
        b = (float)((float)read_adc(1)/(float)1023)*(float)a;



        با اجازتون یه سوال دیگه هم دارم اونم اینکه این برنامه سومیه چه تغییری نسبت به اولیه داره بجز تغییر پری اسکیلر و a,b از نوع فلوت شد یا int ؟ ...

        دیدگاه


          #19
          پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

          نوشته اصلی توسط mhfd
          اگه اشتباه نکنم شما تو این برنامه یه سیگنال انالوگ به ADC وارد کردین و بعد تبدیلش کردین وبعد با تقسیم فرکانسی تبدیل شدش یه فرکانس ساختین یعنی منظورم اینه که از تایمر adc فقط استفاده کردین بازم نمیدونم اگه اشتباه میکنم لطفا تصحیح کنید... فقط چنتا سوال داشتم ..اول اینکه شما یه سیگنال dc اعمال کردین بعد چجوری تونسین تبدیلش کنید منظورم پتانسومترهاس بعد چجوری دیوتی سایکل و فرکانس متغیر باهاش تولید کردین اگه ممکنه لطفا یه مختصری توضیح بدین ممنون میشم (اینها مربوط به برنامه اولیه میشه) لطفا این دوتا سطرم اگه ممکنه یکم توضیح بدین من خوب متوجه نشدم مرسی ...

          کد:
          while ((ADCSRA & 0x10)==0);
            ADCSRA|=0x10;
            return ADCW;
          
          
            a = read_adc(0)*64;
              b = (float)((float)read_adc(1)/(float)1023)*(float)a;
          درود
          برنامه به دردتون خورد ؟؟؟ خوب جوابتون رو داد ؟؟

          اولین چیزی که باید بدونید اینه که این تابع مربوط میشه به ADC
          کد:
          unsigned int read_adc(unsigned char adc_input)
          {
            ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
            // Delay needed for the stabilization of the ADC input voltage
            delay_us(10);
            // Start the AD conversion
            ADCSRA|=0x40;
            // Wait for the AD conversion to complete
            while ((ADCSRA & 0x10)==0);
            ADCSRA|=0x10;
            return ADCW;
          }
          این تابع یک ورودی و یک خروجی داره
          ورودی این تابع مربوط میشه به کانالی که قراره استفاده کنیم ... بازه این ورودی 0 تا 5 است (در بسته های DIP)
          خروجی این تابع مربوط میشه به مقداری که از ADC خونده ... بازه این خروجی در این برنامه بین 0 تا 1023 است ...
          بنابراین با تغییر این دو ولوم باعث ایجاد دو متغیر 0 تا 1023 می گردد ...

          این قسمت هم مربوط میشه به تنظیمات تایمر 1 که 16 بیتی هست ...
          کد:
            // Timer/Counter 1 initialization
            // Clock source: System Clock
            // Clock value: 8000.000 kHz
            // Mode: Fast PWM top=ICR1
            // OC1B output: Non-Inv.
          منبع کلاک رو از سیستم گرفتم
          تقسیم کننده فرکانسی را روی یک گذاشتم
          مدی که استفاده کردم مد Fast PWM top=ICR1 است .
          تایمر میکروکنترلر چون با پالس کار می کند بنابراین زمان یک سیکل PWM با تعداد پالس مشخص میشود .
          تعداد پالسهای یک پریود را باید درون رجیستر ICR1 بگذاریم . به دلیل 16 بیتی بودن رجیستر ICR1 به دو قسمت ICR1H و ICR1L تقسیم میشود.
          پس زمان پریود موج PWM با این رجیستر تعیین میشود . در اینجا به تعداد 1/8000000 ثانیه در رجیستر ICR1 تعیین میشود که زمان یک پریود چقدر باشد ...
          رجیستر OCR1B و OCR1A برای نسبت دادن دیوتی سایکل یک موج PWM است ... بنابراین اگر به این دو رجیستر مقدار بدهیم دیوتی سایکل پایه های خروجی OCR1A و OCR1B تغییر پیدا میکند . این دو رجیستر به دلیل تعیین کننده دیوتی سایکل باید از کوچکتر مساوی رجیستر ICR1 باشد . در این برنامه خروجی OCR1B را در نظر گرفتیم . این رجیستر با توجه به 16 بیتی بودن آن به دو قسمت OCR1BH و OCR1BL تقسیم شده است .
          بنابراین رجیستر ICR1 برای زمان یک پریود و رجیستر OCR1B برای تعیین دیوتی سایکل به کار گرفته میشود ...

          بقیه برنامه هم که دیگه مشخصه ...
          کد:
          a = read_adc(0)*8;
          این خط از ورودی ADC0 مقدار را خوانده و ضرب در 8 میکند و برابر متغیر 16 بیتی a میشود

          کد:
          b = (float)(((float)read_adc(1)/1023))*a;
          این خط هم بدون در نظر گرفتن پیچیدگی ، فرمول آن به صورت زیر می باشد .
          کد:
          b = (read_adc(1)/1023) * a
          بقیه کد هم خیلی راحته
          متغیر a را وارد رجیستر ICR1 می کنیم
          و متغیر b را وارد رجیستر OCR1B می کنیم

          به همین راحتی و به همین خوشمزگی ... :nerd:

          موفق باشیــــد
          [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
          معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
          معرفی نرم افزار Codewizard PWM
          با من بیشتر آشنا شوید

          دیدگاه


            #20
            پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

            نوشته اصلی توسط سامان اسدی
            درود
            برنامه به دردتون خورد ؟؟؟ خوب جوابتون رو داد ؟؟

            اولین چیزی که باید بدونید اینه که این تابع مربوط میشه به ADC
            کد:
            unsigned int read_adc(unsigned char adc_input)
            {
              ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
              // Delay needed for the stabilization of the ADC input voltage
              delay_us(10);
              // Start the AD conversion
              ADCSRA|=0x40;
              // Wait for the AD conversion to complete
              while ((ADCSRA & 0x10)==0);
              ADCSRA|=0x10;
              return ADCW;
            }
            این تابع یک ورودی و یک خروجی داره
            ورودی این تابع مربوط میشه به کانالی که قراره استفاده کنیم ... بازه این ورودی 0 تا 5 است (در بسته های DIP)
            خروجی این تابع مربوط میشه به مقداری که از ADC خونده ... بازه این خروجی در این برنامه بین 0 تا 1023 است ...
            بنابراین با تغییر این دو ولوم باعث ایجاد دو متغیر 0 تا 1023 می گردد ...

            این قسمت هم مربوط میشه به تنظیمات تایمر 1 که 16 بیتی هست ...
            کد:
              // Timer/Counter 1 initialization
              // Clock source: System Clock
              // Clock value: 8000.000 kHz
              // Mode: Fast PWM top=ICR1
              // OC1B output: Non-Inv.
            منبع کلاک رو از سیستم گرفتم
            تقسیم کننده فرکانسی را روی یک گذاشتم
            مدی که استفاده کردم مد Fast PWM top=ICR1 است .
            تایمر میکروکنترلر چون با پالس کار می کند بنابراین زمان یک سیکل PWM با تعداد پالس مشخص میشود .
            تعداد پالسهای یک پریود را باید درون رجیستر ICR1 بگذاریم . به دلیل 16 بیتی بودن رجیستر ICR1 به دو قسمت ICR1H و ICR1L تقسیم میشود.
            پس زمان پریود موج PWM با این رجیستر تعیین میشود . در اینجا به تعداد 1/8000000 ثانیه در رجیستر ICR1 تعیین میشود که زمان یک پریود چقدر باشد ...
            رجیستر OCR1B و OCR1A برای نسبت دادن دیوتی سایکل یک موج PWM است ... بنابراین اگر به این دو رجیستر مقدار بدهیم دیوتی سایکل پایه های خروجی OCR1A و OCR1B تغییر پیدا میکند . این دو رجیستر به دلیل تعیین کننده دیوتی سایکل باید از کوچکتر مساوی رجیستر ICR1 باشد . در این برنامه خروجی OCR1B را در نظر گرفتیم . این رجیستر با توجه به 16 بیتی بودن آن به دو قسمت OCR1BH و OCR1BL تقسیم شده است .
            بنابراین رجیستر ICR1 برای زمان یک پریود و رجیستر OCR1B برای تعیین دیوتی سایکل به کار گرفته میشود ...

            بقیه برنامه هم که دیگه مشخصه ...
            کد:
            a = read_adc(0)*8;
            این خط از ورودی ADC0 مقدار را خوانده و ضرب در 8 میکند و برابر متغیر 16 بیتی a میشود

            کد:
            b = (float)(((float)read_adc(1)/1023))*a;
            این خط هم بدون در نظر گرفتن پیچیدگی ، فرمول آن به صورت زیر می باشد .
            کد:
            b = (read_adc(1)/1023) * a
            بقیه کد هم خیلی راحته
            متغیر a را وارد رجیستر ICR1 می کنیم
            و متغیر b را وارد رجیستر OCR1B می کنیم

            به همین راحتی و به همین خوشمزگی ... :nerd:

            موفق باشیــــد
            سلام
            ببخشید یکم دیر جواب دادم .. بله واقعا دست شما درد نکنه
            تا اینجا خیلی کارمو جلو انداخت حالا هم دارم رو قسمت lcd کار میکنم چون تازه کارم یکم شاید طول بکشه :smile: ...

            دیدگاه


              #21
              پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

              نوشته اصلی توسط سامان اسدی
              درود
              برنامه به دردتون خورد ؟؟؟ خوب جوابتون رو داد ؟؟

              اولین چیزی که باید بدونید اینه که این تابع مربوط میشه به ADC
              کد:
              unsigned int read_adc(unsigned char adc_input)
              {
                ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                // Delay needed for the stabilization of the ADC input voltage
                delay_us(10);
                // Start the AD conversion
                ADCSRA|=0x40;
                // Wait for the AD conversion to complete
                while ((ADCSRA & 0x10)==0);
                ADCSRA|=0x10;
                return ADCW;
              }
              این تابع یک ورودی و یک خروجی داره
              ورودی این تابع مربوط میشه به کانالی که قراره استفاده کنیم ... بازه این ورودی 0 تا 5 است (در بسته های DIP)
              خروجی این تابع مربوط میشه به مقداری که از ADC خونده ... بازه این خروجی در این برنامه بین 0 تا 1023 است ...
              بنابراین با تغییر این دو ولوم باعث ایجاد دو متغیر 0 تا 1023 می گردد ...

              این قسمت هم مربوط میشه به تنظیمات تایمر 1 که 16 بیتی هست ...
              کد:
                // Timer/Counter 1 initialization
                // Clock source: System Clock
                // Clock value: 8000.000 kHz
                // Mode: Fast PWM top=ICR1
                // OC1B output: Non-Inv.
              منبع کلاک رو از سیستم گرفتم
              تقسیم کننده فرکانسی را روی یک گذاشتم
              مدی که استفاده کردم مد Fast PWM top=ICR1 است .
              تایمر میکروکنترلر چون با پالس کار می کند بنابراین زمان یک سیکل PWM با تعداد پالس مشخص میشود .
              تعداد پالسهای یک پریود را باید درون رجیستر ICR1 بگذاریم . به دلیل 16 بیتی بودن رجیستر ICR1 به دو قسمت ICR1H و ICR1L تقسیم میشود.
              پس زمان پریود موج PWM با این رجیستر تعیین میشود . در اینجا به تعداد 1/8000000 ثانیه در رجیستر ICR1 تعیین میشود که زمان یک پریود چقدر باشد ...
              رجیستر OCR1B و OCR1A برای نسبت دادن دیوتی سایکل یک موج PWM است ... بنابراین اگر به این دو رجیستر مقدار بدهیم دیوتی سایکل پایه های خروجی OCR1A و OCR1B تغییر پیدا میکند . این دو رجیستر به دلیل تعیین کننده دیوتی سایکل باید از کوچکتر مساوی رجیستر ICR1 باشد . در این برنامه خروجی OCR1B را در نظر گرفتیم . این رجیستر با توجه به 16 بیتی بودن آن به دو قسمت OCR1BH و OCR1BL تقسیم شده است .
              بنابراین رجیستر ICR1 برای زمان یک پریود و رجیستر OCR1B برای تعیین دیوتی سایکل به کار گرفته میشود ...

              بقیه برنامه هم که دیگه مشخصه ...
              کد:
              a = read_adc(0)*8;
              این خط از ورودی ADC0 مقدار را خوانده و ضرب در 8 میکند و برابر متغیر 16 بیتی a میشود

              کد:
              b = (float)(((float)read_adc(1)/1023))*a;
              این خط هم بدون در نظر گرفتن پیچیدگی ، فرمول آن به صورت زیر می باشد .
              کد:
              b = (read_adc(1)/1023) * a
              بقیه کد هم خیلی راحته
              متغیر a را وارد رجیستر ICR1 می کنیم
              و متغیر b را وارد رجیستر OCR1B می کنیم

              به همین راحتی و به همین خوشمزگی ... :nerd:

              موفق باشیــــد
              با عرض سلام مجدد
              خیلی وقته گذشته نمیدونم این تکست بدستتون میرسه یا نه
              ولی با اجازتون یه چندتا سوال راجبه این برنامه داشتم چون کلا مبتدیم یکم تحلیل این برنامه برام مشکله
              سوال اول اینکه
              خط اول به چه دلیل adc_vref_type= 0x40 شده که اگه اشتباه نکنم برار عدد 16 میشه
              به چه دلیل admux=adc_vref_type اند شده با 0xff اصلا چرا باید به این صورت نوشته بشه
              و چرا تقسیم فرکانسیه adc روی 128 تنظیم شده وبه چه دلیل شما فرکانس 63500 رو انتخاب کردین برای فرکانس تبدیل adc ؟
              بعد من معنی اون چهار خط اخرم اصلا متوجه نشدم چرا یبار a&0xff شده بعد ریخته شده تو ICR1L بعد یبارم 8<<b و ریخته شده تو ocr1bh میدونم چه کاری انجام میده ولی نمیدونم چرا به این صورت نوشته شده
              خیلی ممنون میشم اگه به این سوالات جواب بدین و کمک زیادی بهم میکنین...
              در ضمن من چون تو این مدت سر کارای دیگه بودم نتونستم قسمت lcd رو کامل کنم چنتا برنامه نوشتم لی جواب نداد شما تو این زمینه اگه وقت داشتین لطفا یه کمکی بکنید ممنونم
              با تشکر از حسن توجه شما...

              دیدگاه


                #22
                پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

                نوشته اصلی توسط mhfd
                با عرض سلام مجدد
                درود دوست عزیز

                نوشته اصلی توسط mhfd
                خیلی وقته گذشته نمیدونم این تکست بدستتون میرسه یا نه
                بله میرسه ... مگه میشه نرسه ... :mrgreen:

                نوشته اصلی توسط mhfd
                ولی با اجازتون یه چندتا سوال راجبه این برنامه داشتم چون کلا مبتدیم یکم تحلیل این برنامه برام مشکله
                خواهش میکنم ... فقط خواهشا سوالهای سخت نپرسید :rolleyes:

                نوشته اصلی توسط mhfd
                سوال اول اینکه
                خط اول به چه دلیل adc_vref_type= 0x40 شده که اگه اشتباه نکنم برار عدد 16 میشه
                به این دلیل
                کد:
                // ADC Voltage Reference: AVCC pin
                نوشته اصلی توسط mhfd
                به چه دلیل admux=adc_vref_type اند شده با 0xff اصلا چرا باید به این صورت نوشته بشه
                زیاد مهم نیست برای تنظیمات ADC هست

                نوشته اصلی توسط mhfd
                و چرا تقسیم فرکانسیه adc روی 128 تنظیم شده وبه چه دلیل شما فرکانس 63500 رو انتخاب کردین برای فرکانس تبدیل adc ؟
                به دلیل اینکه هر چقدر سرعت کلاکش پایینتر باشه نویز کمتر و دقتش بهتره !!! :surprised:
                در ضمن فرکانسش 62500 هرتز هست ...

                نوشته اصلی توسط mhfd
                بعد من معنی اون چهار خط اخرم اصلا متوجه نشدم چرا یبار a&0xff شده بعد ریخته شده تو ICR1L بعد یبارم 8<<b و ریخته شده تو ocr1bh میدونم چه کاری انجام میده ولی نمیدونم چرا به این صورت نوشته شده
                ببین دوست عزیز
                برای اینکه یه متغیر 16 بایتی رو بریزید توی یه متغیر 8بیتی باید تعیین کنید که 8بیت کدام قسمت سمت چپ یا سمت راست ریخته شود توی رجیستر 8 بیتی
                مثلا میخواهیم 8بیت سمت چپ متغیر 16بیتی a را وارد رجیستر 8 بیتی ICR1H کنیم باید اینگونه نوشت
                کد:
                ICR1H = a >> 8;
                و اگر خواستیم 8 بیت سمت راست متغیر a را وارد ICR1L کنیم باید مساوی خودش کنیم ... خود کامپایلر میفهمه که اگر یه متغیر 16 بیتی را برابر 8 بیتی قرار دهیم تنها 8بیت سمت راست آنها را برابر هم قرار میدهد ...
                کد:
                ICR1L = a & 0xFF;
                یعنی 8 بیت سمت راست a را وارد ICR1L کن ...
                البته اینگونه هم میتوان نوشت
                کد:
                ICR1L = a;
                نوشته اصلی توسط mhfd
                در ضمن من چون تو این مدت سر کارای دیگه بودم نتونستم قسمت lcd رو کامل کنم چنتا برنامه نوشتم لی جواب نداد شما تو این زمینه اگه وقت داشتین لطفا یه کمکی بکنید ممنونم
                با تشکر از حسن توجه شما...
                والا ... چی بگم ... LCD گذاشتنش زیاد کاری نداره هاااا ... سخت نیستا ....
                [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                معرفی نرم افزار Codewizard PWM
                با من بیشتر آشنا شوید

                دیدگاه


                  #23
                  پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

                  نوشته اصلی توسط سامان اسدی
                  درود دوست عزیز
                  بله میرسه ... مگه میشه نرسه ... :mrgreen:
                  خواهش میکنم ... فقط خواهشا سوالهای سخت نپرسید :rolleyes:
                  به این دلیل
                  کد:
                  // ADC Voltage Reference: AVCC pin
                  زیاد مهم نیست برای تنظیمات ADC هست
                  به دلیل اینکه هر چقدر سرعت کلاکش پایینتر باشه نویز کمتر و دقتش بهتره !!! :surprised:
                  در ضمن فرکانسش 62500 هرتز هست ...
                  ببین دوست عزیز
                  برای اینکه یه متغیر 16 بایتی رو بریزید توی یه متغیر 8بیتی باید تعیین کنید که 8بیت کدام قسمت سمت چپ یا سمت راست ریخته شود توی رجیستر 8 بیتی
                  مثلا میخواهیم 8بیت سمت چپ متغیر 16بیتی a را وارد رجیستر 8 بیتی ICR1H کنیم باید اینگونه نوشت
                  کد:
                  ICR1H = a >> 8;
                  و اگر خواستیم 8 بیت سمت راست متغیر a را وارد ICR1L کنیم باید مساوی خودش کنیم ... خود کامپایلر میفهمه که اگر یه متغیر 16 بیتی را برابر 8 بیتی قرار دهیم تنها 8بیت سمت راست آنها را برابر هم قرار میدهد ...
                  کد:
                  ICR1L = a & 0xFF;
                  یعنی 8 بیت سمت راست a را وارد ICR1L کن ...
                  البته اینگونه هم میتوان نوشت
                  کد:
                  ICR1L = a;
                  والا ... چی بگم ... LCD گذاشتنش زیاد کاری نداره هاااا ... سخت نیستا ....
                  مرسی از توضیحاتتون
                  ظمنا برنامه واسه lcd نوشتم یه چندتا ولی هیچکدوم اون جوابی که میخواستمو نداد یعنی محاسباتش کامل نبود به قول شما زیاد سخت نیست ولی یه قلقهایی داره که هنوز من نمیدونم ... :rolleyes: ولی بازم تلاشمو میکنم ...مرسی

                  دیدگاه


                    #24
                    پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

                    نوشته اصلی توسط mhfd
                    مرسی از توضیحاتتون
                    ظمنا برنامه واسه lcd نوشتم یه چندتا ولی هیچکدوم اون جوابی که میخواستمو نداد یعنی محاسباتش کامل نبود به قول شما زیاد سخت نیست ولی یه قلقهایی داره که هنوز من نمیدونم ... :rolleyes: ولی بازم تلاشمو میکنم ...مرسی
                    برنامه رو بگذارید ببینم ...
                    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                    معرفی نرم افزار Codewizard PWM
                    با من بیشتر آشنا شوید

                    دیدگاه


                      #25
                      پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

                      نوشته اصلی توسط سامان اسدی
                      برنامه رو بگذارید ببینم ...
                      با عرض سلام ودرود
                      اقا این قسمت lcd برنامرو یه کارایی کردم البته میدونم ابتدایی و ناقصه چند مدلم عوضش کردم که یا مثل این اصلا محاسبه نمیکنه رو ال سی دی یا اشتباه محاسبه میکنه
                      کد:
                      #include <mega8.h>
                      
                      // Alphanumeric LCD Module functions
                      #include <alcd.h>
                      #include <stdio.h>
                      #include <mega8.h>
                      #include <delay.h>
                      #define ADC_VREF_TYPE 0x40
                      
                      // Read the AD conversion result
                      unsigned int read_adc(unsigned char adc_input)
                      {
                        ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                        // Delay needed for the stabilization of the ADC input voltage
                        delay_us(10);
                        // Start the AD conversion
                        ADCSRA|=0x40;
                        // Wait for the AD conversion to complete
                        while ((ADCSRA & 0x10)==0);
                        ADCSRA|=0x10;
                        return ADCW;
                      }
                      
                      
                      void main(void)
                      {   unsigned int a=0,b=0;
                        char lcd_buff1[16],lcd_buff2[16];
                        lcd_init(16);
                        // Declare your local variables here
                       
                        PORTB=0x00;
                        DDRB=0x06;
                        // Timer/Counter 1 initialization
                        // Clock source: System Clock
                        // Clock value: 8000.000 kHz
                        // Mode: Fast PWM top=ICR1
                        // OC1B output: Non-Inv.
                        // Input Capture on Falling Edge
                        TCCR1A=0x22;
                        TCCR1B=0x19;
                        ICR1L = 64;
                        // ADC initialization
                        // ADC Clock frequency: 62.500 kHz
                        // ADC Voltage Reference: AVCC pin
                        ADMUX=ADC_VREF_TYPE & 0xff;
                        ADCSRA=0x87;
                      
                        while (1)
                        {  
                          a = read_adc(0)*8;
                          b = (float)(((float)read_adc(1)/1023))*a;
                          ICR1H = a >> 8;
                          ICR1L = a & 0xFF;
                          OCR1BH = b >> 8;
                          OCR1BL = b & 0xFF;
                          delay_ms(50);
                          lcd_clear();
                          sprintf(lcd_buff1,"duty cycle=%2",b);
                          lcd_gotoxy(0,0);
                          lcd_puts(lcd_buff1);
                          sprintf(lcd_buff2,"time=%4",a);
                          lcd_gotoxy(0,1);
                          lcd_puts(lcd_buff2);
                          delay_ms(500);
                          };
                          }

                      دیدگاه


                        #26
                        پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر با ولوم و نمایش رویlcd با avr

                        یک سال بعد ...
                        برنامه :
                        کد:
                        /*****************************************************
                        Chip type        : ATmega8
                        Program type      : Application
                        AVR Core Clock frequency: 8.000000 MHz
                        Memory model      : Small
                        External RAM size    : 0
                        Data Stack size     : 256
                        *****************************************************/
                        
                        #include <mega8.h>
                        #include <delay.h>
                        #include <alcd.h>
                        #include <stdlib.h>
                        #define ADC_VREF_TYPE 0x60
                        
                        // Read the 8 most significant bits
                        // of the AD conversion result
                        unsigned char read_adc(unsigned char adc_input)
                        {
                          ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                          // Delay needed for the stabilization of the ADC input voltage
                          delay_us(10);
                          // Start the AD conversion
                          ADCSRA|=0x40;
                          // Wait for the AD conversion to complete
                          while ((ADCSRA & 0x10)==0);
                          ADCSRA|=0x10;
                          return ADCH;
                        }
                        
                        void main(void)
                        {
                          // Declare your local variables here
                          unsigned int a=0,b=0,a2=0,b2=0;
                          float frequency=0 , duty_cycle=0;
                          char str[20];
                          PORTB=0x00;
                          DDRB=0x06;
                          // Timer/Counter 1 initialization
                          // Clock source: System Clock
                          // Clock value: 8000.000 kHz
                          // Mode: Fast PWM top=ICR1
                          // OC1A output: Non-Inv.
                          // OC1B output: Inverted
                          // Input Capture on Falling Edge
                          TCCR1A=0xB2;
                          TCCR1B=0x19;
                          // ADC initialization
                          // ADC Clock frequency: 62.500 kHz
                          // ADC Voltage Reference: AVCC pin
                          // Only the 8 most significant bits of
                          // the AD conversion result are used
                          ADMUX = ADC_VREF_TYPE;
                          ADCSRA = 0x87;
                          // Alphanumeric LCD initialization
                          // Connections are specified in the
                          // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
                          // RS - PORTC Bit 3
                          // RD - PORTC Bit 2
                          // EN - PORTC Bit 1
                          // D4 - PORTC Bit 0
                          // D5 - PORTB Bit 5
                          // D6 - PORTB Bit 4
                          // D7 - PORTB Bit 3
                          // Characters/line: 16
                          lcd_init(16);
                        
                          while (1)
                          {
                            a = read_adc(4);if(!a)a=1;
                            b = read_adc(5);if(!b)b=1;    
                            if(a!=a2 || b!=b2)
                            {
                              a2 = 16000/a;
                              a2--;
                              ICR1H = a2 >> 8;
                              ICR1L = a2;
                              b2 = (long)(b*a2)/255;
                              OCR1BH = b2 >> 8;
                              OCR1BL = b2;
                              OCR1AH = b2 >> 8;
                              OCR1AL = b2;
                              frequency = 8000000/(a2+1);
                              lcd_clear();
                              lcd_putsf("F="); 
                              ltoa(frequency,str);
                              lcd_puts(str);
                              lcd_putsf("Hz");
                              duty_cycle = b/2.55;
                              ftoa(duty_cycle,2,str);
                              lcd_gotoxy(0,1);
                              lcd_putsf("dc:");
                              lcd_puts(str);
                              lcd_putsf("%");
                              a2=a;
                              b2=b;
                            }
                            delay_ms(50);
                          }
                        }
                        این هم سورس + شماتیک
                        http://s4.picofile.com/file/8164530400/PWM_ADC_90Khz.zip.html

                        سعی کنید LCD سبز بگیرید ...

                        پیروز باشید
                        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                        معرفی نرم افزار Codewizard PWM
                        با من بیشتر آشنا شوید

                        دیدگاه


                          #27
                          پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

                          نوشته اصلی توسط mhfd
                          با عرض سلام ودرود
                          اقا این قسمت lcd برنامرو یه کارایی کردم البته میدونم ابتدایی و ناقصه چند مدلم عوضش کردم که یا مثل این اصلا محاسبه نمیکنه رو ال سی دی یا اشتباه محاسبه میکنه
                          کد:
                          #include <mega8.h>
                          
                          // Alphanumeric LCD Module functions
                          #include <alcd.h>
                          #include <stdio.h>
                          #include <mega8.h>
                          #include <delay.h>
                          #define ADC_VREF_TYPE 0x40
                          
                          // Read the AD conversion result
                          unsigned int read_adc(unsigned char adc_input)
                          {
                            ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
                            // Delay needed for the stabilization of the ADC input voltage
                            delay_us(10);
                            // Start the AD conversion
                            ADCSRA|=0x40;
                            // Wait for the AD conversion to complete
                            while ((ADCSRA & 0x10)==0);
                            ADCSRA|=0x10;
                            return ADCW;
                          }
                          
                          
                          void main(void)
                          {   unsigned int a=0,b=0;
                            char lcd_buff1[16],lcd_buff2[16];
                            lcd_init(16);
                            // Declare your local variables here
                           
                            PORTB=0x00;
                            DDRB=0x06;
                            // Timer/Counter 1 initialization
                            // Clock source: System Clock
                            // Clock value: 8000.000 kHz
                            // Mode: Fast PWM top=ICR1
                            // OC1B output: Non-Inv.
                            // Input Capture on Falling Edge
                            TCCR1A=0x22;
                            TCCR1B=0x19;
                            ICR1L = 64;
                            // ADC initialization
                            // ADC Clock frequency: 62.500 kHz
                            // ADC Voltage Reference: AVCC pin
                            ADMUX=ADC_VREF_TYPE & 0xff;
                            ADCSRA=0x87;
                          
                            while (1)
                            {  
                              a = read_adc(0)*8;
                              b = (float)(((float)read_adc(1)/1023))*a;
                              ICR1H = a >> 8;
                              ICR1L = a & 0xFF;
                              OCR1BH = b >> 8;
                              OCR1BL = b & 0xFF;
                              delay_ms(50);
                              lcd_clear();
                              sprintf(lcd_buff1,"duty cycle=%2",b);
                              lcd_gotoxy(0,0);
                              lcd_puts(lcd_buff1);
                              sprintf(lcd_buff2,"time=%4",a);
                              lcd_gotoxy(0,1);
                              lcd_puts(lcd_buff2);
                              delay_ms(500);
                              };
                              }
                          سلام
                          نتم قطع بود... مرسی دستتون درد نکنه واقعا برنامه خوبیه کلی کارمو راه انداخت.... :smile:

                          دیدگاه


                            #28
                            پاسخ : پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر

                            نوشته اصلی توسط mhfd
                            سلام
                            نتم قطع بود... مرسی دستتون درد نکنه واقعا برنامه خوبیه کلی کارمو راه انداخت.... :smile:
                            درود
                            خواهش میکنم
                            این برنامه از برنامه قبلی خیلی بهتره و هوشمندتر هست ...
                            امیدوارم که حالش را ببرید ...
                            خندان و پیروز باشید
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه


                              #29
                              پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر با ولوم و نمایش رویlcd با avr

                              با سلام مجدد خدمت مهندس سامان عزیز وبا تشکر از رحماتتون
                              همونطور که خدمتتون عرض کردم این مدار و برنامه تو پروتیوس جواب میده ولی نمیدونم چرا روی برد pcp قسمت lcd جواب نمیده همه چیزم چک کردم چند بار پایه 3 lcd هم با پتانسومتر تنظیم کردم مربع های مشکی توردیف پایین ظاهر میشه و ولتاز همه پایه های مربوط به ال سی دیهم درسته ( البته به جز vref که نمیدونم چرا 5 ولت خروجی میده که البته با یک خازن به زمین متصل شده مگه نباید صفر باشه؟) مدارمم هیچ اتصالی نداره همه چیزم رعایت کردم ....لطفا اگه وقتتونو نمیگیره یه نگاهی به برنامش بندازین باتشکر...

                              دیدگاه


                                #30
                                پاسخ : تولید فرکانس و دیوتی سایکل قابل تغییر با ولوم و نمایش رویlcd با avr

                                نوشته اصلی توسط mhfd
                                با سلام مجدد خدمت مهندس سامان عزیز وبا تشکر از رحماتتون
                                همونطور که خدمتتون عرض کردم این مدار و برنامه تو پروتیوس جواب میده ولی نمیدونم چرا روی برد pcp قسمت lcd جواب نمیده همه چیزم چک کردم چند بار پایه 3 lcd هم با پتانسومتر تنظیم کردم مربع های مشکی توردیف پایین ظاهر میشه و ولتاز همه پایه های مربوط به ال سی دیهم درسته ( البته به جز vref که نمیدونم چرا 5 ولت خروجی میده که البته با یک خازن به زمین متصل شده مگه نباید صفر باشه؟) مدارمم هیچ اتصالی نداره همه چیزم رعایت کردم ....لطفا اگه وقتتونو نمیگیره یه نگاهی به برنامش بندازین باتشکر...
                                سلام
                                خواهش میکنم ...
                                مدار را دقیقا مثل همین ببندید و مطمئن باشید که جواب خواهید گرفت ...
                                ابتدا روی برد بورد امتحان کنید و در صورت جواب گرفتن سپس آن را PCB کنید ...

                                http://s6.picofile.com/file/8186755334/PWM_ADC_90Khz_2_.zip.html

                                موفق باشید
                                [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                                معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                                معرفی نرم افزار Codewizard PWM
                                با من بیشتر آشنا شوید

                                دیدگاه

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