Làm thế nào quan trọng là tần số UART?


17

Tôi sẽ sử dụng tinh thể 8 MHz để chạy vi điều khiển của mình ở 16 MIPS (PLL 4x, 2 hướng dẫn chu kỳ.) Tuy nhiên, 8 MHz không phân chia thành bất kỳ tần số UART nào AFAIK ... vậy các tần số này quan trọng đến mức nào? Tôi dự định sử dụng 115.200 baud.

UART có thể chạy trong phạm vi ± 1% không? Nếu điều này không hoạt động, tôi nên sử dụng tần số nào? (Tôi muốn lấy càng gần 16 MIPS càng tốt, để có tốc độ xử lý tối đa.) Nếu có vấn đề, tôi đang sử dụng PIC24FJ64GA004.

Câu trả lời:


13

Nếu bạn ở trong vòng 1%, bạn sẽ ổn thôi.

Giả sử UART của bạn sử dụng đồng hồ oversampling 16x, chẳng hạn, bạn có thể đặt nó ở mức 1.843.200 Hz đến 16x overample 115.200 bps. (quá khổ như thế này là khá phổ biến) Điều này cho phép UART đếm được 8 đồng hồ quá mức từ cạnh rơi của bit start, do đó nó có thể xác định vị trí trung tâm của các ô bit trong khoảng +/- một khoảng thời gian của đồng hồ, sau mà nó đếm hết 16 chu kỳ của đồng hồ để xác định thời điểm lấy mẫu dữ liệu.

Nếu bạn cho rằng nó có thể chạm vào tâm của bit start, thì để giữ lấy mẫu dữ liệu nối tiếp trong các ô bit chính xác trên 8 bit dữ liệu, tần số xung nhịp phải nằm trong khoảng (8-0,5) / 8 và (8 + 0,5 ) / 8 hoặc +/- 6,25% tốc độ bit dự định. Việc ép xung cao hơn sẽ tiến gần hơn đến điều kiện lý tưởng là chạm vào tâm của bit start, nhưng 8x hoặc 16x thường đủ gần để bạn có thể giả định rằng 5% không khớp sẽ hoạt động.

Tuy nhiên, bạn không thể tin vào mặt khác là hoàn hảo về tần suất. Nếu bạn kết nối thiết bị nhanh 4% với thiết bị chậm 4%, bạn sẽ gặp vấn đề. Tôi đã gặp phải ít nhất một trường hợp là PC chạy chậm một chút và thiết bị hơi nhanh và hai thiết bị chỉ có thể giao tiếp với nhau, mặc dù cùng một thiết bị vẫn ổn với các PC khác và PC cũng ổn với các PC khác thiết bị. (Phạm vi O trong khoảng 112kbps và 119kbps) Vì lý do đó, thật tốt khi cố gắng đạt tần số danh nghĩa càng gần càng tốt. Tôi chưa bao giờ thấy bất cứ điều gì trong vòng 2% danh nghĩa có vấn đề.

Điều thông thường cần làm là sử dụng tốc độ xung nhịp chính cung cấp bội số toàn bộ của tỷ lệ lấy mẫu vượt quá UART dự định nhân với tốc độ truyền. Ví dụ: nếu bạn muốn CPU chạy ở tốc độ khoảng 8 MHz, bạn có thể sử dụng bộ dao động 7,3728 MHz, có thể chia cho 4 để có được 1,8432 MHz, tức là gấp 16 lần 115200.


8 MHz có thể được chia cho 69 để có được 115.942, nằm trong phạm vi ± 1%. Tôi tự hỏi nếu PIC hỗ trợ loại phân chia này cho trình tạo tốc độ baud của nó. Tôi hy vọng như vậy, nhưng tôi không nghĩ rằng nó sẽ.
Thomas O

PIC có một trình tạo tốc độ baud. Nó sẽ hoạt động tốt nhưng chỉ với baud thấp hơn như 9600, nó sẽ không hoạt động với baud cao như 115.200, nó trở nên quá thiếu chính xác.
Thomas O

Bạn có nghĩ rằng tôi có thể sử dụng một tinh thể 7.3728 MHz? (Tôi sẽ không sử dụng bộ dao động 7,37 MHz bên trong vì tôi muốn độ chính xác.) Nó cho phép tôi chia cho 64 để có tần số UART là 115.200. Đó là cách nhanh nhất tôi có thể đi với khả năng chịu đựng cao.
Thomas O

1
nếu UART của bạn hỗ trợ nó, tốt nhất là cho nó ép xung (như 16x) để nó có thể chồng lên bit bắt đầu và tìm trung tâm của ô bit, nhưng lấy 16x cho 115K trong vòng 1% có thể là một thách thức, trừ khi bạn sử dụng một tinh thể baud-nhiều.
JustJeff

4

1% @JustJeff đề cập là không bắt buộc. Hầu hết các UART cho phép một nửa lỗi trên bit cuối cùng. Hầu hết thời gian một khung bao gồm 1 bit start, 8 databits và 1 bit stop, với tổng số 10 bit. Một nửa bit trên 10 bit là 5% (6,25% của JustJeff không lấy bit start và stop trong tài khoản).


