Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

0
425
Đọc điện áp tương tự từ hai chiết áp bằng STM8S 2

Đọc giá trị ADC trên STM8S hiển thị lên LCD : Chúng ta sẽ học cách sử dụng tính năng ADC trên Vi điều khiển STM8S103F3P6 của chúng ta. ADC là một thiết bị ngoại vi rất hữu ích trên vi điều khiển thường được các nhà lập trình nhúng sử dụng để đo các đơn vị luôn thay đổi như điện áp, dòng điện, nhiệt độ, độ ẩm thay đổi, v.v.

Như chúng ta biết “Chúng ta đang sống trong thế giới tương tự với các thiết bị kỹ thuật số”, nghĩa là mọi thứ xung quanh chúng ta như tốc độ gió, cường độ ánh sáng, nhiệt độ và mọi thứ chúng ta xử lý như tốc độ, vận tốc, áp suất, v.v. đều có bản chất tương tự. Nhưng bộ vi điều khiển và bộ vi xử lý của chúng tôi là thiết bị kỹ thuật số và chúng sẽ không thể đo các thông số này nếu không có một thiết bị ngoại vi quan trọng được gọi là Bộ chuyển đổi tương tự sang số (ADC) . Vì vậy, trong bài viết này, chúng ta cùng tìm hiểu cách sử dụng ADC trên Vi điều khiển STM8S với trình biên dịch COMIC C.

Linh kiện cần có

Trong bài viết này, chúng ta sẽ đọc hai giá trị điện áp tương tự từ hai chiết áp và hiển thị giá trị ADC của nó trên màn hình LCD 16×2. Để làm điều này, chúng ta sẽ cần các thành phần sau.

  • Bảng phát triển STM8S103F3P6
  • Lập trình viên ST-Link V2
  • LCD 16×2
  • Chiết áp
  • Kết nối dây
  • Điện trở 1k

ADC trên STM8S103F3P6

Có nhiều loại ADC và mỗi vi điều khiển có thông số kỹ thuật riêng. Trên STM8S103F3P6, chúng tôi có một bộ ADC với độ phân giải 5 kênh và 10 bit;  với độ phân giải 10-bit, chúng ta sẽ có thể đo giá trị số từ 0 đến 1024 và ADC 5 kênh cho biết rằng chúng ta có 5 chân trên Vi điều khiển có thể hỗ trợ ADC, 5 chân này được đánh dấu trong hình dưới đây.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Như bạn có thể thấy, tất cả năm chân này (AIN2, AIN3, AIN4, AIN5 và AIN6) được ghép với các thiết bị ngoại vi khác, có nghĩa là ngoài việc chỉ hoạt động như một chân ADC, các chân này cũng có thể được sử dụng để thực hiện các giao tiếp khác như ví dụ , chân 2 và 3 (AIN5 và AIN 6) không chỉ có thể được sử dụng cho ADC mà còn có thể được sử dụng cho giao tiếp nối tiếp và các chức năng GPIO. Lưu ý rằng sẽ không thể sử dụng cùng một chân cho cả ba mục đích, vì vậy nếu chúng ta đang sử dụng hai chân này cho ADC, thì chúng ta sẽ không thể thực hiện giao tiếp nối tiếp. Các đặc điểm ADC quan trọng khác cho STM8S103P36 có thể được tìm thấy trong bảng dưới đây lấy từ biểu dữ liệu.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Trong bảng trên, Vdd đại diện cho điện áp hoạt động và Vss đại diện cho đất. Vì vậy, trong trường hợp của chúng tôi trên bảng phát triển của chúng tôi, chúng tôi có bộ vi điều khiển hoạt động trên 3.3V, bạn có thể kiểm tra sơ đồ mạch bảng phát triển ngay từ  đầu với hướng dẫn STM8S . Với điện áp hoạt động là 3,3V, tần số đồng hồ ADC của chúng tôi có thể được đặt từ 1 đến 4MHz và phạm vi điện áp chuyển đổi của chúng tôi là từ 0V đến 3,3V. Điều này có nghĩa là ADC 10-bit của chúng tôi sẽ đọc 0 khi 0V (Vss) được cung cấp và sẽ đọc tối đa 1024 khi cung cấp 3,3V (Vdd). Chúng ta có thể dễ dàng thay đổi 0-5V này bằng cách thay đổi điện áp hoạt động của MCU nếu được yêu cầu.  

