Nguyên lý điều khiển và mạch mô phỏng

Một phần của tài liệu Hướng dẫn lập trình AVR rất hay (Trang 58 - 66)

4 Các bài tập ví dụ

4.6.2 Nguyên lý điều khiển và mạch mô phỏng

Nguyên lý điều khiển của bài ví dụ này được cho như hình dưới.

Hình 77: Nguyên lý điều khiển bài ví dụ

Điện áp từ đầu ra mạch phân áp được đưa vào kênh ADC của vi xử lý Atmega16. Khi có tín hiệu bàn phím từ trình Terminal, vi xử lý sẽ đo điện áp đặt vào kênh ADC và gửi giá trị đo được tới trình Terminal.

Từ nguyên lý điều khiển, ta xây dựng mạch mô phỏng như sau.

Hình 78: Mạch mô phỏng trên Proteus

4.6.3 Lập trình cho vi xử lý

a) Xác định yêu cầu làm việc của vi xử lý

Từ đề bài và nguyên lý điều khiển, các chức năng của Atmega16 cần dùng trong ví dụ này là:

 Chức năng ADC.  Chức năng USART.

Chức năng ngắt ngoài sẽ nhận biết tác động nhấn nút của người dùng. Các bước trong chương trình điều khiển như sau.

 Bộ ADC sẽ đo và vi xử lý tính toán giá trị điện áp.

 Vi xử lý lại dùng chức năng USART để truyền giá trị đo được về trình Terminal.

Giá trị điện áp đo được sau khi tính toán có thể là giá trị thập phân với nhiều chữ số sau dấu phẩy, trong khi giá trị cần đo để xử lý (xử lý và vẽ đồ thị trên máy tính…) chỉ cần khoảng 2 chữ số sau dấu phẩy. Vì vậy chỉ cần gửi giá trị điện áp sau khi đã được làm tròn.

Đồng thời trong lập trình vi xử lý, quá trình xử lý các biến có giá trị thập phân (có dấu phẩy) tương đối phức tạp, phải sử dụng kiểu biến tốn bộ nhờ hơn, cũng như nhiều câu lệnh các phép toán và chuỗi…, vì vậy trong ví dụ này sẽ không hiển thị dấu phẩy (ví dụ giá trị 3,25 sẽ được hiển thanh thành 325).

Trong đo đạc thực tế, giá trị “325” ở trên sau khi gửi về máy tính, sẽ được phần mềm xử lý trên máy tính quy đổi về giá trị thực (325 chuyển về 3,25 bằng cách chia cho 100 chẳng hạn). Cách làm này khiến cho việc lập trình trên vi xử lý đơn giản hơn nhiều.

b) Xây dựng thuật toán điều khiển

Từ yêu cầu làm việc của vi xử lý, ta xây dựng thuật toán điều khiển như sau.

Hình 79: Thuật toán của bài ví dụ

Bộ ADC tiến hành đo giá trị điện áp, sau đó giá trị sau khi chuyển về dạng ký tự sẽ được bộ USART truyền tới trình Terminal. Quá trình này lặp đi lặp lại liên tục để đo và gửi giá trị điện áp, như vậy toàn bộ chương trình nằm trong vòng lặp while chính. Việc dừng chương trình trong 0,25s với mục đích để mắt người có thể theo dõi kết quả mô phỏng trên proteus. Trong thực tế đo đạc, chu kỳ đo-chuyển-truyền trên chỉ mất khoảng 10ms.

Lý do phải chuyển giá trị số sang dạng ký tự là vì bộ USART chỉ truyền/nhận dữ liệu dạng các ký tự riêng lẻ, ví dụ như ký tự a, b, c,… ký tự 1, 2, 3…. Chẳng hạn muốn truyền giá trị điện áp 12V về máy tính, trước tiên phải chuyển về dạng ký tự „12‟(gọi là một chuỗi,

„2‟ này về máy tính. Phần mềm xử lý trên máy tính sẽ ghép hai ký tự trên thành một chuỗi,

sau đó chuyển lại thành dạng số.

Hình 80: Quá trình gửi dữ liệu từ vi xử lý về máy tính

c) Chuẩn bị lập trình bằng phần mềm CodeVision

Trong bài ví dụ này chỉ sử dụng chức năng ADC và USART của Atmega16, vì vậy trong bước chuẩn bị chúng ta sẽ kích hoạt và thiết lập ban đầu cho hai chức năng này.

