Mục lục:

Điện áp tương tự siêu nhanh từ Arduino: 10 bước (có hình ảnh)
Điện áp tương tự siêu nhanh từ Arduino: 10 bước (có hình ảnh)

Video: Điện áp tương tự siêu nhanh từ Arduino: 10 bước (có hình ảnh)

Video: Điện áp tương tự siêu nhanh từ Arduino: 10 bước (có hình ảnh)
Video: Top 10 Dự án Arduino HOT nhất 2023 - Tự học lập trình Arduino | Top 10 Arduino projects 2024, Tháng bảy
Anonim
Image
Image

Tài liệu hướng dẫn này chỉ ra cách tạo ra sự thay đổi điện áp tương tự siêu nhanh từ Arduino và một cặp điện trở và tụ điện đơn giản. Một ứng dụng hữu ích là tạo đồ họa trên máy hiện sóng. Có một số dự án khác đã làm được điều này. Johngineer cho thấy một cây thông Noel đơn giản bằng cách sử dụng điều chế độ rộng xung (PWM). Những người khác đã cải thiện dự án đó bằng cách sử dụng thang điện trở hoặc sử dụng chip chuyển đổi kỹ thuật số sang tương tự chuyên dụng.

Sử dụng PWM gây ra nhiều nhấp nháy, trong khi sử dụng thang điện trở hoặc bộ chuyển đổi kỹ thuật số sang tương tự yêu cầu nhiều chân đầu ra hơn và các thành phần có thể không có sẵn. Mạch tôi sử dụng là cùng một cặp điện trở và tụ điện đơn giản đã chết như được sử dụng trong bản demo cây thông Noel, nhưng hoạt động với độ nhấp nháy ít hơn đáng kể.

Đầu tiên, tôi sẽ hướng dẫn bạn quá trình xây dựng mạch. Sau đó, tôi sẽ dạy bạn cách thêm hình ảnh của riêng bạn. Cuối cùng, tôi sẽ giới thiệu lý thuyết về những gì làm cho nó nhanh hơn.

Nếu bạn thích Có thể hướng dẫn này, hãy cân nhắc bỏ phiếu cho nó!:)

Bước 1: Xây dựng mạch

Xây dựng mạch
Xây dựng mạch

Để xây dựng mạch, bạn sẽ cần những thứ sau:

a) Arduino dựa trên ATmega328P Atmel 16MHz, chẳng hạn như Arduino Uno hoặc Arduino Nano.

b) Hai điện trở R có giá trị nhỏ nhất là 150Ω.

c) Hai tụ điện có giá trị C sao cho C = 0,0015 / R, ví dụ:

  • R = 150Ω và C = 10µ
  • R = 1,5kΩ và C = 1µ
  • R = 15kΩ và C = 100nF
  • R = 150kΩ và C = 10nF

Lý do để chọn những giá trị này là hai lần. Trước hết, chúng tôi muốn giữ dòng điện trên các chân của Arduino dưới dòng điện định mức tối đa là 40mA. Sử dụng giá trị 150Ω giới hạn dòng điện ở mức 30mA khi được sử dụng với điện áp nguồn cung cấp cho Arduino là 5V. Giá trị lớn hơn của R sẽ làm giảm dòng điện và do đó có thể chấp nhận được.

Ràng buộc thứ hai là chúng ta muốn giữ cho thời gian không đổi, tích của R và C, bằng khoảng 1,5ms. Phần mềm đã được điều chỉnh cụ thể cho hằng số thời gian này. Mặc dù có thể điều chỉnh các giá trị của R và C trong phần mềm, nhưng có một phạm vi hẹp mà nó sẽ hoạt động, vì vậy hãy chọn các thành phần càng gần với tỷ lệ được đề xuất càng tốt.

Phần lý thuyết sẽ được giải thích cặn kẽ hơn về lý do tại sao hằng số RC lại quan trọng, sau khi tôi đã hướng dẫn các bạn cách lắp ráp mạch biểu diễn.

Bước 2: Thiết lập Máy hiện sóng

Thiết lập Máy hiện sóng
Thiết lập Máy hiện sóng

Trình diễn yêu cầu một máy hiện sóng được đặt ở chế độ X / Y. Các dây dẫn thử nghiệm cần được nối như thể hiện trong sơ đồ. Máy hiện sóng của bạn sẽ khác với máy của tôi, nhưng tôi sẽ hướng dẫn các bước cần thiết để thiết lập chế độ X / Y trên thiết bị của mình:

a) Đặt quét ngang được điều khiển bởi Kênh B (trục X).

b) Đặt máy hiện sóng ở chế độ kênh đôi.

c) Đặt vôn / div trên cả hai kênh để nó có thể hiển thị điện áp từ 0V đến 5V. Tôi đặt của tôi thành 0,5V / div.