Sơ đồ mạch để đọc giá trị ADC trên STM8S và hiển thị trên màn hình LCD

Sơ đồ mạch hoàn chỉnh được sử dụng trong dự án này được đưa ra dưới đây, nó rất giống với hướng dẫn về LCD STM8S mà chúng ta đã thảo luận trước đây.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Như bạn có thể thấy, các thành phần bổ sung duy nhất ngoài màn hình LCD là hai chiết áp POT_1 và POT_2 . Các chậu này được kết nối với các cổng PC4 và PD6, là các chân ANI2 và ANI6 như đã thảo luận trên hình ảnh sơ đồ trước đó.

Chiết áp được kết nối theo cách mà khi chúng ta thay đổi nó, chúng ta sẽ nhận được 0-5 V trên các chân tương tự của chúng ta. Chúng tôi sẽ lập trình bộ điều khiển của mình để đọc điện áp tương tự này ở giá trị kỹ thuật số (0 đến 1024) và hiển thị nó trên màn hình LCD. Sau đó, chúng tôi cũng sẽ tính toán giá trị điện áp tương đương và hiển thị nó trên màn hình LCD, hãy nhớ rằng bộ điều khiển của chúng tôi được cung cấp bởi 3.3V, vì vậy ngay cả khi chúng tôi cung cấp 5V cho chân ADC, nó sẽ chỉ có thể đọc từ 0V đến 3.3V .

Sau khi kết nối xong, phần cứng của tôi trông giống như hình dưới đây. Bạn có thể thấy hai chiết áp ở bên phải và bộ lập trình liên kết ST ở bên trái.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Thư viện ADC cho STM8S103F3P6

Để lập trình cho các chức năng ADC trên STM8S, chúng tôi sẽ sử dụng trình biên dịch Cosmic C cùng với các thư viện SPL. Nhưng để làm cho các quy trình dễ dàng hơn, tôi đã tạo một tệp tiêu đề khác có thể được tìm thấy trên GitHub bằng liên kết bên dưới.

Thư viện ADC cho STM8S103F3P6 : https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/inc/stm8s103_ADC.h

Nếu bạn biết mình đang làm gì, bạn có thể tạo tệp tiêu đề bằng cách sử dụng mã trên và thêm tệp đó vào thư mục “bao gồm tệp” trên trang dự án của bạn. Ngoài ra, hãy làm theo phần bắt đầu với hướng dẫn STM8S để biết cách thiết lập môi trường lập trình và trình biên dịch của bạn. Khi thiết lập của bạn đã sẵn sàng, IDE của bạn phải có các tệp tiêu đề sau, ít nhất là những tệp được bao quanh bằng màu đỏ.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Tệp tiêu đề trên bao gồm một hàm có tên là ADC_Read () . Hàm này có thể được gọi trong chương trình chính của bạn để lấy giá trị ADC tại bất kỳ chân nào. Ví dụ: ADC_Read (AN2) sẽ trả về giá trị ADC trên chân AN2. Chức năng được hiển thị bên dưới.

unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) 
 { 
   unsigned int result = 0; 
 ADC1_DeInit (); 
 ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, 
             ADC_Channel_Number, 
             ADC1_PRESSEL_FCPU_D18, 
             ADC1_EXTTRIG_TIM, 
             DISABLE, 
             ADC1_ALIGN_RIGHT, 
             ADC1_SCHMITTTRIG_ALL, 
             DISABLE); 
   ADC1_Cmd (BẬT); 
