Thông báo

Collapse
No announcement yet.

Vấn đề về mạch đo nhiệt độ bằng atmega8l và lm35?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Nguyên văn bởi chung1608 Xem bài viết
    sai rồi nhé, bạn đang chạy ADC 8 bit nên kết quả nó ra bị sai. Khi khai báo ADC thì phải bỏ ko chọn ô 8 bits
    hic hic tại tui dựa trên công thức trên của bác hoahauvn2 nên mới sử dụng 8bit, mà trường hợp của tui có check hay ko cũng báo lỗi giống như dự đoán của bác hoahauvn2 ấy ^^! dù sao cũng thank bác nhiều ^^

    To hoahauvn2: thanks bác nhiều nha, hi vọng của tìm ra được chính xác lỗi của tui ^^

    Comment


    • #17
      Nguyên văn bởi lion080889 Xem bài viết
      hic hic tại tui dựa trên công thức trên của bác hoahauvn2 nên mới sử dụng 8bit, mà trường hợp của tui có check hay ko cũng báo lỗi giống như dự đoán của bác hoahauvn2 ấy ^^! dù sao cũng thank bác nhiều ^^

      To hoahauvn2: thanks bác nhiều nha, hi vọng của tìm ra được chính xác lỗi của tui ^^
      Ok như đã hứa với bạn

      Vào vấn đề chính thôi.

      Đầu tiên là phần thiết lập Codevision, bạn có thể làm theo y chang mình nếu muốn, mình có 1 thói quen là dùng thạch anh ngoài, còn nếu bạn có thay đổi để tiện cho bạn, mình ko đảm bảo mạch có chạy hay không đâu nha.
      Click image for larger version