Với chức năng ADC, việc kích hoạt và thiết lập ban đầu được tiến hành giống như trong ví dụ Chuyển đổi ADC, người đọc hãy xem lại và tự tiến hành bước này.

Để kích hoạt và thiết lập chức năng USART, làm như hình sau.

Hình 81: Kích hoạt USART

Trong hộp thoại CodeWizardAVR, chọn mục USART và làm các bước.

1. Để kích hoạt chức năng truyền dữ liệu, click chọnvào ô “Transmitter”. 2. Để chọn tốc độ Baud Rate, click và chọn tốc độ Baud Rate trong ô “Baud

Rate”.

3. Để chọn kiểu khung truyền (Frame), chọn trong ô “Communication Parameters”.

Như trên hình 80, ta thấy trong bài ví dụ kích chỉ sử dụng chức năng truyền dữ liệu của bộ USART.

Giống như trong phần giới thiệu tính năng USART, tốc độ Baud Rate = 9600 và khung truyền 8 Data, 1 Stop, không Parity được chọn như trên hình 80.

d) Viết chương trình điều khiển

Khai báo biến và include các file header

Trong chương trình này dùng các biến sau.

 Biến V kiểu unsigned int, biến này dùng để chứa giá trị điện áp

không có dấu phẩy (đã nhân với 100).  Biến chuoi dạng chuỗi 10 ký tự. Khai báo biến chuoi theo cú pháp sau.

char chuoi[10];

Include các file header sau (nếu phần mềm CodeVision đã include sẵn thì không cần viết thêm vào nữa).

delay.h dùng cho chức năng ngừng chương trình.

stdlib.h dùng cho chức năng chuyển giá trị số thành dạng chuỗi ký tự.

stdio.h dùng cho chức năng USART.

Từ phần xây dựng thuật toán điều khiển, ta thấy rằng toàn bộ chương trình nằm trong vòng lặp while chính có cấu trúc như sau.

Hình 82: Cấu trúc vòng lặp while chính

Đo giá trị điện áp

Sau khi xem bài ví dụ Chuyển đổi ADC, người đọc đã có thể tự viết đoạn code đo giá trị điện áp trên hình 81. Sau khi viết, hãy so sánh với mẫu tham khảo sau.

V = 5*read_adc(0)/10.23;

Chuyển giá trị số thành chuỗi ký tự

Mục đích của đoạn code này là chuyển giá trị số trong biến V thành chuỗi ký tự và chữa trong biễn chuoi. Để chuyển một giá trị nguyên (int) của biến V thành chuỗi ký tự của biến

chuoi, sử dụng dòng lệnh sau.

itoa(V, chuoi);

Truyền chuỗi ký tự qua bộ USART

Để truyền một chuỗi nhiều ký tự (biến chuoi) qua bộ USART, ta dùng hàm puts() sau.

puts(chuoi);

Khi gặp lệnh puts(chuoi); vi xử lý sẽ gửi lần lượt các ký tự trong biến chuoi qua bộ USART như đã trình bày.

Sau khi viết xong, toàn bộ code trong vòng lặp while chính như sau.

Hình 83: Vòng lặp while chính

Khi viết xong, kiểm tra và complie thành công, tiến hành chạy trên mạch mô phỏng. Người đọc hãy nhớ lại rằng trong truyền/nhận USART, thiết bị truyền và nhân phải được thiết lập giống nhau. Từ đầu ví dụ chúng ta mới chỉ thiết lập USART trên vi xử lý, để thiết lập USART trên trình Terminal, mở hộp thoại Edit Component của trình Terminal và chọn các thông số giống với USART trên vi xử lý.

Hình 84: Thiết lập các thông số USART của trình Terminal giống với trên vi xử lý

Sau khi thiết lập trong, chạy mạch mô phỏng, lúc này người đọc sẽ thấy trình Terminal hiển thị kết quả gửi về liên tiếp nhau như sau.

Hình 85: Trình Terminal hiển thị kết quả liên tiếp nhau

Nếu để như hình 84 thì chúng ta không thể theo dõi được kết quả, để dễ theo dõi, hãy lập trình để hiển thị xuống dòng sau mỗi lần gửi một chuỗi ký tự như sau.