ADC1_StartConversion (); 
while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); 
  kết quả = ADC1_GetConversionValue (); 
  ADC1_ClearFlag (ADC1_FLAG_EOC); 
ADC1_DeInit ();

Như bạn thấy, chúng ta có thể chuyển tám tham số cho hàm này và điều này xác định cách ADC được cấu hình. Trong mã thư viện của chúng tôi ở trên, chúng tôi đã đặt chế độ chuyển đổi thành liên tục và sau đó nhận số kênh được truyền vào một tham số. Và sau đó, chúng tôi phải đặt tần số CPU của bộ điều khiển của mình, theo mặc định (nếu bạn chưa kết nối tinh thể bên ngoài), STM8S của bạn sẽ hoạt động với bộ dao động nội bộ 16Mhz. Vì vậy, chúng tôi đã đề cập “ ADC1_PRESSEL_FCPU_D18 ” làm giá trị tỷ lệ trước. Bên trong hàm này, chúng tôi đang sử dụng các phương thức khác được định nghĩa bởi tệp tiêu đề SPL stm8s_adc1.h . Chúng ta bắt đầu bằng cách Khử khởi tạo các chân ADC và sau đó là ADC1_Init () để khởi tạo ngoại vi ADC. Định nghĩa của chức năng này từ hướng dẫn sử dụng SPL được hiển thị bên dưới.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Tiếp theo, chúng tôi đặt trình kích hoạt bên ngoài bằng cách sử dụng bộ hẹn giờ và tắt trình kích hoạt bên ngoài vì chúng tôi sẽ không sử dụng nó ở đây. Và sau đó, chúng tôi có căn chỉnh được đặt ở bên phải và hai tham số cuối cùng được sử dụng để đặt kích hoạt Schmitt, nhưng chúng tôi sẽ tắt nó trong hướng dẫn này. Vì vậy, nói ngắn gọn, chúng tôi sẽ ADC của chúng tôi làm việc ở chế độ chuyển đổi liên tục trên chân ADC được yêu cầu với trình kích hoạt bên ngoài và trình kích hoạt Schmitt bị vô hiệu hóa. Bạn có thể kiểm tra biểu dữ liệu nếu bạn cần thêm thông tin về cách sử dụng tùy chọn trình kích hoạt bên ngoài hoặc trình kích hoạt Schmitt, chúng tôi sẽ không thảo luận về điều đó trong hướng dẫn này.

Code STM8S Đọc giá trị ADC trên STM8S

Bạn có thể tìm thấy mã hoàn chỉnh được sử dụng trong tệp main.c ở cuối trang này. Sau khi thêm các tệp tiêu đề và tệp nguồn bắt buộc, bạn sẽ có thể biên dịch trực tiếp tệp chính. Giải thích về mã trong tệp chính như sau. Tôi sẽ không giải thích chương trình LCD STM8S vì chúng ta đã thảo luận về điều đó trong hướng dẫn trước.   

Mục đích của mã sẽ là đọc các giá trị ADC từ hai chân và chuyển đổi nó thành giá trị điện áp. Chúng tôi cũng sẽ hiển thị cả giá trị ADC và giá trị Điện áp trên màn hình LCD. Vì vậy, tôi đã sử dụng một hàm có tên LCD_Print Var nhận một biến ở định dạng số nguyên và chuyển đổi nó thành một ký tự để hiển thị trên màn hình LCD. Chúng tôi đã sử dụng các toán tử mô đun đơn giản (%) và chia (/) để lấy từng chữ số từ biến và đặt vào các biến như d1, d2, d3 và d4 như hình dưới đây. Sau đó, chúng ta có thể sử dụng hàm LCD_Print_Char để hiển thị các ký tự này trên màn hình LCD.

