Thông báo

Collapse
No announcement yet.

Độ chính xác của các RTC

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

  • Độ chính xác của các RTC

    Tình hình là sau 1 thời gian dùng thử mấy con DS12887, DS1307, thấy chất lượng kém quá.

    Con DS12887 mình đã test kỹ:
    - mua 1 đợt hàng 50 con ở TME, có 10 con chết, khoảng 5 con chạy đúng giờ, mấy con còn lại chạy chậm mỗi ngày khoảng 5-10 giây.
    - gần đây mua 10 con ở 158B Lý Thường Kiệt, có 3 con chạy đúng giờ nhưng khi mất nguồn cung cấp thì reset luôn (có vẻ như ko có nguồn pin ở trong), 7 con còn lại chạy nhanh mỗi ngày 5-10 giây.
    Công nhận có mấy con DS12887 rất tốt, chạy liên tục cả năm ko sai 1s, va đập quăng quật, thậm chí cắm nhầm 12V vào mà nó cũng chỉ treo do xung nhiễu làm sai mấy thanh ghi control thôi. Nhưng nhìn chung chất lượng hàng mua ở Nhật Tảo quá kém.

    Con DS1307 thì đang chạy ok, được vài tháng tự nhiên đồng loạt chết đứng cùng 1 thời điểm.

    Các anh có kinh nghiệm ko biết đã gặp mấy trường hợp nó chạy sai giờ thế này chưa?
    Không biết có giải pháp nào cho mấy con RTC đó ko: viết code bù giờ cho mấy con chạy nhanh chậm có đựoc ko? mua hàng có cách nào nhận biết con nào tốt xấu ko? loại RTC nào tốt hơn ko...?
    Phạm Minh Tuấn

    (+84) 982006467

  • #2
    Cách hay nhất là bỏ hẳn con chíp RTC, dùng timer của chính vi điều khiển làm đồng hồ. AVR, PIC, PSoC đều có chế độ timer chạy độc lập bằng thạch anh 32768 riêng trong khi vi xử lý chính ở chế độ ngủ, mỗi 1 hoặc 2 giây thì ngắt một lần, vi điều khiển thức dậy, cập nhật thời gian trong nháy mắt rồi ngủ tiếp. Nuôi cả con vi điều khiển ở chế độ ngủ + timer bằng pin 3V tốn dưới 1 mA.
    Phần mềm tự do hoặc không dùng máy tính nữa !.

    Comment


    • #3
      Cảm ơn anh bqViet
      Vậy độ chính xác phụ thuộc vào thạch anh 32768 (vấn đề nguồn hàng), ngoài ra ko biết nó có bị ảnh hưởng bởi nhiễu điện từ, nhiệt độ... gì ko?
      Chắc phải bỏ ra 1-2 tuần để test đã mới biết được.
      Phạm Minh Tuấn

      (+84) 982006467

      Comment


      • #4
        Nếu bạn dùng chíp RTC vẫn cần thạch anh cơ mà ? Độ ổn định khi đó phụ thuộc vào cả thạch anh lẫn con chíp. Nếu dùng kiểu trực tiếp thì chỉ còn phụ thuộc vào mỗi thạch anh (đằng nào mạch cũng cần vđk rồi). Kiếm loại thạch anh SMD của Murata hoặc Panasonic gì đó là khỏi phải nghĩ.
        Phần mềm tự do hoặc không dùng máy tính nữa !.

        Comment


        • #5
          Nếu bạn muốn có dữ liệu chính xác từ thạch anh 32768 thì bạn phải chỉnh 2 giá trị của tụ gắn vào 2 chân thạch anh. Và muốn biết độ chính xác này là bao nhiêu thì cũng phải có thiết bị chuyên dụng để đo. Theo mình biết sai số của các đồng hồ điện tử cao cấp cũng khá lớn (~10s/month).

          Comment


          • #6
            10 giây mỗi tháng, tức 2 phút mỗi là chấp nhận được rồi. Đồ dùng cho công nghiệp sai 10 phút mỗi năm cũng chưa chết ai. Đồ gia dụng thì thoải mái. Bạn mgdaubo cho cái thông tin rất tốt, ít nhất để anh em diễn đàn biết câu "chỉ bán hàng chính hãng" của TMe đúng tới đâu.

            Dùng timer trực tiếp không phải chuyện gì mới: nhiều người đã làm, bản thân bqviet cũng làm một cái bộ điều khiển máy bơm ở nhà (tự động bật lúc 3 giờ sáng, dừng sau 1 giờ hoặc khi bể đầy - tùy theo sự kiện nào xảy ra trước). PIC thì mua của ông F, tụ 1206 mua của 17A Hàn Thuyên thấy gỡ ra từ cái hộp to đề hãng Mathushita, thạch anh 32768 thường; chạy tới nay vẫn chưa sai phút nào so với đồng hồ Internet.
            Phần mềm tự do hoặc không dùng máy tính nữa !.

            Comment


            • #7
              nói chung sai số của linh kiện là không tránh khỏi mà kiểu j chẳng phải dùng thì mới có cái mạch chạy được chứ, theo mình tùy theo yêu cầu chính xác để mà lựa chọn phương án thôi. Mình cũng đã làm mấy cái đống hồ số có RTC mỗi cái có 1 sai số khác nhau do thạch anh chất lượng không đều nhưng sai lệch 3s/ngày cũng là chấp nhận được. Dùng thạch anh+RTC ngoài thì chủ động hơn chút vì có thể thay linh kiện xịn khi cần thiết và kéo dài tuổi thọ pin hơn dùng chip, bằng chứng là mấy cái đồng hồ TQ tiết kiệm linh kiện nên mất điện vài giờ thì không sao còn mất vài ngày thì thời gian nó đứng im chẳng buồn chạy nữa hoặc bị reset về 01/01/2001 hehe. Mình cũng dùng loại pin đó thì chạy được gần 2 năm mới phải thay.
              Cty tnhh thiết bị điện - điện tử công nghiệp: 0437821690 / 0988.775.900
              Thiết kế hệ thống điện điều khiển
              Sửa chữa INVERTER, DRIVER , PLC, UPS ...!

              Comment


              • #8
                - Hiện tại mình đang dùng con PCF2127A http://ics.nxp.com/literature/leafle...a.pcf2129a.pdf . Thấy hay ở chỗ nó tích hợp sẵn loại thạch anh bù nhiệt bên trong, do vậy ít sai số bởi nhiệt độ và không cần tụ và thạch anh bên ngoài. Theo tài liệu đây là loại RTC độ chính xác cao, sai số 3ppm, tức một ngày sai khoảng 3*86400/10exp(-6) = 0,259 s, nên 1 tháng sai khoảng 7,7 sec... Nói vậy thì biết là vậy chứ chưa đo đạc gì, mà cũng ko biết làm sao để đo. Chả lẽ chờ 1 tháng, mà 3ppm kia lúc thì là +3ppm, lúc thì -3pmm, bù qua sớt lại, thực sự không biết đo thế nào, chi thấy chạy cũng chuẩn với đồng hồ của laptop. Vậy cũng quá ngon rồi.
                Attached Files

                Or call me 0903911109

                Comment


                • #9
                  Kết thúc project với DS12887, rút được vài kinh nghiệm:
                  - Nguồn hàng là quan trọng, cụ thể đã nêu ở trên.
                  - Với những con chạy được, có 2 lỗi cơ bản:
                  + + + sai số: vài đến vài chục giây / 1 ngày, phụ thuộc vào môi trường (chắc là nhiệt độ), vô phuơng khắc phục
                  + + + nhiễu (làm sai time, thanh ghi): thêm cuộn chặn L, tụ lọc sát chân VCC; các chân IO đều phải kéo trở lên VCC hoặc xuống GND; chân CS luôn disable, chỉ enable trong lúc truy suất giao tiếp.
                  Phạm Minh Tuấn

                  (+84) 982006467

                  Comment


                  • #10
                    Lạ thật, mình mua ở Nhật Tảo 3 con DS12C887 (1 mới, 2 cũ) chạy con nào cũng ổn cả. Mua 1 con DS1307 cũng thế, cả năm vẫn chạy tốt, có chết con nào đâu!

                    Comment


                    • #11
                      Chào các bạn mình đang làm về con 12887 này, mình mô phỏng bằng proteus 7.6, nhưng khi mô phỏng nó báo lỗi là: " simulation is not running in real time due to excessive CPU load " mình tạm hiểu là mô phỏng không chạy được thời gian thực do CPU load quá nhiều. Nhưng mình không hiểu tại sao lại có thông báo này. Mình dùng 8051 và hiển htij thời gian thực qua led 7 thanh. Mong các cao thủ trên diễn đàn chỉ giúp mình, hix

                      Comment


                      • #12
                        Nguyên văn bởi mgdaubo Xem bài viết
                        Tình hình là sau 1 thời gian dùng thử mấy con DS12887, DS1307, thấy chất lượng kém quá.

                        Con DS12887 mình đã test kỹ:
                        - mua 1 đợt hàng 50 con ở TME, có 10 con chết, khoảng 5 con chạy đúng giờ, mấy con còn lại chạy chậm mỗi ngày khoảng 5-10 giây.
                        - gần đây mua 10 con ở 158B Lý Thường Kiệt, có 3 con chạy đúng giờ nhưng khi mất nguồn cung cấp thì reset luôn (có vẻ như ko có nguồn pin ở trong), 7 con còn lại chạy nhanh mỗi ngày 5-10 giây.
                        Công nhận có mấy con DS12887 rất tốt, chạy liên tục cả năm ko sai 1s, va đập quăng quật, thậm chí cắm nhầm 12V vào mà nó cũng chỉ treo do xung nhiễu làm sai mấy thanh ghi control thôi. Nhưng nhìn chung chất lượng hàng mua ở Nhật Tảo quá kém.

                        Con DS1307 thì đang chạy ok, được vài tháng tự nhiên đồng loạt chết đứng cùng 1 thời điểm.

                        Các anh có kinh nghiệm ko biết đã gặp mấy trường hợp nó chạy sai giờ thế này chưa?
                        Không biết có giải pháp nào cho mấy con RTC đó ko: viết code bù giờ cho mấy con chạy nhanh chậm có đựoc ko? mua hàng có cách nào nhận biết con nào tốt xấu ko? loại RTC nào tốt hơn ko...?
                        Bó tay với chất lượng chip từ TME cũng như 158B, chắc cũng toàn hàng đểu từ Tàu Khựa cả

                        Email:
                        Phone: 0905.034.086

                        Comment


                        • #13
                          Nguyên văn bởi bqviet Xem bài viết
                          Cách hay nhất là bỏ hẳn con chíp RTC, dùng timer của chính vi điều khiển làm đồng hồ. AVR, PIC, PSoC đều có chế độ timer chạy độc lập bằng thạch anh 32768 riêng trong khi vi xử lý chính ở chế độ ngủ, mỗi 1 hoặc 2 giây thì ngắt một lần, vi điều khiển thức dậy, cập nhật thời gian trong nháy mắt rồi ngủ tiếp. Nuôi cả con vi điều khiển ở chế độ ngủ + timer bằng pin 3V tốn dưới 1 mA.
                          Bác Việt cho em hỏi: làm sao để có thể đồng bộ nguồn Pin giữa Pin 3V( dùng khi mất điện ) và nguồn điện chính cung cấp cho toàn bộ mạch điện? Cục Pin này phải nối như thế nào vào mạch?

                          Comment


                          • #14
                            Đầu âm của pin vẫn nối với đất mạch như bình thường. Đầu dương thì nối với VCC thông qua một đi-ốt Xốt-ky . Cần thận hơn nữa thì đầu ra của IC ổn áp cũng nối với VCC thông qua một đi-ốt Xốt-ky (mặc dù không cần thiết).
                            Phần mềm tự do hoặc không dùng máy tính nữa !.

                            Comment


                            • #15
                              Hôm nay emngồi làm với con thạch anh 32768hz mà sao giờ giấc chả đúng gì cả. Một giờ chắc chạy sai cả chục giây là tại làm sao nhỉ ?
                              Code:
                              /*****************************************************
                              
                              
                              Project : 
                              Version : 
                              Date    : 6/27/2010
                              Author  : thangcan_new
                              Company : Phuong Dong University
                              Comments: 
                              
                              
                              Chip type               : ATmega8
                              Program type            : Application
                              AVR Core Clock frequency: 1.000000 MHz
                              Memory model            : Small
                              External RAM size       : 0
                              Data Stack size         : 256
                              *****************************************************/
                              
                              #include <mega8.h>
                              #include <delay.h>
                              #define latch PORTB.2 
                              #define data PORTB.3
                              #define clock PORTB.5 
                              unsigned char num[10]=  {0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,
                                                       0b01001001,0b01000001,0b00011111,0b00000001,0b00001001};
                              unsigned char LED[8] ={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111};
                              char not_leap(void);
                              typedef struct{ 
                              unsigned char second;   //enter the current time, date, month, and year
                              unsigned char minute;
                              unsigned char hour;                                     
                              unsigned char date;       
                              unsigned char month;
                              unsigned int year;      
                                          }time;
                              
                               time t;    
                              //***********************************************************************************
                              // Timer 2 overflow interrupt service routine
                              interrupt [TIM2_OVF] void timer2_ovf_isr(void)
                              {
                                  if (++t.second==60)        //keep track of time, date, month, and year
                                  {
                                      t.second=0;
                                      if (++t.minute==60) 
                                      {
                                          t.minute=0;
                                          if (++t.hour==24)
                                          {
                                              t.hour=0;
                                              if (++t.date==32)
                                              {
                                                  t.month++;
                                                  t.date=1;
                                              }
                                              else if (t.date==31) 
                                              {                    
                                                  if ((t.month==4) || (t.month==6) || (t.month==9) || (t.month==11)) 
                                                  {
                                                      t.month++;
                                                      t.date=1;
                                                  }
                                              }
                                              else if (t.date==30)
                                              {
                                                  if(t.month==2)
                                                  {
                                                     t.month++;
                                                     t.date=1;
                                                  }
                                              }              
                                              else if (t.date==29) 
                                              {
                                                  if((t.month==2) && (not_leap()))
                                                  {
                                                      t.month++;
                                                      t.date=1;
                                                  }                
                                              }                          
                                              if (t.month==13)
                                              {
                                                  t.month=1;
                                                  t.year++;
                                              }
                                          }
                                      }
                                  }  
                              }
                              //***********************************************************************************
                                char not_leap(void)      //check for leap year
                              {
                                  if (!(t.year%100))
                                      return (char)(t.year%400);
                                  else
                                      return (char)(t.year%4);
                                      }   
                              //***********************************************************************************        
                              void latch_on(){
                                  latch=1;
                                  latch=0;                       
                              }
                              //***********************************************************************************
                              void display(){
                                  unsigned char i,k,data1;
                                  for (i=0;i<8;i++)
                                  {
                                  data1=LED[i];
                                   for (k=0;k<8;k++)
                                    {
                                     data=data1 & 0x01; 
                                     data1=data1>>1; 
                                     clock=1;clock=0;   
                                    }
                                  }
                                   latch_on();
                                  for (i=0;i<8;i++)
                                  {
                                  data1=0xff;
                                   for (k=0;k<8;k++)
                                    {
                                     data=data1 & 0x01; 
                                     data1=data1>>1; 
                                     clock=1;clock=0;   
                                    }
                                  }
                                   latch_on();
                               }
                              //***********************************************************************************
                              void make_code(){
                                  LED[4]=num[t.second/10];
                                  LED[5]=num[t.second%10]; 
                                  LED[6]=num[t.minute /10];
                                  LED[7]=num[t.minute%10];
                              }
                              //***********************************************************************************
                              // Declare your global variables here
                              
                              void main(void)
                              {
                              // Declare your local variables here
                              
                              // Input/Output Ports initialization
                              // 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
                              // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                              // 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
                              TCCR0=0x00;
                              TCNT0=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: TOSC1 pin
                              // Clock value: PCK2/1024
                              // Mode: Normal top=FFh
                              // OC2 output: Disconnected
                              ASSR=0x08;
                              TCCR2=0x05;
                              TCNT2=0x00;
                              OCR2=0x00;
                              
                              // External Interrupt(s) initialization
                              // INT0: Off
                              // INT1: Off
                              MCUCR=0x00;
                              
                              // Timer(s)/Counter(s) Interrupt(s) initialization
                              TIMSK=0x40;
                              
                              // Analog Comparator initialization
                              // Analog Comparator: Off
                              // Analog Comparator Input Capture by Timer/Counter 1: Off
                              ACSR=0x80;
                              SFIOR=0x00;
                              
                              // Global enable interrupts
                              #asm("sei")
                                DDRB.3=DDRB.5=DDRB.2=1;
                              
                              while (1)
                                    {  
                                    make_code();
                                    display();
                                    delay_ms(10);
                                    // Place your code here
                              
                                    };
                              }

                              Comment

                              Về tác giả

                              Collapse

                              mgdaubo a bull Tìm hiểu thêm về mgdaubo

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

                              Collapse

                              Đang tải...
                              X