Trở lại phần mềm CodeVision, viết thêm một dòng code vào trong vòng lặp while chính như hình dưới.

Hình 86: Vòng lặp wlhie chính sau khi sửa

Ý nghĩa có dòng code: putchar(13); là gửi một ký tự thứ 13 trong bảng mã ASCII

qua bộ USART. Trong bảng mã ASCII, ký tự thứ 13 là “\r”. Khi gặp ký tự này, trình Terminal sẽ xuống dòng.

Sau khi sửa xong, hãy chạy lại mạch mô phỏng trên Proteus, thay đổi giá trị biến trở và quan sát dữ liệu gửi về trên trình Terminal, nếu làm đúng, các giá trị gửi về sẽ được hiển thị như hình sau.

Hình 87: Trình Terminal hiển thị kết quả đo theo các dòng

Tóm tắt

Các kích hoạt và thiết lập USART.

Cách gửi dữ liệu qua USART.

Các khái niệm và chuỗi và hàm sử dụng cho chuỗi.

Mở rộng

Phụ lục

Tên và từ khóa các linh kiện hay dùng trong thư viện Proteus

Tên Từ khóa

Vi xử lý AVR tiny2313, mega16…

Đèn Led led

Led 7 thanh 7seg

Điện trở resistor Tụ điện capacitor Transistor transistor IRF540 IRF540 Biến trở pot-hg Đi-ốt diode Nút bấm button Công tắc switch Đèn lamp

Động cơ SERVO servo

Động cơ bước step

Một số phần tử hay dùng khác trên thanh công cụ của Proteus

Một số cấu trúc lặp, so sánh trong C hay dùng Lệnh If :

- Cú pháp : If ( biểu thức) < lệnh> ;

- Diễn giải : nếu biểu thức đúng ( # 0 )  thực hiện <lệnh>

ngược lại nếu biểu thức sai ( = 0 )  thực hiện lệnh đứng sau câu lệnh if. - Hoặc : If ( biểu thức) <lệnhA>;

else < lệnh B); Biểu thức : # 0 ( đúng)  < lệnh A> =0 ( sai )  < lệnh B>. Lệnh For : - Cú pháp : for ( bt1; bt2 ; bt3) lệnh; - Giải thích :

+ bt1 : là toán tử gán để tạo giá trị ban đầu cho biến điều khiển. + bt2 : biểu thức điều kiện để thực hiện vòng lặp.

+ bt3 : biểu thức tăng giá trị của biến điều khiển của vòng lặp. - Ví dụ: For (i=0; i<=100;i=i+2);

{

Các dòng lệnh A; }

Khi i = 0, thực hiện các lệnh A, sau đó giá trị i được tăng thêm 2 thành i=2. Khi i = 2, thực hiện các lệnh A, sau đó giá trị i được tăng thêm 2 thành i=4. …

Khi i = 100, thực hiện các lệnh A, sau đó giá trị i được tăng thêm 2 thành i=102.

Khi i không còn nhỏ hơn hoặc bằng 100 nữa, bỏ qua không thực hiện các lệnh A. - Cơ chế hoạt động :

a/Tính giá trị của biểu thức bt1 . b/Tính giá trị của bt2

c/ + Nếu giá trị của bt2(=0) là sai máy sẽ ra khỏi lệnh for. + Nếu giá trị của bt2(!=0) là đúng thì máy sẽ thực hiện lệnh.

Lệnh while : - Cú pháp : while ( biểu thức) { Các lệnh A; } - Nguyên tắc thực hiện :

+b1. Tính giá trị của biểu thức.

+b2. Nếu giá trị của biểu thức sai ( = 0 ) thì chương trình ra khỏi vòng while +b3. Nếu giá trị của biểu thức đúng (# 0) thì thực hiện các lệnh A và quay lại bước 1 (b1).

Lệnh switch

- Cú pháp : switch (biểu thức nguyên). { case N1 : lệnh 1; break; case N2 : lệnh 2; break; ... default : lệnh; }

- Biểu thức nguyên là giá trị nguyên : Ni (i=1,2...) là các số nguyên. - Với biểu thức khác với mọi Ni => thực hiện lệnh sau default.

Một phần của tài liệu Hướng dẫn lập trình AVR rất hay (Trang 58 - 66)

Tải bản đầy đủ (PDF)

(66 trang)