اطلاعیه

Collapse
No announcement yet.

مشکل در نشان دادن عقربه ای واتاژ

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

    مشکل در نشان دادن عقربه ای واتاژ

    سلام یه سوالی داشتم
    من میخواستم برنامه یک ولتمتر 0 تا 5 ولت dc رو با mega32 در کدویژن بنویسم که علاوه بر نشان دادن ولتاژ روی lcd ، ولتاژ را به صورت عقربه ای انالوگ روی glcd نمایش بده.
    من برنامشو نوشتم ، مشکلم با نشان دادن انالوگ ولتاژ است .
    برنامه ای که نوشتم رو میذارم ،ممنون میشم بگین اشکال برنامه چیه .
    کد:
    #include <mega32a.h>
    #include <delay.h>
    #include <alcd.h>
    #include <glcd.h>
    #include <font5x7.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))
    float volt;
    char str[10];
    
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | ADC_VREF_TYPE;
    
    delay_us(10);
    
    ADCSRA|=(1<<ADSC);
    
    while ((ADCSRA & (1<<ADIF))==0);
    ADCSRA|=(1<<ADIF);
    return ADCW;
    }
    
    void main(void)
    {
    float theta;
    GLCDINIT_t glcd_init_data;
    
    
    DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
    PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
    
    DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
    
    DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
    PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
    
    DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
    PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
    
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
    SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
    
    lcd_init(16);
    
    glcd_init_data.font=font5x7;
    glcd_init_data.readxmem=NULL;
    glcd_init_data.writexmem=NULL;
    glcd_init(&glcd_init_data);
    glcd_clear();
    delay_ms(10);
    glcd_arc(64,32,0,180,30);
    glcd_line(64,1,64,3);
    glcd_line(85,9,85,13);
    glcd_line(43,9,43,13);
    glcd_outtextxy(96,32,"5");
    glcd_outtextxy(29,32,"0");
    
    while (1)
     {
      volt=read_adc(0);
      if (volt==0)
      {
      ftoa(volt,2,str);
      lcd_putsf("volt=0.00");
      delay_ms(100);
      lcd_clear();
      }
      else 
      {
      volt=volt/204.6;
      ftoa(volt,2,str);
      lcd_putsf("V = ");
      lcd_puts(str);
      lcd_putsf(" (volt)");
      delay_ms(100);
      lcd_clear();
      }
      
      
      theta=volt*36;
      glcd_line(64,32,64-30*cos(theta),32-30*sin(theta));
      
      
     }
    }

    #2
    پاسخ : مشکل در نشان دادن عقربه ای واتاژ

    شما دقیقا تو کجا اشکال دارین بگین رفع میشه

    منظورم اینه که تو خوندن یا نشون دادن؟
    Telegram:
    @reza_br_2489


    Instagram:
    _amp_c

    دیدگاه


      #3
      پاسخ : مشکل در نشان دادن عقربه ای واتاژ

      نوشته اصلی توسط noorworkshop
      شما دقیقا تو کجا اشکال دارین بگین رفع میشه

      منظورم اینه که تو خوندن یا نشون دادن؟
      مشکل من توی نشان دادن ولتاژ به صورت انالوگ روی glcd هست. در قسمت اخر برنامه برای اینکار از دستور
      کد:
      glcd_line(64,32,64-30*cos(theta),32-30*sin(theta));
      استفاده کردم که مشکل من هم همینجا است وقتی به صورت ریاضی حساب میکنم درست درمیاد ولی در برنامه جواب نمیده یک مثال میزنم تا بهتر متوجه بشین
      من روی glcd یک نیم دایره به مرکز 64 و32 و شعاع 30 رسم کردم
      مثلا ولتاژ 2.5 را در نظر میگیریم برای نشان دادن این ولتاژ باید یک خط که ابتدای ان 64 و 32 (مرکز نیم دایره ) باشد و زاویه ان 90 درجه (چون 2.5 وسط 5 هست پس بین 0 تا 180 درجه باید 90 باشد) ، پس مختصات انتهای ان
      کد:
      64-30*cos(theta)
      و
      کد:
      32-30*sin(theta)
      است که theta برای این ولتاژ 90 است.
      زاویه خط با یک تناسب به دست میاد که ولتاژ را اگر در 36 ضرب کنیم به دست میاد
      حالا این کد جواب نمیده در صورتیکه به صورت ریاضی برای هر ولتاژی درست درمیاد ولی نمیدونم مشکلش چیه که جواب نمیده.

      دیدگاه


        #4
        پاسخ : مشکل در نشان دادن عقربه ای واتاژ

        شما ابتدا در این برنامه یک عقربه رسم کنید(مثلا30درجه)
        ببینید اونوقت جواب میده یا نه
        اگه جواب نداد برنامه اشکال داره(اساسا)و باید دوباره همه جاش کنترل شه
        ولی اگه نشون داد اونوقت اون فرمول اخری اشکال داره شما امتحان کنید اگه جواب نگرفتید بگید
        شماتیک مدارتونو قرار بدید
        Telegram:
        @reza_br_2489


        Instagram:
        _amp_c

        دیدگاه

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