Name:	thiet lap codevision.png
Views:	1
Size:	141.3 KB
ID:	1391829

      Tiếp đến là Code: đương nhiên mình ko tự ngồi chém ra cái code này mà phải bỏ chút thời gian tìm hiểu con LM35 và tham khảo từ 1 nguồn đáng tin cậyhttp://codientu.org/threads/do-nhiet...ien-lm35.5018/ ở đây họ dùng pic, mình chỉ tham khảo cái hàm quy đổi ADC ra nhiệt độ rồi lập trình lại trên ATmega8L.
      PHP Code:
      /*****************************************************
      This program was produced by the
      CodeWizardAVR V2.05.6 Evaluation
      Automatic Program Generator
      © Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com

      Project : 
      Version : 
      Date    : 26-01-2014
      Author  : Freeware, for evaluation and
      non-commercial use only
      Company : 
      Comments: 


      Chip type               : ATmega8L
      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>

      // Alphanumeric LCD functions
      #include <alcd.h>

      #define FIRST_ADC_INPUT 0
      #define LAST_ADC_INPUT 0
      unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
      #define ADC_VREF_TYPE 0x00

      // ADC interrupt service routine
      // with auto input scanning
      interrupt [ADC_INTvoid adc_isr(void)
      {
      static 
      unsigned char input_index=0;
      // Read the AD conversion result
      adc_data[input_index]=ADCW;
      // Select next ADC input
      if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
         
      input_index=0;
      ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE 0xff))+input_index;
      // Delay needed for the stabilization of the ADC input voltage
      delay_us(10);
      // Start the AD conversion
      ADCSRA|=0x40;
      }

      // Declare your global variables here
      unsigned char tram,chuc,donvi;
      unsigned int nhiet_do;

      void display(unsigned char data)
      {
       
      tram=data/100;
       
      chuc=(data-tram*100)/10;
       
      donvi=(data-tram*100-chuc*10);
       
      lcd_putchar(tram+48);
       
      lcd_putchar(chuc+48);
       
      lcd_putchar(donvi+48);
      }

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

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

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

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

      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      TCCR0=0x00;
      TCNT0=0x00;

      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: Timer1 Stopped
      // Mode: Normal top=0xFFFF
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer1 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: Timer2 Stopped
      // Mode: Normal top=0xFF
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;

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

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

      // USART initialization
      // USART disabled
      UCSRB=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: 125.000 kHz
      // ADC Voltage Reference: AREF pin
      ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE 0xff);
      ADCSRA=0xCE;

      // SPI initialization
      // SPI disabled
      SPCR=0x00;

      // TWI initialization
      // TWI disabled
      TWCR=0x00;

      // Alphanumeric LCD initialization
      // Connections are specified in the
      // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
      // RS - PORTD Bit 0
      // RD - PORTD Bit 1
      // EN - PORTD Bit 2
      // D4 - PORTD Bit 4
      // D5 - PORTD Bit 5
      // D6 - PORTD Bit 6
      // D7 - PORTD Bit 7
      // Characters/line: 16
      lcd_init(16);

      // Global enable interrupts
      #asm("sei")

      delay_ms(1000);
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_putsf("XIN CHAO CAC BAN");
      lcd_gotoxy(0,1);
      lcd_putsf(" NHIET KE LM35 ");
      delay_ms(2500);
      lcd_clear();

      lcd_gotoxy(0,0);
      lcd_putsf("NHIET DO:    f\xdfC");
      lcd_gotoxy(0,1);
      lcd_putsf("Good Weather ^^");



      while (
      1)
            {
            
      // Place your code here
             
      nhiet_do=adc_data[0];
             
      nhiet_do=nhiet_do/2.048;
             
              
             
      lcd_gotoxy(11,0);
             
      display(nhiet_do);

            }

      Và cuối cùng là mô phỏng. Lưu ý phải thiết lập con Atmega8 giống y như mình nha, ko thì nó ko nhận code đâu vì mình thấy bạn dùng dao động nội 1Mhz, còn mình dùng thạch anh ngoài 8Mhz.
      Click image for larger version

Name:	mo phong proteus va mach that xx.png
Views:	1
Size:	201.9 KB
ID:	1391830

      Mình cũng test trên mạch thực tế rất OK nhưng máy chụp hình bị hư nên ko chụp lại được, bạn thông cảm.

      Đến phần có lẽ là bạn nên quan tâm nhất đây, đó là những cái sai và những lưu ý:
      _Các chân ko có tác vụ tại tất cả các Port phải thiết lập là chân Output tránh nhiễu.
      _Avcc và Aref phải qua cuộn cảm chống trôi giá trị ADC, mình dùng 680uH.
      _Mô phỏng chỉ là mô phỏng, thực tế cần rất nhiều thứ khác như tụ lọc nguồn, thạch anh, biến trở contrast và light...

      Mọi thứ chỉ có vậy thôi, còn lại phụ thuộc vào khả năng của bạn, vì nếu mạch của bạn chỉ chạm 1 chân linh kiện là mọi thứ đổ bể hết hà. Chúc thành công.
      Ahh quà năm mới là file code và mô phỏng đầy đủ nè (lưu ý down sớm nha vì đến tết là mình dọn rác acc mediafire của mình đấy, xóa trắng hết đấy).
      code lm35 atmega8
      Last edited by hoahauvn2; 26-01-2014, 19:43.
      Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
      Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

      Comment


      • #18
        ADC_value/2.048 hay ADC_value*0.488 đều như nhau. Nhưng độ phân giải ko phải là 1024 mà là 1023 mới đúng
        Last edited by chung1608; 26-01-2014, 19:51.

        Comment


        • #19
          Nguyên văn bởi chung1608 Xem bài viết
          ADC_value/2.048 hay ADC_value*0.488 đều như nhau. Nhưng độ phân giải ko phải là 1024 mà là 1023 mới đúng
          Ohh cám ơn bác nhiều, vội quá nên ko kịp nhìn ra cái này, mém nữa nói oan cho người ta rồi, nếu vậy mình cũng ko biết bạn chủ thớt bị gì nữa, có lẽ mạch điện của bạn ấy gặp vấn đề chăng. Mà bác quả là cao thủ, nhìn vấn đề nhanh thật. Còn về phần ADC Đúng là ADC phải 10 bit. Nếu bạn chủ thớt làm theo mình mà vẫn lỗi có khi con VĐK hoặc LM35 của bạn ấy die rồi cũng nên
          Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
          Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

          Comment


          • #20
            thật sự rất cảm ơn các bác nhiều lắm, để tui thử xem sao

            lúc sáng thử cái đơn giản test thử, sử dụng 10bit mặc định và xuất giá trị của adc ra lcd, có tạo biến chạy show ra lcd để xem có phải treo hay ko, kết quả là do tín hiệu từ lm35 ok (hơ lửa thì thấy thay đổi rõ ràng), show ra màn hình thì cho ra 1023, biến chạy vẫn chạy bình thường chứng tỏ ic ko treo ^^ nhưng khi hơ lửa lm35 thì vẫn thấy 1023, ko thấy thay đổi gì cả.

            để thử hướng dẫn của bác xem thế nào ^^

            thank các bác nhiều lắm.

            Comment


            • #21
              sau khi xem sơ đồ mạch của bác thì tui biết tui đã sai ở đâu để sửa lại và nó đã chạy được (dù chạy được 1 lần, lần sau gắn lại số nó chạy lung tung chắc do mạch lỏng), tiện dịp này bác cho tui hỏi thêm những cái cơ bản liên quan nha.

              1. vấn đề về thạch anh, nhiệm vụ của nó là tạo dao động, trường hợp tạo dao động cho avr thì nó có thể được xem như là ép xung CPU trong máy tính vậy đúng ko? thạch anh là 1mhz tăng lên 8mhz thì có phải tốc độ xử lý của nó nhanh gấp 8 lần đúng ko? có gì khác biệt giữa việc dùng thạch anh nội và ngoại? atmega8l có thể tùy set từ 1 đến 8mhz, còn set ngoại thì có thể cao hơn nhiều lần tùy theo datasheet, có phải sự khác nhau của nó là vậy? khi tui dùng thạch anh 8mhz, trong code sử dụng delay_ms(1000) thì thấy nó chờ chưa đủ 1s thì xong rồi, còn nếu dùng 1mhz thì thấy nó chính xác hơn, vậy ta có nên dùng 8mhz ko?

              2. Cuộn cảm, trong tài liệu nói dùng cuộn cảm cho trường hợp trên nhằm mục đích cấp nguồn ổn định cho các kênh đầu vào của bộ chuyển đổi, tui cũng chưa hiểu được chức năng thật sự của cuộn cảm, thấy có mạch làm bẫy sóng RF (cũng từng thử làm cái phát sóng và bẫy sóng RF nhưng ko được ^^!), thấy bài viết của bác search thử mới biết chức năng của cuộn cảm có thể lọc tín hiệu, giúp ổn định dòng,... nhưng wa ứng dụng này tui cũng khó thấy được tác dụng của nó vì hình như ko đang kể để thấy được. mạch của bác dùng 680uH nhưng tui ko có nên dùng 100uH ko biết có sao ko?

              3. cuối cùng là code ^^
              PHP Code:
              lcd_putsf("NHIET DO:    f\xdfC"); 
              "f\xdfC" khi xuất ra nó là ký tự đặc biệt của từ 0C phải ko? mấy cái ký tự đặc biệt này của C tui chưa tìm ra ^^!

              Có rất nhiều điều mà tui chưa biết nên hay gặp trở ngại về việc tìm hiểu lập trình cho vdk, mong các bác giúp đỡ ^^

              Comment


              • #22
                chào các bác, sau các vấn đề ở trên, tui lại gặp 1 vấn đề về lcd, lcd của tui có 16 chân, chân 15 và chân 16 dùng mở sáng đèn lcd, nhưng khi chân 16 nối tiếp đất thì kết quả độ C bị sai, tháo chân 16 này ra thì ok? nên giờ muốn sử dụng đèn lcd mà ko được, trong trường hợp này phải giải quyết sao vậy các bác? khi nối trực tiếp chân 16 của lcd xuống max rồi đo tín hiệu của lm35 tại chân out và max thì ra ok, nhưng khi lấy kim đen (đồng đồ đo) đo ở điểm max gần phía lcd thì do được trên 40, còn điểm max gần lm35 thì ra đúng @@!

                Comment


                • #23
                  Nguyên văn bởi lion080889 Xem bài viết
                  chào các bác, sau các vấn đề ở trên, tui lại gặp 1 vấn đề về lcd, lcd của tui có 16 chân, chân 15 và chân 16 dùng mở sáng đèn lcd, nhưng khi chân 16 nối tiếp đất thì kết quả độ C bị sai, tháo chân 16 này ra thì ok? nên giờ muốn sử dụng đèn lcd mà ko được, trong trường hợp này phải giải quyết sao vậy các bác? khi nối trực tiếp chân 16 của lcd xuống max rồi đo tín hiệu của lm35 tại chân out và max thì ra ok, nhưng khi lấy kim đen (đồng đồ đo) đo ở điểm max gần phía lcd thì do được trên 40, còn điểm max gần lm35 thì ra đúng @@!
                  bạn có nối trở cho đèn nền LCD chưa, trở cỡ 22 ohm

                  Comment


                  • #24
                    tui đã thử nhiều con điện trở, điện giá trị càng lớn thì tín hiệu chênh lệch càng ít, tui dùng tới 33k thì thấy lớn hơn khoảng 1 độ c, còn 22ohm thì lớn hơn 30 độ c @@!

                    tui thấy ic còn nhiều chân chưa được sử dụng nên qui định từ bao nhiêu độ thì xuất ra chân nào, nhưng khi nối led vào thử thì tín hiệu lại bị thay đổi lung tung, ko biết tui có mắc đúng các cổng nguồn cho avr ko mà sao tín hiệu lung tung quá? hay là cần nối thêm linh kiện nào để làm được vấn đề này?

                    Thanks
                    Last edited by lion080889; 28-01-2014, 10:53.

                    Comment


                    • #25
                      giờ này chắc mọi người về quê ăn tết rồi ^^ phải đợi qua tết thôi ^^

                      Comment


                      • #26
                        Nguyên văn bởi lion080889 Xem bài viết
                        sau khi xem sơ đồ mạch của bác thì tui biết tui đã sai ở đâu để sửa lại và nó đã chạy được (dù chạy được 1 lần, lần sau gắn lại số nó chạy lung tung chắc do mạch lỏng), tiện dịp này bác cho tui hỏi thêm những cái cơ bản liên quan nha.

                        1. vấn đề về thạch anh, nhiệm vụ của nó là tạo dao động, trường hợp tạo dao động cho avr thì nó có thể được xem như là ép xung CPU trong máy tính ...

                        2. Cuộn cảm, trong tài liệu nói dùng cuộn cảm cho trường hợp trên nhằm mục đích cấp nguồn ổn định cho các kênh đầu vào của bộ chuyển đổi ...

                        3. cuối cùng là code ^^
                        PHP Code:
                        lcd_putsf("NHIET DO:    f\xdfC"); 
                        "f\xdfC" khi xuất ra nó là ký tự đặc biệt của từ 0C phải ko? mấy cái ký tự đặc biệt này của C tui chưa tìm ra ^^!

                        Có rất nhiều điều mà tui chưa biết nên hay gặp trở ngại về việc tìm hiểu lập trình cho vdk, mong các bác giúp đỡ ^^
                        Ohh bạn quyết tâm ko ăn Tết sao??? Mấy ngày nay bận đi bán dưa hấu kiếm chút đỉnh xài tết nhưng ế vãi ra . Mình trả lời các câu hỏi của bạn đây:

                        1) Thạch anh là bộ tạo dao động thì ai cũng biết rồi, nhưng không giống như ép xung trong máy tính đâu. Có thể hiểu nôm na như sau, CPU của máy tính nếu nó ghi 2.4Ghz thì đó là tần số hoạt động tối đa của nó, tuy nhiên nếu bằng cách bá đạo nào đó ép nó lên 3.0Ghz thì miễn cưỡng nó vẫn chạy được nhưng sẽ phát sinh sai số, lỗi và phát nhiệt cao, 1 thời gian ngắn là die CPU. Còn MCU (VĐK) thì có khác 1 tí, bạn đọc kỹ datasheet của nó sẽ thấy nó có ghi giới hạn rõ ràng của bộ tạo dao động (Với ATmega8L thì max là 8 MHz), nếu dùng thạch anh ngoài bạn có thể chọn bất cứ con thạch anh nào từ 8Mhz trở xuống và khai báo chính xác thông số cho phần mềm lập trình biết, còn nếu cố tình dùng thạch anh có chỉ số cao hơn (mình đã thử chơi ngu cốp con Cry 12Mhz vào) thì kết quả là treo MCU do Fuse bit nó biết được có 1 thằng ngu đang chơi đểu nó. Mà hình như chỉ có dòng AVR mới treo bảo vệ MCU trong trường hợp sai thạch anh thôi thì phải, mình thấy bọn 89xxx thì quất thạch anh kiểu gì cũng chạy cả, dao động cao quá thì sai be bét, treo, hoặc cháy thôi. PIC thì mình ko biết.
                        Một tính năng bổ ích của dòng AVR là có bộ tạo dao động nội (nếu mình nhớ ko lầm là 1M, 2M và 4Mhz thì phải ko nhớ lắm vì hầu như ko xài). Khi khai báo fuse bit dùng dao động nội thì bạn ko cần dùng thạch anh ngoài và đương nhiên sẽ tiết kiệm và có thêm được 2 chân Port ứng dụng I/O. Nhưng nhà sx cũng khuyến cáo trong datasheet của họ rất rõ ràng là bộ dao động nội không chính xác, và không thích hợp dùng trong các ứng dụng có liện quan đến timmer hoặc đồng hồ cần độ chính xác cao. Từ đó mà mình có thói quen là ko dùng dao động nội trừ trường hợp bất khả kháng (Attiny ko hỗ trợ thạch anh ngoài, nhưng dao động nội lên đến 10Mhz).

                        Còn việc bạn nói sai số giữa 1Mhz và 8Mhz với hàm delay_ms(1000); thì cũng do nhiều nguyên nhân, thạch anh cũa bạn có phải loại tốt hay ko?? phần mềm codevision của bạn có phải là bản mới nhấy hay ko??? mạch bạn thiết kế chống nhiễu có tốt hay ko??? bạn khai báo thạch anh trong Codevision có đúng hay ko??? cái đồng hồ mà bạn dùng để đo 1s đó nếu là của TQ sản xuất thì cũng như không. Và còn rất... rất nhiều nguyên do khác mà tạm thơi mình chưa nghĩ ra. Cái chính là bản thân bạn thấy cái nào tiện và đáng tin cậy thì lam theo thôi.

                        2) Cuộn cảm trong trường hợp mạch đo nhiệt độ này đúng là dùng để ổn định dòng, và mục đích chính của nó là chống trôi giá trị ADC. Mình cũng từng thử ko xài cuộn cảm này thì kết quả phụ thuộc vào độ ổn định của nguồn. Mình sử dụng 1 nguồn tạo 5V chuyên dụng thì thấy ko có vấn đề gì, coi kĩ cái nguồn này thì thấy nó có sẵn cuộn cảm lọc 1mH tổ bố ở đầu nguồn rồi. Chuyển sang dùng nguồn biến áp chỉ qua nắn cầu diode và tụ lọc đơn giản thì kết quả nhảy linh tinh ko đâu vào đâu, từ đó mình quyết định dù nguồn xịn hay dởm đều gắn thêm 1 con cảm vào cho chắc. Còn về giá trị cuộn cảm này thì mình đọc các tài liệu thấy họ nói dùng 10uH, mình cũng đã thử qua và thấy với cái nguồn dởm thì 10uH chả thấm vào đâu, thay thế đến cuộn cảm 680uH thì thấy nó êm êm thế là lấy đó làm tiêu chí luôn. Tóm lại cái này phụ thuộc vào chất lượng của nguồn thôi.

                        3) f\xdfC là tuyệt chiêu tui vô tình học lóm được, và cũng ko biết tại sao lại có thể như vậy được (thật khâm phục trình các anh programmer chuyên nghiệp). Thông thường vẫn có cách để hiện thị ký tự oC theo cách mà các đại ca dùng để hiển thị các ký tự font tiếng Việt trên cái Character LCD này đó, nhưng nó khá rườm rà.

                        Chỉ có vậy thôi, bạn cứ thong thả tìm hiểu từ từ đi. Tết vui vẻ
                        Last edited by hoahauvn2; 30-01-2014, 12:58.
                        Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                        Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                        Comment


                        • #27
                          Nguyên văn bởi hoahauvn2 Xem bài viết
                          Ohh bạn quyết tâm ko ăn Tết sao??? Mấy ngày nay bận đi bán dưa hấu kiếm chút đỉnh xài tết nhưng ế vãi ra . Mình trả lời các câu hỏi của bạn đây:

                          1) Thạch anh là bộ tạo dao động thì ai cũng biết rồi, nhưng không giống như ép xung trong máy tính đâu. Có thể hiểu nôm na như sau, CPU của máy tính nếu nó ghi 2.4Ghz thì đó là tần số hoạt động tối đa của nó, tuy nhiên nếu bằng cách bá đạo nào đó ép nó lên 3.0Ghz thì miễn cưỡng nó vẫn chạy được nhưng sẽ phát sinh sai số, lỗi và phát nhiệt cao, 1 thời gian ngắn là die CPU. Còn MCU (VĐK) thì có khác 1 tí, bạn đọc kỹ datasheet của nó sẽ thấy nó có ghi giới hạn rõ ràng của bộ tạo dao động (Với ATmega8L thì max là 8 MHz), nếu dùng thạch anh ngoài bạn có thể chọn bất cứ con thạch anh nào từ 8Mhz trở xuống và khai báo chính xác thông số cho phần mềm lập trình biết, còn nếu cố tình dùng thạch anh có chỉ số cao hơn (mình đã thử chơi ngu cốp con Cry 12Mhz vào) thì kết quả là treo MCU do Fuse bit nó biết được có 1 thằng ngu đang chơi đểu nó. Mà hình như chỉ có dòng AVR mới treo bảo vệ MCU trong trường hợp sai thạch anh thôi thì phải, mình thấy bọn 89xxx thì quất thạch anh kiểu gì cũng chạy cả, dao động cao quá thì sai be bét, treo, hoặc cháy thôi. PIC thì mình ko biết.
                          Một tính năng bổ ích của dòng AVR là có bộ tạo dao động nội (nếu mình nhớ ko lầm là 1M, 2M và 4Mhz thì phải ko nhớ lắm vì hầu như ko xài). Khi khai báo fuse bit dùng dao động nội thì bạn ko cần dùng thạch anh ngoài và đương nhiên sẽ tiết kiệm và có thêm được 2 chân Port ứng dụng I/O. Nhưng nhà sx cũng khuyến cáo trong datasheet của họ rất rõ ràng là bộ dao động nội không chính xác, và không thích hợp dùng trong các ứng dụng có liện quan đến timmer hoặc đồng hồ cần độ chính xác cao. Từ đó mà mình có thói quen là ko dùng dao động nội trừ trường hợp bất khả kháng (Attiny ko hỗ trợ thạch anh ngoài, nhưng dao động nội lên đến 10Mhz).

                          Còn việc bạn nói sai số giữa 1Mhz và 8Mhz với hàm delay_ms(1000); thì cũng do nhiều nguyên nhân, thạch anh cũa bạn có phải loại tốt hay ko?? phần mềm codevision của bạn có phải là bản mới nhấy hay ko??? mạch bạn thiết kế chống nhiễu có tốt hay ko??? bạn khai báo thạch anh trong Codevision có đúng hay ko??? cái đồng hồ mà bạn dùng để đo 1s đó nếu là của TQ sản xuất thì cũng như không. Và còn rất... rất nhiều nguyên do khác mà tạm thơi mình chưa nghĩ ra. Cái chính là bản thân bạn thấy cái nào tiện và đáng tin cậy thì lam theo thôi.

                          2) Cuộn cảm trong trường hợp mạch đo nhiệt độ này đúng là dùng để ổn định dòng, và mục đích chính của nó là chống trôi giá trị ADC. Mình cũng từng thử ko xài cuộn cảm này thì kết quả phụ thuộc vào độ ổn định của nguồn. Mình sử dụng 1 nguồn tạo 5V chuyên dụng thì thấy ko có vấn đề gì, coi kĩ cái nguồn này thì thấy nó có sẵn cuộn cảm lọc 1mH tổ bố ở đầu nguồn rồi. Chuyển sang dùng nguồn biến áp chỉ qua nắn cầu diode và tụ lọc đơn giản thì kết quả nhảy linh tinh ko đâu vào đâu, từ đó mình quyết định dù nguồn xịn hay dởm đều gắn thêm 1 con cảm vào cho chắc. Còn về giá trị cuộn cảm này thì mình đọc các tài liệu thấy họ nói dùng 10uH, mình cũng đã thử qua và thấy với cái nguồn dởm thì 10uH chả thấm vào đâu, thay thế đến cuộn cảm 680uH thì thấy nó êm êm thế là lấy đó làm tiêu chí luôn. Tóm lại cái này phụ thuộc vào chất lượng của nguồn thôi.

                          3) f\xdfC là tuyệt chiêu tui vô tình học lóm được, và cũng ko biết tại sao lại có thể như vậy được (thật khâm phục trình các anh programmer chuyên nghiệp). Thông thường vẫn có cách để hiện thị ký tự oC theo cách mà các đại ca dùng để hiển thị các ký tự font tiếng Việt trên cái Character LCD này đó, nhưng nó khá rườm rà.

                          Chỉ có vậy thôi, bạn chụi khó tìm hiểu từ từ đi. Tết vui vẻ
                          chẳng có gì là tuyệt chiêu đâu bạn ơi chỉ vì bạn ko đọc datasheet của LCD nên ko biết thôi, nó chỉ là 1 kí tự trong bảng mã kí tự mà LCD nó hỗ trợ thôi

                          Attached Files

                          Comment


                          • #28
                            Nguyên văn bởi lion080889 Xem bài viết
                            chào các bác, sau các vấn đề ở trên, tui lại gặp 1 vấn đề về lcd, lcd của tui có 16 chân, chân 15 và chân 16 dùng mở sáng đèn lcd, nhưng khi chân 16 nối tiếp đất thì kết quả độ C bị sai, tháo chân 16 này ra thì ok? nên giờ muốn sử dụng đèn lcd mà ko được, trong trường hợp này phải giải quyết sao vậy các bác? khi nối trực tiếp chân 16 của lcd xuống max rồi đo tín hiệu của lm35 tại chân out và max thì ra ok, nhưng khi lấy kim đen (đồng đồ đo) đo ở điểm max gần phía lcd thì do được trên 40, còn điểm max gần lm35 thì ra đúng @@!
                            Cái này mình từng bị rất nhiếu rồi nè, nguyên nhân là bạn dùng chung nguồn 5V cho cả hệ thống mạch của bạn, trong khi đó cái đèn back light của LCD là 1 con led siêu sáng hàng đáng gờm, nó mà chạy là chắc kèo rút kiệt lực mấy con 7805 sida, minh chứng rõ ràng nhất là việc khi bạn tăng trở cho back light thì mạch có vẻ ổn định hơn, hiểu ra vấn đề chưa?? Cách giải quyết:
                            1) Kiếm mấy con IC ổn áp cho ra 5V - 3A mà xài.
                            2) mình thấy trên thị trường có bán nguyên module mạch cho ra 5V -3A từ 12V đầu vào với mấy con IC ổn áp nêu ở 1) nhưng giá khá cao.
                            3) hay nhất, tiện nhất, rẻ nhất là ra Nhật Tảo mua cục Adapter điện tử loại 5V - 3 đến 4 A gì đó mà xài phây phây (chất lượng hên xui chắc chắc của TQ)
                            4) Cách này rườm rà mình ko thích lắm đó là dùng riêng hẳn 1 con 7805 khác (chung hoặc cách ly GND hệ thống đều được) cho cái back light LCD, vậy khá ổn nếu back light có hành hạ thì hành hạ con 7805 này, còn nguồn 5V cấp cho VĐK và mấy thứ linh tinh khác được cấp từ một con 7805 khác, mạnh ai nấy chịu ko liên quan đến nhau.
                            Chứ cái kiểu cứ tống trở cao cho back light LCD chỉ là chắp vá tạm thời thôi, ko đảm bảo cho mạch chạy ổn định lâu dài, vả có ổn định thì với cái màn hình LCD tối thui thì cũng dở lắm.

                            Rồi đó cũng chỉ có vậy thôi. Tết vui vẻ
                            Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                            Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                            Comment


                            • #29
                              Nguyên văn bởi chung1608 Xem bài viết
                              chẳng có gì là tuyệt chiêu đâu bạn ơi chỉ vì bạn ko đọc datasheet của LCD nên ko biết thôi, nó chỉ là 1 kí tự trong bảng mã kí tự mà LCD nó hỗ trợ thôi
                              Rất cám ơn bác Chung đã hỗ trợ, mình sẽ xem kỹ cái này, trước giờ toàn 0 với 1 đưa vào bộ nhớ nó thôi, lâu là rườm rà quá. Nhưng để quy ra được ký tự cụ thể để gọi các ký tự đặc biệt ra chắc hơi mất công đây. Chúc bác Tết vui vẻ
                              Làm sao mà bạn dám nói là không làm được khi bạn chưa từng thử một lần nào.
                              Ngay cả khi bạn đã làm 1 lần và thất bại bạn cũng không có quyền nói là không làm được vì bạn chưa làm lần thứ 2,3...

                              Comment


                              • #30
                                Nguyên văn bởi hoahauvn2 Xem bài viết
                                Cái này mình từng bị rất nhiếu rồi nè, nguyên nhân là bạn dùng chung nguồn 5V cho cả hệ thống mạch của bạn, trong khi đó cái đèn back light của LCD là 1 con led siêu sáng hàng đáng gờm, nó mà chạy là chắc kèo rút kiệt lực mấy con 7805 sida, minh chứng rõ ràng nhất là việc khi bạn tăng trở cho back light thì mạch có vẻ ổn định hơn, hiểu ra vấn đề chưa?? Cách giải quyết:
                                1) Kiếm mấy con IC ổn áp cho ra 5V - 3A mà xài.
                                2) mình thấy trên thị trường có bán nguyên module mạch cho ra 5V -3A từ 12V đầu vào với mấy con IC ổn áp nêu ở 1) nhưng giá khá cao.
                                3) hay nhất, tiện nhất, rẻ nhất là ra Nhật Tảo mua cục Adapter điện tử loại 5V - 3 đến 4 A gì đó mà xài phây phây (chất lượng hên xui chắc chắc của TQ)
                                4) Cách này rườm rà mình ko thích lắm đó là dùng riêng hẳn 1 con 7805 khác (chung hoặc cách ly GND hệ thống đều được) cho cái back light LCD, vậy khá ổn nếu back light có hành hạ thì hành hạ con 7805 này, còn nguồn 5V cấp cho VĐK và mấy thứ linh tinh khác được cấp từ một con 7805 khác, mạnh ai nấy chịu ko liên quan đến nhau.
                                Chứ cái kiểu cứ tống trở cao cho back light LCD chỉ là chắp vá tạm thời thôi, ko đảm bảo cho mạch chạy ổn định lâu dài, vả có ổn định thì với cái màn hình LCD tối thui thì cũng dở lắm.

                                Rồi đó cũng chỉ có vậy thôi. Tết vui vẻ
                                rất cám ơn bác đã hướng dẫn mình dùng 1 cục adapter cùi bắp có 400mA (ko biết tới ko nữa, hàng TQ mà ^^!) mình dùng cục này để thực hành các mạch mình học thôi, nhưng tui thấy cách thứ 4 thì hợp lý hơn nhưng vấn đề ở đây là dù ko sử dụng đèn nền lcd mà chỉ vừa sử dụng lm35 và 1 cổng ra của avr (ví dụ khi nhiệt độ trên 100 thì sẽ xuất ra 1 port, port này gắn 1 led để phát sáng báo hiệu) thì tín hiệu lệch kinh khủng hơn nữa. cách 4 này tui thấy hợp lý về túi tiền và tiện phát triển ứng dụng hơn vì mình có thể làm nhỏ gọn mà, nếu có làm thì làm cái ứng dụng bỏ túi xài pin (giống trong máy tính, đồng hồ) nên sẽ ko kéo nguồn có dòng cao để dùng ic nguồn 3A. nếu có thể bác hướng dẫn tui sử dụng cách này cho hợp lý được ko

                                còn về thạch anh thì tui biết là tạo dao động, tui nghĩ là vdk truyền tín hiệu vào tần số dao động đó để truyền qua tín hiệu qua lại và xử lý, ko biết như vậy có đúng ko? và khi dùng 1mhz và 8mhz có khác gì nhau? có phải là 8mhz thì truyền tín hiệu nhanh hơn và tốc độ xử lý tín hiệu nhanh hơn 1mhz?

                                tui sống và làm việc tại tp.hcm nên vẫn có time tìm hiểu ^^ tui cũng ở gần nhật tảo thôi, chắc qua mấy mùng tết này mới tìm hiểu được tiếp
                                nếu có thể bác cho tui nick skype hay face có gì có thể trao đổi thêm hay cà phê pháo gì đó

                                Comment

                                Về tác giả

                                Collapse

                                lion080889 Tìm hiểu thêm về lion080889

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X