اطلاعیه

Collapse
No announcement yet.

خطی ساز

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

    #46
    پاسخ : خطی ساز

    دمت دایی
    وقتی بیسیکم بهتر شد برنامتو ادیت می کنم. اما یه نگاه کلی نشون میده که خیلی ولخرجی کردی! میکرو با PCآ‌ فرق داره دایی. یه محاسبه اعشاری براش مثل کوه کندنه.
    - دقیقا جای 10 کیلواهم رو درست متوجه شدی.
    - تقویت کننده داخلی میکرو توی زبان C با تغییر رجیستر کنترلی ADC انتخاب میشه. توی بیسیک نمی دونم! البته باید بگی ولتاژ پایه 2 ولومت از چند تا چند ولت تغییر می کنه. وقتی زاویه از مینیمم تا ماکزیمم مورد نیازت میره.
    - یه مقاومت 1 مگااهم بردار و 125 دور سیم خیلی نازک دورش بپیچ. دو طرف سیم رو به دوپایه مقاومت وصل کنه. اینجوری سلف 10 میکروهانری داری.
    - بهترین راه اینه که کاراکتر خالی (space) رو توی اون قسمت بنویسی.
    با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

    دیدگاه


      #47
      پاسخ : خطی ساز

      سلاممممم
      بالاخره تونستم سلف پیدا کنم،وقتی سلف و خازن و مقاومت 10 کیلو رو گذاشتم دیگه اصلا نویز ندارم و اصلا نمی پره :job: :job:
      مرسییییییی داییییییییییییییییی :wow: :wow:
      حالا فقط می مونه پیدا کردن رابطه
      ماگزیمم ولتاژ 5.04 به ازای زاویه 0 هست و 4.53 به ازای یک دور زاویه 360 هست رویه پایه 2 ولوم ومقدار adc ، 1023 به ازای زاویه 0 و 919 هم یک دور 360 هست.
      زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

      دیدگاه


        #48
        پاسخ : خطی ساز

        ای ول دایی جان
        اما هنوز یه اشتباه کوچیک داری.
        باید سیمی که به پایه 1 و 3 ولوم میره رو جابجا کنی. یا اینکه ولوم رو تا ته بچرخونی و وقتی به انتها رسید صفر درجه باشه.
        اینجوری اعدادی که می خونه میشه بین 0 تا 103 به ازای صفر تا 360 درجه.
        خب رابطه هم معلومه هر چی می خونی باید ضربدر 360 و تقسیم بر 103 کنی تا زاویه بدست بیاد.
        در نهایت برای بالا بردن دقت دو راه داری.
        یکی اینکه توی نرم افزار سرعت تبدیل ADC رو روی حداقل ست کنی. این باعث کاهش شدید نویز میشه. بعد یه متغیر بنام sum تعریف کنی و 360 بار که از ADC می خونی رو هی با sum جمع کنی. اینجوری دیگه نیاز نیست عدد رو در 360 ضرب کنی. یعنی بصورت نرم افزاری خودش در 360 ضرب شده. بعد این عدد رو تقسم بر 103 کن تا زاویه بدست بیاد. زاویه با دو رقم اعشار اضافه. یعنی دقت فوق العاده بالا.
        راه دوم اینه که از گین داخلی میکرو استفاده کنی. برای استفاده از گین باید ولتاژ ولوم رو به پایه ADC1 بدی و پایه ADC0 میکرو رو به GND وصل کنی.
        توی برنامه هم باید این خط رو آخر تنظیمات اضافه کنی:
        ADMUX=73
        اینجوری ولتاژی که به ADC1 میکرو میرسه ضربدر 10 میشه و و دقتت 10 برابر میشه.
        تازه اگه با روش 360 بار خوندن ترکیب بکنی که دقتت 1000 برابر میشه و می تونی این کالا رو توی بازار عرضه کنی.
        با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

        دیدگاه


          #49
          پاسخ : خطی ساز

          سلام دایی
          منظورتون اینه که بعد از اینکه نمونه گیریشو با 15 بار میانگین گیری انجام داد ، جوابشو بریزه توی sum و تا 360 بار به sum اضافه کنه و بعد تقسیم بر 103 کنه و sum رو صفر کنه ، یا اینکه این 360 بار رو به جای میانگین گیری بذارم ؟
          سرعت تبدیل adc رو چه جوری می شه رو حداقل ست کرد ؟ اگه با کدویژن بگین ، یکم کدویژن بلدم ، یه چیزهایی میفهمم :redface:
          این ADMUX=73 تو کدویژن هست دیگه ؟
          اگه بخوام هم با درجه نشون بده و هم با دقیقه ، یعنی مثلا 45 درجه و 20 دقیقه، بگم قسمت صحیح رو به عنوان درجه نشون بده و اعشارشو در 60 ضرب کنه و به دقیقه نشون بده ، درسته یا باید کار دیگه ای کرد ؟ هر 60 درجه یک دقیقه هست دیگه؟
          برای نشون دادن علامت درجه و دقیقه روی lcd تو کدویژن باید چیکار کرد؟ که یک دایره کوچیک بالای عدد بزاره برای درجه و یک خط برای دقیقه؟ تو بسکام lcd designer این کار رو میکنه !!!!
          دستوری هست که بشه توی کدویژن یک قسمتی رو با یه زبون دیگه نوشت که این قسمت رو با بسکام بنویسم و اضافه کدویژن کنم یا نه ؟
          من از atmega16 استفاده کردم ، atmega8 هم جواب می ده ، دیگه ؟
          زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

          دیدگاه


            #50
            پاسخ : خطی ساز

            دومی دایی جان
            بجای 15 بار 360 بار بخون. بعد بجای تقسیم بر 360، تقسیم بر 103 بکن. اینجوری نتیجه بین 0 تا 360 میشه.
            ADC کلاک داره و میشه روی چندین کلاک تنظیمش کرد. توی کدویزاد بری می بینی. هرچی کلاک کمتر باشی سرعت ADC پایینتر میاد و دقتش بیشتر میشه.
            یه نکته کلی توی نمایشگرها وجود داره که رعایتش مفیده:
            چشم آدمی سرعت های بالا رو اصلا نمی بینه. بخاطر همین نمیشه با سرعت های بالا رو LCD نمایش داد، چون چشم نمی تونه ببینه. ما از این خاصیت استفاده می کنیم. حالا که باید با سرعت پایین(حداکثر 10 بار در ثانیه) نمایش بدیم و ADCآ‌ما سرعت بالاست، می تونیم هرچی دلمون خواست متوسط گیری کنیم و دقتمونو بالا ببریم.
            مثلا اگه سرعت ADC روی 5000 نمونه در ثانیه باشه. می تونیم 500 بار متوسط گیری کنیم و دقت رو 500 برابر بیشتر کنیم.
            ADMUX=73 ربطی به زبان برنامه نویسی نداره. ADMUX یه رجیستر داخلی میکرو است و در تمام زبانها میشه توش نوشت.

            قسمت زلم زیمبو و نمایش رو بزار برای بعد دایی. من علامت درجه رو روی LCD نشون دادم و هیچ مشکلی نداره. از character map ویندوز استفاده کردم. اینجوری هر علامتی رو که دوست داره می تونی نمایش بدی.
            البته من از کتابخانه های کدویژن استفاده نمی کنم و برای خودم کتابخونه دارم. ولی فکر نکنم فرقی کنه.
            بهر حال فعلا شما درجه رو با بیشترین دقت نشون بده تا بعد قسمت اعشارشو ضربدر 60 کنی و بصورت دقیقه نشون بدی.
            با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

            دیدگاه


              #51
              پاسخ : خطی ساز

              به جای 15 ،360 گذاشتم ، و تقسیم بر 103 کردم ، اما روی lcd هیچی نشون نمی ده :sad: :sad:
              هم با تایمر 0 . هم با تایمر 1 امتحان کردم نشد :redface: :redface:
              ADMUX=73 رو اضافه کردم ، adc0 رو هم زمین کردم و ولوم رو به adc 1 دادم ،ولی دقت 3.5 درجه هست ، از این کمتر نمی شه ، قبلش هم همین بود، یعنی وقتی adc صفر هست که صفر درجه نشون می ده و وقتی adcمقدار 1 داره زاویه 3.5 رو نشون می ده !!!!!!!!!!
              نمی شه کمتر هم نشون بده؟
              برای کلاک adc توبسکام یک مد auto داره و می شه گزینه های 2،4،8،16،32،64و128 رو انتخاب کرد که من رو مد auto گذاشتم ، مد auto با توجه به فرکانس کریستال خودش بهترین حالت رو انتخاب می کنه ، کریستال هم از 4 MHZ داخلی استفاده کردم ، حالا اگه بخوام سرعت کمتر شه کدوم رو باید انتخاب کنم ؟
              تو کدویژن که کمترینش 31.250کیلو هرتزبود
              زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

              دیدگاه


                #52
                پاسخ : خطی ساز

                به تایمر چه ربطی داری داره دایی جان.
                هربار که ADC رو می خونیم و مقدارشو با sum جمع می کنیم، باید یه متغیر به اسم مثلا sum_counter رو اضافه کنیم.
                هروقت sum_counter به 360 رسید باید sum رو به 103 تقسیم و داخل متغیر اعشاری بنام مثلا angle بریزیم.
                بعد sum , sum_counter رو صفر می کنیم و از نو شروع می کنیم.
                angle رو هم روی LCD نمایش میدیم.
                با این روش دقت میشه 1 درجه.
                ADMUX=73 استفاده کنی دقت میشه 0.1 درجه چون ولتاژ 10 برابر میشه و عدد ADC میشه صفر تا 1030
                توی کدویژن من از کلاک 31.250 استفاده می کنم تا کمترین سرعت برای ADC داشته باشم.
                با این کلاک ADC می تونه 2400 نمونه در ثانیه تبدیل کنه.
                و اگه 360 نمونه رو برای متوسط گیری انتخاب کنی می تونی با سرعت 6 بار در ثانیه روی LCD نمایش بدی که سرعت بسیار خوبیه.
                با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                دیدگاه


                  #53
                  پاسخ : خطی ساز


                  می خواستم یه جورایی از وقفه استفاده کنم !!!!!!!!!!! :redface:
                  همون کاریو که گفتین انجام دادم ، فقط رو بعضی زاویه ها خیلی پرش داره ، اصلا ثابت نمی شه، بغد از 318 درجه به منفی تبدیل می شه و کاهش پیدا می کنه تا جایی که به جای 360 ، 276 - رو نشون می ده !!!!!!!!چرا اینجوری می شه ؟؟ مشکا از کجاست؟
                  زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

                  دیدگاه


                    #54
                    پاسخ : خطی ساز

                    این یعنی overflow دایی جان
                    مثلا متغیر unsignded int می تونه صفر تا 65535 رو ذخیره کنه. اگه عددی بزرگتر رو بخوای توش بریزی overflow میشه.
                    اگه برنامه رو با کدویژن بنویسی رفع اشکال ساده تر میشه.
                    اینتراپت بدرد جاهایی می خوره که میکرو کلی کار و گرفتاری داره و فرصت نمی کنه به ADC سر بزنه. در این پروژه میکروی تنبل شما کاری نمی کنه که حالا بخوای با اینتراپت بهش یاری برسونی.
                    پرش هم احتمالا بخواطر اینه که بیت ADCIF رو چک نمی کنی و ADCآ‌رو می خونی. یعنی قبل از اینکه ADCآ‌کارش تموم بشه.
                    البته این یه حدسه و ممکنه اشکال در محاسبات باشه.
                    با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                    دیدگاه


                      #55
                      پاسخ : خطی ساز

                      سلام دایی
                      بعد کلی تونستم یه برنامه ای با کدویژن با کدویزاردش بنویسم !!!!! :redface: :redface:
                      اما هر کاری می کنم کد هگز نمی سازه !!!! باید چیکار کنم؟هیچ خطایی هم نداره!!!
                      اینم از برنامه:
                      /************************************************** ***
                      This program was produced by the
                      CodeWizardAVR V1.24.6 Evaluation
                      Automatic Program Generator
                      © Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
                      http://www.hpinfotech.com
                      e-mailffice@hpinfotech.com

                      Project :
                      Version :
                      Date : 7/10/2011
                      Author : Freeware, for evaluation and non-commercial use only
                      Company :
                      Comments:


                      Chip type : ATmega16
                      Program type : Application
                      Clock frequency : 4.000000 MHz
                      Memory model : Small
                      External SRAM size : 0
                      Data Stack size : 256
                      ************************************************** ***/

                      #include <mega16.h>

                      // Alphanumeric LCD Module functions
                      #asm
                      .equ __lcd_port=0x12 ;PORTD
                      #endasm
                      #include <lcd.h>
                      #include <stdio.h>
                      #include <stdlib.h>

                      #define ADC_VREF_TYPE 0x00

                      // Read the AD conversion result
                      unsigned int read_adc(unsigned char adc_input)
                      {
                      ADMUX=adc_input|ADC_VREF_TYPE;
                      // Start the AD conversion
                      ADCSRA|=0x40;
                      // Wait for the AD conversion to complete
                      while ((ADCSRA & 0x10)==0);
                      ADCSRA|=0x10;
                      return ADCW;
                      }
                      unsigned int a,sample=0;
                      int sum=0;
                      float angle;
                      char str1[20],str2[20];

                      // Declare your global variables here

                      void main(void)
                      {
                      // Declare your local variables here

                      // Input/Output Ports initialization
                      // Port A initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                      PORTA=0x00;
                      DDRA=0x00;

                      // Port B initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                      PORTB=0x00;
                      DDRB=0x00;

                      // Port C initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                      PORTC=0x00;
                      DDRC=0x00;

                      // Port D initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                      PORTD=0x00;
                      DDRD=0x00;

                      // Timer/Counter 0 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 0 Stopped
                      // Mode: Normal top=FFh
                      // OC0 output: Disconnected
                      TCCR0=0x00;
                      TCNT0=0x00;
                      OCR0=0x00;

                      // Timer/Counter 1 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 1 Stopped
                      // Mode: Normal top=FFFFh
                      // OC1A output: Discon.
                      // OC1B output: Discon.
                      // Noise Canceler: Off
                      // Input Capture on Falling Edge
                      // Timer 1 Overflow Interrupt: Off
                      // Input Capture Interrupt: Off
                      // Compare A Match Interrupt: Off
                      // Compare B Match Interrupt: Off
                      TCCR1A=0x00;
                      TCCR1B=0x00;
                      TCNT1H=0x00;
                      TCNT1L=0x00;
                      ICR1H=0x00;
                      ICR1L=0x00;
                      OCR1AH=0x00;
                      OCR1AL=0x00;
                      OCR1BH=0x00;
                      OCR1BL=0x00;

                      // Timer/Counter 2 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 2 Stopped
                      // Mode: Normal top=FFh
                      // OC2 output: Disconnected
                      ASSR=0x00;
                      TCCR2=0x00;
                      TCNT2=0x00;
                      OCR2=0x00;

                      // External Interrupt(s) initialization
                      // INT0: Off
                      // INT1: Off
                      // INT2: Off
                      MCUCR=0x00;
                      MCUCSR=0x00;

                      // Timer(s)/Counter(s) Interrupt(s) initialization
                      TIMSK=0x00;

                      // Analog Comparator initialization
                      // Analog Comparator: Off
                      // Analog Comparator Input Capture by Timer/Counter 1: Off
                      ACSR=0x80;
                      SFIOR=0x00;

                      // ADC initialization
                      // ADC Clock frequency: 31.250 kHz
                      // ADC Voltage Reference: AREF pin
                      // ADC Auto Trigger Source: None
                      ADMUX=ADC_VREF_TYPE;
                      ADCSRA=0x87;
                      ADMUX=73;

                      // LCD module initialization
                      lcd_init(16);

                      while (1)
                      {
                      a=read_adc(1);
                      sum=sum+a;
                      sample++;
                      if(sample==360){
                      angle=sum/103;
                      sample=0;
                      sum=0;
                      }
                      lcd_clear();
                      lcd_gotoxy(0,0);
                      lcd_putsf("degree : "
                      lcd_gotoxy(0,1);
                      ftoa(angle,3,str1);
                      sprintf(str2,"x:%6s",str1);
                      lcd_puts(str2);
                      // Place your code here

                      };
                      }
                      زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

                      دیدگاه


                        #56
                        پاسخ : خطی ساز

                        اول اینکه کدویژن نسخه 2.05.0 رو از توی انجمن دانلود و نصب کن.
                        دوم اینکه وقتی باز کردی new project بساز و برای هر فایل اسم بده.
                        یه دایرکتوری هم به کل پروژه اختصتص بده تا فایلات پخش و پلا نشن.
                        هر وقت می خوای برنامه رو باز کنی بای open project کنی. نه اینکه فقط یه فایل رو باز کنی.
                        کدویژن توی دایرکتوری اصلی چند تا سابدایرکتوری میسازه که یکیش EXE اسمشه. توش فایل هگز هست.
                        البته می تونی از خود کدویژن پروگرام کنی.
                        با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                        دیدگاه


                          #57
                          پاسخ : خطی ساز

                          سلام
                          از کجای انجمن دانلود کنم؟؟؟
                          تو بخش دانلود که نبود!!!!!!!!!!!
                          زندگی تاس خوب آوردن نیست ، تاس بد را خوب بازی کردن است

                          دیدگاه


                            #58
                            پاسخ : خطی ساز

                            http://www.eca.ir/forum2/index.php?topic=47005
                            با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.

                            دیدگاه

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