Ví dụ 10.3 Đo điện áp và xuất đến cổng RS232
Trong ví dụ này, có nhiều phức tạp hơn hai ví dụ trước, điện áp đọc bằng cách sử dụng bộ chuyển đổi A/D gửi đến máy tính thông qua cổng nối tiếp. Ví dụ này sử dụng ba tác vụ: Live, Get_voltage, và To_RS232
Task Live chạy mỗi 20 ms, nhấp nháy đèn led kết nối đến port RD7 của vi điều khiển để báo rằng hệ thống đang hoạt động.
Task Get_Voltage đọc kênh 0 của bộ chuyển đổi A/D, nơi kết nối đến nguồn điện áp cần đo. Giá trị đọc sẽ được định dạng và được lưu trong biến. Tác vụ này chạy sau mỗi 2 giây.
Task To_RS232 đọc giá trị điện áp đo được và gửi đến cổng nối tiếp đến máy tính sau mỗi một giây.
Hình 10.12 là sơ đồ khối của ví dụ. Sơ đồ mạch trình bày như hình 10.13. ví dụ sử dụng Vi điều khiển pic 18f8520 và thạch anh 10 MHZ (ta có thể sử dụng các Pic 18F khác). Điện áp cần đo được kết nối đến chân analog AN0 của vi điều khiển. Chân RC6 (chân truyền dữ liệu của port nối tiếp) kết nối đến MAX232 để chuyển mức tín hiệu sau đó truyền đến PC (ví dụ Com1) sử dụng đầu kết nối 9 chân.
Hình 10.12
Hình 10.13
Trong chương trình chính PORTD cấu hình như là port xuất, và các chân được xóa về mức 0, PORT A thiết lập như là ngõ nhập, và cấu hình như là ngõ nhập analog, thiết lập xung clock A/D, chọn kênh AN0, khi đó chạy RTOS bằng cách gọi hàm rtos_run().
Chương trình bao gồm ba tác vụ:
Task Live chạy mỗi 20 ms, nhấp nháy đèn led kết nối đến port RD7 của vi điều khiển để báo rằng hệ thống đang hoạt động.
Task Get_voltage đọc điện áp analoge từ kênh 0 (chân RA0 hay AN0) của vi điều khiển. giá trị khi đó chuyển thành miivoltage bởi nhân cho 5000 và chia cho 1024. Điện áp lưu trữ ở biến toàn cục tên Volts.
Task To_RS232 đọc điện áp lưu ở biến Volts và gửi đến port RS232 bằng cách sử dụng lệnh printf . Kết quả được gửi đến máy tính theo định dạng:
Measuredvoltage = nnnn mV
Ta sử dụng chương trình HyperTerminal chạy trên máy tính để nhận dữ liệu từ vi điều khiển gửi đến
Đoạn chương trình:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// SIMPLE RTOS EXAMPLE - VOLTMETER WITH RS232 OUTPUT
// ---------------------------------------------------------------------------------------
//
// This is a simple RTOS example. Analog voltage to be measured (between 0V
// and +5V) is connected to analog input AN0 of a PIC18F8520 type
// microcontroller. The microcontroller is operated from a 10MHz crystal. In
// addition, an LED is connected to port in RD7 of the microcontroller.
//
// RS232 serial output of the mirocontroller (RC6) is connected to a MAX232
// type RS232 voltage level converter chip. The output of this chip can be
// connected to the serial input of a PC (e.g., COM1) so that the measured
// voltage can be seen on the PC screen.
//
// The program consists of 3 tasks called "live", "Get_voltage", and “To_RS232”.
//
// Task "Live" runs every 200ms and it flashes the LED conencted to port pin
// RD7 of the microcontroller to indicate that the program is running and is
// ready to measure voltages.
//
// task "Get_voltage" reads analog voltage from port AN0 and then converts
// the voltage into millivolts and stores in a variable called Volts.
//
// Task "To_RS232" gets the measured voltage, converts it into a character
// array and then sends to the PC over the RS232 serial line. The serial line
// is configured to operate at 2400 Baud (higher Baud rates can also be used if
// desired).
//
// Programmer: Dogan Ibrahim
// Date: September, 2007
// File: RTOS3.C
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F8520.h>
#device adc=10
#use delay (clock=10000000)
#use rs232(baud=2400,xmit=PIN_C6,rcv=PIN_C7)
unsigned int16 adc_value;
unsigned int32 Volts;
//
// Define which timer to use and minor_cycle for RTOS
//
#use rtos(timer=0, minor_cycle=100ms)
//
// Declare TASK "Live" - called every 200ms
// This task flashes the LED on port RD7
//
#task(rate=200ms, max=1ms)
void Live()
{
output_toggle(PIN_D7); // Toggle RD7 LED
}
//
// Declare TASK "Get_voltage" - called every 10ms
//
#task(rate=2s, max=100ms)
void Get_voltage()
{
adc_value = read_adc(); // Read A/D value
Volts = (unsigned int32)adc_value*5000;
Volts = Volts / 1024; // Voltage in mV
}
//
// Declare TASK "To_RS232" - called every millisecond
//
#task(rate=2s, max=100ms)
void To_RS232()
{
printf("Measured Voltage = %LumV\n\r",Volts); // send to RS232
}
//
// Start of MAIN program
//
void main()
{
set_tris_d(0); // PORTD all outputs
output_d(0); // Clear PORTD
set_tris_a(0xFF); // PORTA all inputs
setup_adc_ports(ALL_ANALOG); // A/D ports
setup_adc(ADC_CLOCK_DIV_32); // A/D clock
set_adc_channel(0); // Select channel 0 (AN0)
delay_us(10);
rtos_run(); // Start RTOS
}
//
#task(rate=200ms, max=1ms)
void Live()
{
output_toggle(PIN_D7); // Toggle RD7 LED
}
//
// Declare TASK "Get_voltage" - called every 10ms
//
#task(rate=2s, max=100ms)
void Get_voltage()
{
adc_value = read_adc(); // Read A/D value
Volts = (unsigned int32)adc_value*5000;
Volts = Volts / 1024; // Voltage in mV
}
//
// Declare TASK "To_RS232" - called every millisecond
//
#task(rate=2s, max=100ms)
void To_RS232()
{
printf("Measured Voltage = %LumV\n\r",Volts); // send to RS232
}
//
// Start of MAIN program
//
void main()
{
set_tris_d(0); // PORTD all outputs
output_d(0); // Clear PORTD
set_tris_a(0xFF); // PORTA all inputs
setup_adc_ports(ALL_ANALOG); // A/D ports
setup_adc(ADC_CLOCK_DIV_32); // A/D clock
set_adc_channel(0); // Select channel 0 (AN0)
delay_us(10);
rtos_run(); // Start RTOS
}
Sử dụng Semaphore:
Chương trình ở trên làm việc và hiển thị điện áp đo lường trên màn hình máy tính. Chương trình có thể cải thiện một chúc bằng cách sử dụng Semaphore để đồng bộ hiển thị điện áp đo lường với bộ lấy mẫu A/D. Hoạt động của chương trình mới được hoạt động như sau:
Chương trình ở trên làm việc và hiển thị điện áp đo lường trên màn hình máy tính. Chương trình có thể cải thiện một chúc bằng cách sử dụng Semaphore để đồng bộ hiển thị điện áp đo lường với bộ lấy mẫu A/D. Hoạt động của chương trình mới được hoạt động như sau:
Biến semaphore (sem) được bật bằng 1 tại lúc bắt đầu chương trình
Task Get_voltage giảm biến semaphore (calls rtos_wait) để task To_RS232 bị khóa (biến semaphore sem=0) và không thể gửi dữ liệu đến PC. Khi lấy mẫu A/D mới đã sẳn sàng biến semaphore được tăng lên (calls rtos_signal) và Task To_RS232 có thể tiếp tục. Khi đó Task To_RS232 gửi điện áp đến PC và tăng biến semaphore để chỉ ra rằng nó có quyền truy cập dưx liệu. Task Get_voltage có thể thực hiện một lấy mẫu mới. Tiến trình lặp đi lặp lại liên tục
Đoạn chương trình:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// SIMPLE RTOS EXAMPLE - VOLTMETER WITH RS232 OUTPUT
// ---------------------------------------------------------------------------------------
//
// This is a simple RTOS example. Analog voltage to be measured (between 0V
// and +5V) is connected to analog input AN0 of a PIC18F8520 type
// microcontroller. The microcontroller is operated from a 10MHz crystal. In
// addition, an LED is connected to port in RD7 of the microcontroller.
//
// RS232 serial output of the mirocontroller (RC6) is connected to a MAX232
// type RS232 voltage level converter chip. The output of this chip can be
// connected to the serial input of a PC (e.g., COM1) so that the measured
// voltage can be seen on the PC screen.
//
// The program consists of 3 tasks called "live", "Get_voltage", and "To_RS232".
//
// Task "Live" runs every 200ms and it flashes the LED connected to port RD7
// of the microcontroller to indicate that the program is running and is ready to
// measure voltages.
//
// task "Get_voltage" reads analog voltage from port AN0 and then converts the
// voltage into millivolts and stores in a variable called Volts.
//
// Task "To_RS232" gets the measured voltage and then sends to the PC over
// the RS232 serial line. The serial line is configured to operate at 2400 Baud
// (higher Baud rates can also be used if desired).
//
// In this modified program, a semaphore is used to synchronize
// the display of the measured value with the A/D samples.
//
// Programmer: Dogan Ibrahim
// Date: September, 2007
// File: RTOS4.C
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F8520.h>
#device adc=10
#use delay (clock=10000000)
#use rs232(baud=2400,xmit=PIN_C6,rcv=PIN_C7)
unsigned int16 adc_value;
unsigned int32 Volts;
int8 sem;
//
// Define which timer to use and minor_cycle for RTOS
//
#use rtos(timer=0, minor_cycle=100ms)
//
// SIMPLE RTOS EXAMPLE - VOLTMETER WITH RS232 OUTPUT
// ---------------------------------------------------------------------------------------
//
// This is a simple RTOS example. Analog voltage to be measured (between 0V
// and +5V) is connected to analog input AN0 of a PIC18F8520 type
// microcontroller. The microcontroller is operated from a 10MHz crystal. In
// addition, an LED is connected to port in RD7 of the microcontroller.
//
// RS232 serial output of the mirocontroller (RC6) is connected to a MAX232
// type RS232 voltage level converter chip. The output of this chip can be
// connected to the serial input of a PC (e.g., COM1) so that the measured
// voltage can be seen on the PC screen.
//
// The program consists of 3 tasks called "live", "Get_voltage", and "To_RS232".
//
// Task "Live" runs every 200ms and it flashes the LED connected to port RD7
// of the microcontroller to indicate that the program is running and is ready to
// measure voltages.
//
// task "Get_voltage" reads analog voltage from port AN0 and then converts the
// voltage into millivolts and stores in a variable called Volts.
//
// Task "To_RS232" gets the measured voltage and then sends to the PC over
// the RS232 serial line. The serial line is configured to operate at 2400 Baud
// (higher Baud rates can also be used if desired).
//
// In this modified program, a semaphore is used to synchronize
// the display of the measured value with the A/D samples.
//
// Programmer: Dogan Ibrahim
// Date: September, 2007
// File: RTOS4.C
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F8520.h>
#device adc=10
#use delay (clock=10000000)
#use rs232(baud=2400,xmit=PIN_C6,rcv=PIN_C7)
unsigned int16 adc_value;
unsigned int32 Volts;
int8 sem;
//
// Define which timer to use and minor_cycle for RTOS
//
#use rtos(timer=0, minor_cycle=100ms)
//
// Declare TASK "Live" - called every 200ms
// This task flashes the LED on port RD7
//
#task(rate=200ms, max=1ms)
void Live()
{
output_toggle(PIN_D7); // Toggle RD7 LED
}
//
// Declare TASK "Get_voltage" - called every 10ms
//
#task(rate=2s, max=100ms)
void Get_voltage()
{
rtos_wait(sem); // decrement semaphore
adc_value = read_adc(); // Read A/D value
Volts = (unsigned int32)adc_value*5000;
Volts = Volts / 1024; // Voltage in mV
rtos_signal(sem); // increment semaphore
}
//
// Declare TASK "To_RS232" - called every millisecond
//
#task(rate=2s, max=100ms)
void To_RS232()
{
rtos_wait(sem); // Decrement semaphore
printf("Measured Voltage = %LumV\n\r",Volts); // Send to RS232
rtos_signal(sem); // Increment semaphore
}
//
// Start of MAIN program
//
void main()
{
set_tris_d(0); // PORTD all outputs
output_d(0); // Clear PORTD
set_tris_a(0xFF); // PORTA all inputs
setup_adc_ports(ALL_ANALOG); // A/D ports
setup_adc(ADC_CLOCK_DIV_32); // A/D clock
set_adc_channel(0); // Select channel 0 (AN0)
delay_us(10);
sem = 1; // Semaphore is 1
rtos_run(); // Start RTOS
}
// Declare TASK "Live" - called every 200ms
// This task flashes the LED on port RD7
//
#task(rate=200ms, max=1ms)
void Live()
{
output_toggle(PIN_D7); // Toggle RD7 LED
}
//
// Declare TASK "Get_voltage" - called every 10ms
//
#task(rate=2s, max=100ms)
void Get_voltage()
{
rtos_wait(sem); // decrement semaphore
adc_value = read_adc(); // Read A/D value
Volts = (unsigned int32)adc_value*5000;
Volts = Volts / 1024; // Voltage in mV
rtos_signal(sem); // increment semaphore
}
//
// Declare TASK "To_RS232" - called every millisecond
//
#task(rate=2s, max=100ms)
void To_RS232()
{
rtos_wait(sem); // Decrement semaphore
printf("Measured Voltage = %LumV\n\r",Volts); // Send to RS232
rtos_signal(sem); // Increment semaphore
}
//
// Start of MAIN program
//
void main()
{
set_tris_d(0); // PORTD all outputs
output_d(0); // Clear PORTD
set_tris_a(0xFF); // PORTA all inputs
setup_adc_ports(ALL_ANALOG); // A/D ports
setup_adc(ADC_CLOCK_DIV_32); // A/D clock
set_adc_channel(0); // Select channel 0 (AN0)
delay_us(10);
sem = 1; // Semaphore is 1
rtos_run(); // Start RTOS
}
Nguồn: http://ytuongnhanh.vn/
No comments:
Post a Comment