Cách tiếp cận tốt để thực hiện nhiều hơn một chức năng quan trọng thời gian bằng cách sử dụng một vi điều khiển?


8

Triết lý hoặc cách tiếp cận được thực hiện để thực hiện các chức năng quan trọng thời gian cao trong vi điều khiển là gì, nếu có?

Tôi đang làm việc trên một dự án liên quan đến việc xuất ra một dạng sóng vuông chính xác với tần số khác nhau. Tôi đã thực hiện điều này bằng cách sử dụng bộ đếm thời gian và chức năng ngắt. Tuy nhiên, ngay cả để thực hiện điều này một cách chính xác, tôi đã phải hiệu chỉnh phần bù cho số chu kỳ đồng hồ được thực hiện trong quy trình dịch vụ ngắt. Tôi tưởng tượng độ chính xác này sẽ bị xáo trộn khi có một dạng sóng khác như vậy chạy cùng (giả sử tần số cần phải thay đổi cùng một lúc). Có một vi điều khiển mỗi, cho mỗi lần chức năng quan trọng như vậy có vẻ lãng phí.

Lấy một ví dụ khác, về việc thực hiện chức năng đồng hồ (như trong hh: mm: ss). Tôi không thể tưởng tượng rằng mọi vi điều khiển / máy tính cấp cao đều có chip đồng hồ thời gian thực chuyên dụng chỉ để theo dõi thời gian. Tuy nhiên, tôi cảm thấy khó có thể tưởng tượng nó được đo chính xác bằng bộ xử lý lõi, đang bận rộn phục vụ rất nhiều chức năng xuất hiện trong các khoảng thời gian không đồng bộ trong thời gian đó. Tôi tưởng tượng việc đếm thời gian sẽ có lỗi bù, sự thay đổi đó tùy thuộc vào các chức năng đang chạy.

Có một quy trình thiết kế hoặc cách tiếp cận để chứa hoặc đưa ra một dung sai cho độ chính xác có thể đạt được? Hoặc có ai có bất kỳ gợi ý hay gợi ý nào về nơi tôi có thể tìm thêm thông tin liên quan đến việc này không?


Những thứ đòi hỏi RTC chính xác thường có một con chip chuyên dụng hoặc chức năng con với sức mạnh và tinh thể riêng của nó, để theo dõi thời gian khi thiết bị được tắt. Thời gian là một rắc rối lớn.
pjc50

Ngừng sử dụng một kiến ​​trúc khủng khiếp như vậy (hoặc bắt đầu sử dụng nó một cách chính xác) - bộ định thời phần cứng không nên phụ thuộc vào thời gian phục vụ ISR - miễn là việc tải lại được thực hiện "đúng lúc", điều đó không thành vấn đề.
Spehro Pefhany

Vi điều khiển gì? Nó sẽ cho phép câu trả lời chất lượng tốt hơn.
StainlessSteelRat

@SpehroPefhany Tôi phải nói rằng, tôi khá thiếu kinh nghiệm trong việc này. Vấn đề tôi gặp phải với sóng vuông là tôi muốn tần số (có thể) thay đổi trên mỗi lần chuyển đổi đầu ra (mà đối với 2 sóng vuông khác nhau sẽ ở các khoảng không đồng bộ và thậm chí có thể trùng nhau). Một sóng vuông là một phần nhỏ hơn của một câu hỏi lớn hơn tôi có trong đầu. Trong quá trình tạo dạng sóng, bạn sẽ triển khai nhiều hơn 1 dạng sóng tương tự tùy ý như thế nào? Sự hy sinh sẽ là một 'tỷ lệ mẫu' chung?
midnightBlue

@StainlessSteelRat Tôi cố tình không chỉ định một vi điều khiển cụ thể vì tôi cảm thấy câu hỏi khá rộng. Đối với tôi, có vẻ như nó có thể áp dụng cho kiến ​​trúc bộ xử lý trong các máy tính lớn thông qua các bộ vi điều khiển. Một phần, tôi muốn biết liệu có bất kỳ tài nguyên nào có sẵn để tìm hiểu về việc tạo ra các thiết kế tốt / hạn chế lỗi khi thực hiện nhiều hơn một chức năng nhạy cảm với thời gian hay không.
midnightBlue

Câu trả lời:


10

Để xuất sóng vuông chính xác, sử dụng phần cứng. Hầu hết các bộ vi điều khiển đều có bộ tạo PWM được tích hợp sẵn có thể làm được điều này. Bạn đặt khoảng thời gian và thời gian theo chu kỳ đồng hồ và phần cứng sẽ làm phần còn lại. Để thay đổi nó thành một tần số mới, hãy viết giai đoạn mới vào thanh ghi thời gian và một nửa thời gian vào thanh ghi chu kỳ nhiệm vụ.