void LCD_Print_Var (int var) 
{ 
char d4, d3, d2, d1; 
d4 = var% 10 + '0'; 
d3 = (var / 10)% 10 + '0'; 
d2 = (var / 100)% 10 + '0'; 
d1 = (var / 1000) + '0'; 
Lcd_Print_Char (d1); 
Lcd_Print_Char (d2); 
Lcd_Print_Char (d3); 
Lcd_Print_Char (d4); 
}

Tiếp theo trong hàm main, chúng ta có bốn biến được khai báo. Hai trong số chúng được sử dụng để lưu giá trị ADC (0 đến 1024) và hai trong số đó được sử dụng để lấy giá trị điện áp thực tế.

unsigned int ADC_value_1 = 0; 
unsigned int ADC_value_2 = 0; 
int ADC_voltage_1 = 0; 
int ADC_voltage_2 = 0;

Tiếp theo, chúng ta phải chuẩn bị các chân GPIO và cấu hình đồng hồ để đọc điện áp tương tự. Ở đây chúng ta sẽ đọc điện áp tương tự từ các chân AIN2 và AIN6 lần lượt là các chân PC4 và PD6. Chúng ta phải xác định các pin này ở trạng thái thả nổi như hình dưới đây. Chúng tôi cũng sẽ kích hoạt thiết bị ngoại vi đồng hồ cho ADC.

CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE); //Enable Peripheral Clock for ADC
GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);

Bây giờ các chân đã sẵn sàng, chúng ta phải đi vào vòng lặp while vô hạn để đọc điện áp tương tự. Vì chúng tôi có tệp tiêu đề của mình, chúng tôi có thể dễ dàng đọc điện áp tương tự từ các chân AIN2 và AIN 6 bằng cách sử dụng các dòng dưới đây.

ADC_value_1 = ADC_Read (AIN2); 
ADC_value_2 = ADC_Read (AIN6);

Bước tiếp theo là chuyển đổi số đọc ADC này (0 đến 1023) thành điện áp tương tự. Bằng cách này, chúng ta có thể hiển thị giá trị điện áp chính xác được cung cấp cho chân AIN2 và AIN6. Các công thức tính điện áp tương tự có thể được đưa ra bởi-

Analog Voltage  = ADC Reading * (3300/1023)

Trong trường hợp của chúng tôi trên bộ điều khiển STM8S103F3, chúng tôi có ADC với độ phân giải 10-bit, vì vậy chúng tôi đã sử dụng 1023 (2 ^ 10) . Cũng trong quá trình phát triển của chúng tôi, bộ điều khiển có 3.3V là 3300, vì vậy chúng tôi chia 3300 cho 1023 trong công thức trên. Khoảng 3300/1023 sẽ cho chúng ta 3,226, vì vậy trong chương trình của chúng ta, chúng ta có các dòng sau để đo điện áp ADC thực tế bằng cách sử dụng điện áp ADC.

ADC_voltage_1 = ADC_value_1 * (3.226); //(3300/1023 =~ 3.226)convert ADC value 1 to 0 to 3300mV
ADC_voltage_2 = ADC_value_2 * (3.226);  //convert ADC value 1 to 0 to 3300mV

Phần còn lại của mã chỉ được sử dụng để hiển thị bốn giá trị này trên màn hình LCD. Chúng tôi cũng có độ trễ 500ms để màn hình LCD được cập nhật sau mỗi 500mS. Bạn có thể giảm điều này hơn nữa nếu bạn cần cập nhật nhanh hơn.

Đọc điện áp tương tự từ hai chiết áp bằng STM8S