1
đừng nói sai tôi; lại "1%", tuyên bố của tôi là điều này có thể khó đạt được. "6,25%" đã cho rằng bạn tình cờ chạm vào tâm của bit start và sẽ là mức chênh lệch tối đa cho phép trong tốc độ xung nhịp của máy thu và máy phát trong các điều kiện như vậy.
JustJeff

1

JustJeff quên mất bit start, nhưng Stevenh đã thêm bit stop. Giả sử giao thức chung gồm 8 bit dữ liệu, 1 bit start và không có bit chẵn lẻ, (số bit dừng không quan trọng), có 8 1/2 bit từ cạnh đầu của bit start đến tâm của bit dữ liệu cuối cùng. Nói chung, bạn muốn người nhận lấy mẫu bit cuối cùng này trong thời gian 1/4 bit. Lưu ý rằng 1/2 bit là ngưỡng được đảm bảo. Bất cứ điều gì gần đó trở nên không thể thực hiện được vì luôn có một số tiếng ồn điện và jitter.

1/4 chia cho 8 1/2 = 2,94%.

Như JustJeff đã đề cập, hầu hết các triển khai UART thực sự lấy mẫu dữ liệu đến với đồng hồ 16x không đồng bộ. Điều đó làm tăng thêm độ không đảm bảo thời gian 1/16 bit vì đó là lỗi mà cạnh đầu của bit start có thể được đo. Thời gian 1/16 bit trong số 8 1/2 bit là 0,74% khác. Điều đó xuất phát từ ngân sách lỗi được tính toán trước đó. Bạn kết thúc với 2,2% cho phép không khớp đồng hồ cho người nhận để lấy mẫu bit cuối cùng trong vòng 1/4 bit thời gian ở giữa.

Như những người khác đã nói, sử dụng tinh thể 7.3728 MHz là một cách phổ biến khi cần tốc độ truyền chính xác. Thông thường, bạn có thể sắp xếp để chạy CPU gần tốc độ tối đa của nó trong khi đạt tốc độ truyền UART trong lỗi tinh thể.


Tôi không đồng ý rằng các bit dừng không quan trọng. Trong câu hỏi này, giao tiếp không thành công vì bit stop bị đặt sai ở mức thấp.
stevenvh

Bit dừng phải ở đó để giao tiếp tổng thể hoạt động, nhưng nó không tham gia vào tính toán ngân sách lỗi cho hầu hết các UART. UART sẽ yêu cầu một số thời gian tối thiểu sau bit dữ liệu cuối cùng trước cạnh đầu tiếp theo của bit bắt đầu tiếp theo. Đó là những gì thời gian dừng lại dành cho. Khi thời gian này không được đáp ứng, bạn sẽ gặp "lỗi đóng khung". Có lẽ đó được lấy mẫu như một bit dữ liệu, nhưng tôi biết các trường hợp nó được xử lý khác nhau. Các teletype cũ cần 2 bit stop để cho thời gian cơ chế cơ học sẵn sàng lấy ký tự tiếp theo.
Olin Lathrop

Tôi đã đề cập đến bit start ba lần, phải không?
JustJeff

@OlinLathrop: Bit dừng được yêu cầu để đảm bảo rằng khi gửi một byte có MSB bằng 0 sẽ một cạnh giảm cho bit bắt đầu tiếp theo. Các thiết bị khác nhau hoạt động khác nhau trong trường hợp đường dữ liệu xuống thấp trước khi nó được yêu cầu, nhưng nếu không có bit dừng, một chuỗi 0 byte được truyền sẽ không chứa thông tin về thời gian hữu ích. Yêu cầu như vậy có thể được đáp ứng thông qua các phương tiện khác với chi phí đóng khung cố định dưới 25%, nhưng tôi không biết có ai làm như vậy.
supercat

1

Một điểm chưa được đề cập là một số thiết bị dự kiến ​​sẽ truyền một byte dữ liệu cho mỗi byte dữ liệu họ nhận được. Nếu một thiết bị như vậy được cung cấp dữ liệu liên tục, tốc độ truyền của nó thậm chí chậm hơn 0,1% so với thiết bị truyền và nó không có cơ sở để gửi các bit dừng bị co lại một chút, đầu ra của nó sẽ giảm một byte sau mỗi 1000 liên tiếp byte đi vào. Nếu thiết bị bị giới hạn ở 16 byte bộ đệm, nó sẽ giảm một byte dữ liệu sau khi truyền khoảng 16.000 và sẽ giảm khoảng một byte mỗi nghìn sau đó. Đáng lưu ý rằng các modem được gọi là "1200 baud" thực sự hoạt động với tốc độ cao hơn một chút so với 1200 bit / giây (tôi nghĩ rằng đó là khoảng 1202) vì lý do này chính xác (vì vậy ngay cả khi máy phát nhanh hơn 0,15% là,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.