Đối với đồng hồ thời gian thực làm mất thời gian do tải khác của bộ xử lý, nó không hoạt động theo cách đó trừ khi nó được viết rất kém. Nói chung, phần cứng sẽ được sử dụng để tạo ra một ngắt định kỳ có nhiều giây và phần sụn sẽ phân chia xa hơn từ đó. Điều này hoạt động bất kể bộ xử lý bận rộn như thế nào, vì ngắt chạy bất cứ khi nào nó cần. Miễn là thói quen ngắt chiếm một phần nhỏ trong các chu kỳ tổng thể, hầu hết bộ xử lý vẫn được áp dụng cho tác vụ nền trước.

Cũng có những cách để giữ thời gian bằng cách bỏ phiếu ở những khoảng thời gian không xác định. Bạn có phần cứng giữ số đếm và bất cứ khi nào bạn cập nhật đồng hồ, bạn sẽ cập nhật nó dựa trên tổng số tích tắc. Miễn là thói quen này được chạy thường xuyên đủ để bất kỳ bộ đếm nào được sử dụng không bao bọc giữa các lần chạy, không mất thời gian.


Lấy làm tiếc! Tôi nên mở rộng hơn với câu hỏi của tôi. Một sóng vuông chỉ là một ví dụ cụ thể về một ứng dụng quan trọng mà tôi có trong tâm trí. Với phương pháp tạo PWM mà bạn đã đề cập, liệu nó có thể (nếu cần) cập nhật tần số trên mỗi lần chuyển tiếp sóng vuông không? Điều gì nếu bạn phải làm điều này cho hai sóng vuông không đồng bộ? Mười thì sao? Tôi tự hỏi nếu có bất kỳ phương pháp thiết kế chung cho những điều như vậy. Các phương pháp bạn đề cập đến ngắt định kỳ & bỏ phiếu để cập nhật đồng hồ chắc chắn sẽ làm sáng tỏ một số điều.
midnightBlue

1
@mid: Hầu hết các micros có thể làm gián đoạn khi bắt đầu giai đoạn PWM. Một số có các thanh ghi đệm đôi để bạn có thể cập nhật các tham số trong một khoảng thời gian, sau đó chúng có hiệu lực vào đầu giai đoạn tiếp theo. Một số micros có thể cung cấp cho PWM thông qua DMA. Tôi đã sử dụng điều này một lần để có phần cứng tự động để phối màu.
Olin Lathrop

3

Từ khóa ở đây là "hỗ trợ phần cứng". Đối với bất cứ điều gì nghiêm trọng, bạn sẽ cần hỗ trợ phần cứng trong VÒI. Thiết bị ngoại vi tích hợp phổ biến nhất là mạch hẹn giờ chạy tương đối chính xác và không bị nhiễu từ các hoạt động CPU khác.

Dựa vào đó, bạn có thể có nhiều chức năng thực thi với thời gian trung hạn chính xác như nguồn đồng hồ của bộ điều khiển của bạn.

Nhưng: Như bạn có thể đã có kinh nghiệm, bên cạnh độ chính xác trung hạn hoặc dài hạn, cũng luôn có hiện tượng giật hình liên quan đến việc xử lý phần mềm các sự kiện phần cứng (bao gồm cả những thứ như tràn bộ đếm thời gian). Điều này được gây ra bởi các trạng thái thực thi khác nhau có thể xảy ra tại thời điểm một sự kiện xảy ra dẫn đến sự chậm trễ khác nhau cho đến khi phản ứng thực tế với sự kiện có thể xảy ra.

Do đó, điểm mấu chốt là: Đối với bất kỳ điều gì có yêu cầu jitter tốc độ cao hoặc gần bằng không, hỗ trợ phần cứng là điều cần thiết. Nhiều thiết bị ngoại vi phần cứng được bao gồm trong hầu hết các dòngCC, như UART & c, và càng mạnh mẽ và tốn kém thì phần cứng hỗ trợ thường được tích hợp nhiều hơn. Nếu Tập của bạn không cung cấp phần cứng bạn cần, bạn thực sự sẽ phải xem xét phần cứng chuyên dụng bên ngoài cho nhiệm vụ.


Hiểu jitter là chìa khóa - bạn có thể có nhiều bộ định thời phần cứng và tất cả chúng sẽ theo dõi độc lập, nhưng nếu tất cả chúng đều tắt một ngắt cùng một lúc thì không phải tất cả chúng đều có thể được phục vụ cùng một lúc.
pjc50

2