Biên dịch mã và tải nó lên bảng phát triển của bạn. Nếu bạn gặp bất kỳ lỗi biên dịch nào, hãy đảm bảo rằng bạn đã thêm tất cả các tệp tiêu đề và tệp nguồn như đã thảo luận trước đó. Sau khi mã được tải lên, bạn sẽ thấy một thông báo chào mừng nhỏ có nội dung “ADC trên STM8S” và sau đó bạn sẽ thấy màn hình bên dưới.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Giá trị D1 và D2 ​​cho biết giá trị ADC từ chân Ain2 và AIN6 tương ứng. Ở phía bên phải, chúng tôi cũng có các giá trị điện áp tương đương được hiển thị. Giá trị này phải bằng điện áp xuất hiện trên chân AIN2 và AIN6 tương ứng. Chúng ta có thể kiểm tra giống nhau bằng cách sử dụng đồng hồ vạn năng, chúng ta cũng có thể thay đổi chiết áp để kiểm tra xem giá trị điện áp cũng thay đổi tương ứng.

 Đọc giá trị ADC trên STM8S hiển thị lên LCD sử dụng Cosmic C Compiler

Hoàn thành công việc cũng có thể được tìm thấy trong video dưới đây. Hy vọng bạn thích hướng dẫn và học được điều gì đó hữu ích, nếu bạn có bất kỳ câu hỏi nào, hãy để lại chúng trong phần bình luận bên dưới. Bạn cũng có thể sử dụng diễn đàn của chúng tôi  để bắt đầu thảo luận hoặc đăng các câu hỏi kỹ thuật khác.

 
CODE
/* Tutorial Number 5 - ADC on STM8S
 * website: mobitool.net
 * Code by: Aswinth Raj
 */
 /*LCD --> STM8s
 * LCD_RS --> PA1
 * LCD_EN --> PA2
 * LCD_DB4 --> PD1
 * LCD_DB5 --> PD2
 * LCD_DB6 --> PD3
 * LCD_DB7 --> PD4
 */
 #define LCD_RS     GPIOA, GPIO_PIN_1
 #define LCD_EN     GPIOA, GPIO_PIN_2
 #define LCD_DB4    GPIOD, GPIO_PIN_1
 #define LCD_DB5    GPIOD, GPIO_PIN_2
 #define LCD_DB6    GPIOD, GPIO_PIN_3
 #define LCD_DB7    GPIOD, GPIO_PIN_4
 #include "STM8S.h"
 #include "stm8s103_LCD_16x2.h"
 #include "stm8s103_adc.h"
void LCD_Print_Var (int var)
{
char d4,d3,d2,d1;
d4 = var%10 + '0';
d3 = (var/10)%10 + '0';
d2 = (var/100)%10 + '0';
d1 = (var/1000) + '0';
Lcd_Print_Char(d1);
Lcd_Print_Char(d2);
Lcd_Print_Char(d3);
Lcd_Print_Char(d4);
}
void main()
{
//Variable declarations
unsigned int ADC_value_1 = 0;
unsigned int ADC_value_2 = 0;
int ADC_voltage_1 = 0;
int ADC_voltage_2 = 0;
Lcd_Begin();
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ADC on STM8S");
CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE); //Enable Peripheral Clock for ADC
GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
delay_ms(5000);
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Print_String("D1:    ->     mV");
Lcd_Set_Cursor(2,1);
Lcd_Print_String("D2:    ->     mV");
while (1)
{
ADC_value_1 = ADC_Read (AIN2);
ADC_value_2 = ADC_Read (AIN6);
ADC_voltage_1 = ADC_value_1 * (3.226); //(3300/1023 =~ 3.226)convert ADC value 1 to 0 to 3300mV
ADC_voltage_2 = ADC_value_2 * (3.226);  //convert ADC value 1 to 0 to 3300mV
Lcd_Set_Cursor(1,4);
LCD_Print_Var (ADC_value_1);
Lcd_Set_Cursor(1,11);
LCD_Print_Var (ADC_voltage_1);
Lcd_Set_Cursor(2,4);
LCD_Print_Var (ADC_value_2);
Lcd_Set_Cursor(2,11);
LCD_Print_Var (ADC_voltage_2);
delay_ms(500);
}
}
 

LEAVE A REPLY

Please enter your comment!
Please enter your name here