d) Đặt chế độ ghép nối thành DC trên cả hai kênh.

e) Điều chỉnh vị trí của X và Y sao cho dấu chấm ở góc dưới bên trái của màn hình khi Arduino tắt nguồn.

Bước 3: Tải xuống và chạy phần mềm

Image
Image

Tải xuống phần mềm từ kho lưu trữ Fast Vector Display For Arduino. Phần mềm được cấp phép theo GNU Affero Public License v3 và có thể được sử dụng và sửa đổi tự do theo các điều khoản của giấy phép đó.

Mở tệp "fast-vector-display-arduino.ino" trong Arduino IDE và tải lên Arduino của bạn. Trong giây lát, bạn sẽ thấy hình ảnh động "Chúc mừng năm mới" trên màn hình máy hiện sóng.

Tôi đã phát triển dự án này dưới dạng hackaton cá nhân trong những tuần trước Giáng sinh, vì vậy, có một thông báo theo chủ đề Giáng sinh và Năm mới mà bạn có thể thấy bằng cách sửa đổi biến PATTERN trong mã.

Bước 4: Tạo bản vẽ tùy chỉnh của riêng bạn

Hiểu tại sao PWM quá chậm
Hiểu tại sao PWM quá chậm

Nếu bạn muốn tạo bản vẽ của riêng mình, bạn có thể dán tọa độ điểm vào bản phác thảo Arduino trên đường xác định USER_PATTERN.

Tôi thấy rằng Inkscape là một công cụ khá tốt để tạo một bản vẽ tùy chỉnh:

  1. Tạo văn bản bằng cách sử dụng phông chữ đậm, lớn, chẳng hạn như Impact.
  2. Chọn đối tượng văn bản và chọn "Object to Path" từ menu "Path".
  3. Chọn các chữ cái riêng lẻ và chồng lên nhau để tạo thành một hình dạng được kết nối
  4. Chọn "Liên hợp" từ menu "Đường dẫn" để kết hợp chúng thành một đường cong duy nhất.
  5. Nếu có lỗ trên bất kỳ chữ cái nào, hãy cắt một vết khía nhỏ bằng cách vẽ một hình chữ nhật bằng công cụ hình chữ nhật và trừ nó khỏi đường bao bằng công cụ "Chênh lệch".
  6. Bấm đúp vào đường dẫn để hiển thị các nút.
  7. Hình chữ nhật chọn tất cả các nút và nhấp vào công cụ "Tạo góc cho các nút đã chọn".
  8. Lưu tệp SVG.

Điều quan trọng là bản vẽ của bạn nên có một đường khép kín duy nhất và không có lỗ. Đảm bảo rằng thiết kế của bạn có ít hơn khoảng 130 điểm.

Bước 5: Dán tọa độ từ tệp SVG vào IDE Arduino

  1. Mở tệp SVG và sao chép các tọa độ. Chúng sẽ được nhúng vào phần tử "đường dẫn". Có thể bỏ qua cặp tọa độ đầu tiên; thay chúng bằng 0, 0.
  2. Dán các tọa độ vào bản phác thảo Arduino bên trong dấu ngoặc ngay sau "#define USER_PATTERN".
  3. Thay thế tất cả các khoảng trắng bằng dấu phẩy, nếu không bạn sẽ gặp lỗi biên dịch. Công cụ "Thay thế & Tìm" có thể hữu ích.
  4. Biên dịch và chạy!
  5. Nếu bạn gặp sự cố, hãy xem bảng điều khiển nối tiếp để biết bất kỳ lỗi nào. Đặc biệt, bạn sẽ thấy thông báo nếu mẫu của bạn có quá nhiều điểm cho bộ đệm bên trong. Trong những trường hợp như vậy, hình ảnh sẽ bị nhấp nháy quá mức.

Bước 6: Hiểu tại sao PWM lại quá chậm

Để bắt đầu, hãy xem lại hoạt động của tụ điện khi nó đang sạc.

Một tụ điện được kết nối với nguồn điện áp Vcc sẽ tăng điện áp của nó theo một đường cong hàm mũ. Đường cong này là tiệm cận, có nghĩa là nó sẽ chậm lại khi tiếp cận điện áp mục tiêu. Đối với tất cả các mục đích thực tế, điện áp là "đủ gần" sau 5 RC giây. RC được gọi là "hằng số thời gian". Như chúng ta đã thấy trước đó, nó là sản phẩm của các giá trị của điện trở và tụ điện trong mạch của bạn. Vấn đề là 5 RC là một thời gian khá dài để cập nhật từng điểm trong màn hình đồ họa. Điều này dẫn đến rất nhiều nhấp nháy!