Làm nhiều như bạn có thể với phần cứng, đặc biệt là cho các chức năng quan trọng thời gian cao. Tất cả các bộ vi điều khiển đều có bộ hẹn giờ / bộ đếm được tạo riêng để đếm và các sự kiện thời gian.

Bên cạnh đó, đây thực sự là một câu hỏi rất rộng. Vì vậy, không có câu trả lời tốt.

Câu trả lời đúng duy nhất là kinh nghiệm. Hãy thử nó, hồ sơ nó, nhấn mạnh nó, sửa chữa nó. Bạn phải xác định các khu vực mã với mức độ sử dụng cao. 20% phần mềm chạy 90% thời gian, có nghĩa là mọi lệnh được loại bỏ, cải thiện hiệu suất.

Thiết kế tốt luôn cân bằng giữa phần cứng, phần mềm và bộ nhớ. Điều này áp dụng cho tất cả các bộ vi xử lý, nhưng đặc biệt là vi điều khiển. Tối đa một hoặc sử dụng không hiệu quả một và bạn sẽ có một sản phẩm kém. Khi mật độ silicon tăng lên, ngày càng có nhiều tính năng được bao gồm trong phần cứng của vi điều khiển. Nhưng nhiều tính năng hơn có nghĩa là nhiều kỳ vọng hơn. Bộ nhớ đôi và bạn sẽ thêm một số tính năng sử dụng nó.

Tất cả các ISR đều có chi phí hoạt động, phụ thuộc vào các thanh ghi được sử dụng bởi ISR. Nếu độ trễ để lưu trạng thái máy là đáng kể so với phục vụ ISR cho các chức năng quan trọng trong thời gian cao, thiết kế của bạn có thể không thể mở rộng được. Do đó, sự đồng thuận chung của câu trả lời để sử dụng phần cứng.

Việc sử dụng các ngắt phần mềm có thể làm giảm tình trạng phình to của máy ISR.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

Tất cả các thanh ghi cho Inc_Seconds () phải được đẩy, khi chúng chỉ được sử dụng một lần sau mỗi 150 chu kỳ.

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

Bây giờ, độ trễ đạt được chỉ xảy ra một lần sau mỗi 150 chu kỳ.

Nếu bạn triển khai đồng hồ thời gian thực theo hh: mm: ss, có vấn đề gì không nếu nó tắt 50ms. Không ai sẽ phát hiện ra lỗi. Đây chắc chắn không phải là một mối quan tâm điều hành thời gian thực.

Đối với các sự kiện phải xảy ra cùng một lúc. Phải họ? Nếu họ phải thì thiết kế phần cứng phải chăm sóc nó. Nếu không, một số thỏa hiệp phần mềm phải diễn ra. Nếu bạn không thể đặt hai bit cùng một lúc, thì hãy đặt một bit. Hướng dẫn tiếp theo đặt khác. Độ chính xác một chu kỳ đồng hồ trên các bộ xử lý RISC. Tôi cho rằng điều đó là đủ tốt.


0

Đối với dạng sóng vuông, bạn nên sử dụng một thiết bị ngoại vi PWM được PLLed với XTAL của bạn bằng cách sử dụng một số loại bộ đếm để biết khi nào cần chu kỳ (để đặt số lượng ít). Mỗi bảng dữ liệu sẽ cho bạn biết làm thế nào để làm điều này :)

Để giữ thời gian , vâng, bạn sẽ cần một RTC để thực hiện chính xác trừ khi bạn đi trình biên dịch chương trình biên dịch chương trình và trình biên dịch để bạn biết bằng tay thời gian thực hiện chính xác của mỗi lệnh trong bất kỳ đường dẫn thực thi nào. Nó có lẽ cũng sẽ làm sáng tỏ tuyên bố mới về 'goto được coi là có hại'.


3
Nhận xét của bạn về RTC phần mềm sẽ chỉ áp dụng cho các giải pháp được thực hiện một cách bất cẩn nhất. Một cách lành mạnh và đáng tin cậy để làm điều này là sử dụng bộ đếm thời gian phần cứng để tạo ra một ngắt một lần mỗi 1msec (hoặc 10 msec). Trong thói quen dịch vụ có một biến đếm tĩnh đếm sau đó số lượng ngắt lên tới 1000 (hoặc 100). Khi đạt được số đếm đầy đủ, hãy đặt lại bộ đếm và sau đó tăng bộ đếm giây của bạn. Cứ sau 60 giây, bạn sẽ đặt lại biến số bộ đếm giây trở về 0 và tăng biến số bộ đếm phút của bạn. Mở rộng điều này đến tận tháng và năm nếu cần.
Michael Karas
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.