Khi chúng ta sử dụng điều chế độ rộng xung (PWM) để sạc tụ điện, chúng ta không còn cách nào tốt hơn. Với PWM, điện áp chuyển đổi nhanh chóng giữa 0V và 5V. Trong thực tế, điều này có nghĩa là chúng ta nhanh chóng luân phiên giữa việc đẩy điện tích vào tụ điện và kéo lại một chút điện tích ra ngoài - việc đẩy và kéo này giống như cố gắng chạy marathon bằng cách tiến một bước lớn về phía trước và sau đó lùi lại một chút. lặp đi lặp lại.

Khi bạn tính trung bình tất cả, hoạt động sạc tụ điện bằng PWM hoàn toàn giống như khi bạn sử dụng điện áp ổn định Vpwm để sạc tụ điện. Vẫn mất khoảng 5 RC giây để chúng tôi có được "đủ gần" với điện áp mong muốn.

Bước 7: Đi từ a đến B, nhanh hơn một chút

Đi từ a đến B, nhanh hơn một chút
Đi từ a đến B, nhanh hơn một chút

Giả sử chúng ta có một tụ điện đã được sạc đến Va. Giả sử chúng ta sử dụng analogWrite () để viết ra giá trị mới của b. Khoảng thời gian tối thiểu bạn phải đợi để đạt được hiệu điện thế Vb là bao nhiêu?

Nếu bạn đoán được 5 RC giây, điều đó thật tuyệt! Bằng cách chờ 5 RC giây, tụ điện sẽ được sạc gần Vb. Nhưng nếu chúng ta muốn, chúng ta thực sự có thể đợi ít hơn một chút.

Nhìn vào đường cong điện tích. Bạn thấy đấy, tụ điện đã ở Va khi chúng tôi bắt đầu. Điều này có nghĩa là chúng ta không phải đợi thời gian t_a. Chúng tôi sẽ chỉ phải làm như vậy nếu chúng tôi đang sạc tụ điện từ 0.

Vì vậy, bằng cách không chờ đợi thời gian đó, chúng tôi thấy một sự cải thiện. Thời gian t_ab thực sự ngắn hơn một chút so với 5 RC.

Nhưng chờ đợi, chúng tôi có thể làm tốt hơn nhiều! Nhìn vào tất cả không gian trên v_b. Đó là sự khác biệt giữa Vcc, điện áp tối đa có sẵn cho chúng tôi và Vb mà chúng tôi dự định đạt được. Bạn có thể thấy điện áp tăng thêm đó có thể giúp chúng ta đến nơi chúng ta muốn nhanh hơn nhiều như thế nào không?

Bước 8: Đi từ a đến B, với bộ sạc Turbo

Đi từ a đến B, với bộ sạc Turbo!
Đi từ a đến B, với bộ sạc Turbo!

Đúng rồi. Thay vì sử dụng PWM ở điện áp mục tiêu V_b, chúng tôi giữ nó ở mức Vcc ổn định trong một khoảng thời gian ngắn hơn nhiều. Tôi gọi đây là phương pháp Bộ sạc Turbo và nó đưa chúng ta đến nơi chúng ta muốn thực sự, rất nhanh! Sau khoảng thời gian trễ (mà chúng ta phải tính toán), chúng ta hãm phanh bằng cách chuyển sang PWM tại V_b. Điều này giữ cho điện áp không vượt quá mục tiêu.

Với phương pháp này, có thể thay đổi điện áp trong tụ điện từ V_a sang V_b trong một phần nhỏ thời gian so với chỉ sử dụng PWM. Đây là cách bạn có được địa điểm, em yêu!

Bước 9: Hiểu mã

Hiểu mã
Hiểu mã

Một bức tranh có giá trị bằng một nghìn từ, vì vậy sơ đồ hiển thị dữ liệu và các hoạt động được thực hiện trong mã. Từ trái sang phải:

  • Dữ liệu đồ họa được lưu trữ trong PROGMEM (tức là bộ nhớ flash) dưới dạng danh sách các điểm.
  • Bất kỳ sự kết hợp nào của các phép toán dịch, chia tỷ lệ và quay đều được kết hợp thành một ma trận chuyển đổi affine. Điều này được thực hiện một lần khi bắt đầu mỗi khung hoạt hình.
  • Các điểm được đọc từng điểm một từ dữ liệu đồ họa và mỗi điểm được nhân với ma trận chuyển đổi được lưu trữ.
  • Các điểm đã biến đổi được cung cấp thông qua một thuật toán cắt kéo để cắt bất kỳ điểm nào bên ngoài vùng nhìn thấy.
  • Sử dụng bảng tra cứu độ trễ RC, các điểm được chuyển đổi thành điện áp lái và độ trễ thời gian. Bảng tra cứu độ trễ RC được lưu trữ trong EEPROM và có thể được sử dụng lại cho nhiều lần chạy mã. Khi khởi động, bảng tra cứu RC được kiểm tra độ chính xác và mọi giá trị không chính xác đều được cập nhật. Việc sử dụng EEPROM giúp tiết kiệm bộ nhớ RAM có giá trị.
  • Điện áp lái và độ trễ được ghi vào khung không hoạt động trong bộ đệm khung. Bộ đệm khung chứa không gian cho một khung hoạt động và một khung không hoạt động. Khi một khung hoàn chỉnh được viết, khung không hoạt động sẽ được kích hoạt.
  • Quy trình dịch vụ ngắt liên tục vẽ lại bức tranh bằng cách đọc các giá trị điện áp và độ trễ từ bộ đệm khung hoạt động. Dựa trên các giá trị đó, nó điều chỉnh các chu kỳ làm việc của các chân đầu ra. Bộ định thời 1 được sử dụng để đo thời gian trễ với độ chính xác vài nano giây, trong khi bộ định thời 2 được sử dụng để kiểm soát chu kỳ làm việc của các chân.
  • Chân có điện áp thay đổi lớn nhất luôn ở trạng thái "tăng áp sạc" với chu kỳ làm việc bằng 0 hoặc 100%, cung cấp thời gian sạc hoặc xả nhanh nhất. Chân có điện áp thay đổi ít hơn được điều khiển với chu kỳ làm việc được chọn để phù hợp với thời gian chuyển tiếp của chân đầu tiên - việc khớp thời gian này rất quan trọng để đảm bảo rằng các đường được vẽ thẳng trên máy hiện sóng.

Bước 10: Với tốc độ cao, đi kèm với trách nhiệm lớn

Vì phương thức này nhanh hơn rất nhiều so với PWM, tại sao analogWrite () không sử dụng nó? Chà, bởi vì chỉ sử dụng PWM là đủ tốt cho hầu hết các chương trình và dễ tha thứ hơn rất nhiều. Tuy nhiên, phương pháp "Bộ sạc Turbo" yêu cầu mã hóa cẩn thận và chỉ phù hợp với các trường hợp cụ thể:

  1. Nó cực kỳ nhạy cảm với thời gian. Khi chúng ta đạt đến mức điện áp mục tiêu, chân điều khiển ngay lập tức phải được chuyển sang chế độ PWM thông thường để tránh vượt quá điện áp mục tiêu.
  2. Nó yêu cầu kiến thức về hằng số RC, vì vậy các giá trị này phải được nhập trước. Với các giá trị không chính xác, thời gian sẽ bị sai và điện áp sẽ không chính xác. Với PWM thông thường, có một đảm bảo rằng bạn sẽ ổn định điện áp chính xác sau một thời gian, ngay cả khi hằng số RC không được biết.
  3. Tính toán khoảng thời gian chính xác để sạc tụ điện yêu cầu phương trình logarit quá chậm để tính toán theo thời gian thực trên Arduino. Chúng phải được tính toán trước trước mỗi khung hoạt hình và lưu vào bộ nhớ ở đâu đó.
  4. Các chương trình xử lý theo phương pháp này phải đối mặt với thực tế là độ trễ rất phi tuyến tính (trên thực tế, chúng là cấp số nhân). Điện áp mục tiêu gần Vcc hoặc GND sẽ mất nhiều thứ tự cường độ để đạt được lâu hơn điện áp gần điểm giữa.

Để khắc phục những hạn chế này, mã đồ họa vector của tôi thực hiện những việc sau:

  1. Nó sử dụng Timer 1 ở tần số 16kHz và một quy trình dịch vụ ngắt để định thời và thao tác đầu ra chính xác.
  2. Nó yêu cầu một giá trị cụ thể của hằng số thời gian RC được sử dụng, hạn chế sự lựa chọn của các giá trị tụ điện và điện trở.
  3. Nó lưu trữ thời gian trễ cho tất cả các điểm trong khung hoạt hình trong bộ đệm bộ nhớ. Điều này có nghĩa là quy trình tính toán độ trễ thời gian chạy với tốc độ chậm hơn nhiều so với quy trình dịch vụ ngắt cập nhật các chân đầu ra. Bất kỳ khung nào đã cho có thể được sơn vài chục lần trước khi một loạt các độ trễ mới cho khung tiếp theo sẵn sàng được sử dụng.
  4. Việc sử dụng bộ đệm bộ nhớ đặt ra một hạn chế về số lượng điểm có thể được vẽ trên mỗi khung hình. Tôi sử dụng mã hóa không gian hiệu quả để tận dụng tối đa RAM có sẵn, nhưng nó vẫn bị giới hạn ở khoảng 150 điểm. Hơn một trăm điểm trở lên, dù sao thì màn hình cũng sẽ bắt đầu nhấp nháy, vì vậy đó là một điểm tranh luận!

Đề xuất: